@ai-matrx/content-ir 0.18.2 → 0.18.4

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/offsets.ts","../source/constants.ts","../source/fence-nesting.ts","../source/code-ranges.ts","../source/math-pairs.ts","../source/math.ts","../source/xml-tag.ts","../source/tokenize.ts","../source/splice.ts"],"names":["scan","oldCursor","newCursor"],"mappings":"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","file":"source.js","sourcesContent":["/**\n * UTF-16 ⇄ code-point offset conversion.\n *\n * JavaScript strings are indexed in UTF-16 code units; Postgres `position()`,\n * `substring()` and `length()` count code points. Every offset this module\n * emits is given in BOTH units so an anchor captured on either side of the\n * wire can be mapped without re-deriving the text.\n */\n\n/** Indexes the surrogate pairs of one text so conversion is O(log pairs). */\nexport interface CodePointIndex {\n /** Code-point offset of a UTF-16 offset. */\n toCodePoint(utf16: number): number;\n /** UTF-16 offset of a code-point offset. */\n toUtf16(codePoint: number): number;\n /** Code-point length of the text. */\n readonly lengthCp: number;\n}\n\nfunction isHigh(code: number): boolean {\n return code >= 0xd800 && code <= 0xdbff;\n}\nfunction isLow(code: number): boolean {\n return code >= 0xdc00 && code <= 0xdfff;\n}\n\n/** True when `offset` sits between the two halves of a surrogate pair. */\nexport function splitsSurrogatePair(text: string, offset: number): boolean {\n if (offset <= 0 || offset >= text.length) return false;\n return isHigh(text.charCodeAt(offset - 1)) && isLow(text.charCodeAt(offset));\n}\n\nexport function buildCodePointIndex(text: string): CodePointIndex {\n // UTF-16 offsets of every high surrogate that starts a valid pair.\n const pairStarts: number[] = [];\n for (let i = 0; i < text.length - 1; i++) {\n if (isHigh(text.charCodeAt(i)) && isLow(text.charCodeAt(i + 1))) {\n pairStarts.push(i);\n i++;\n }\n }\n\n /** Number of pair starts strictly less than `limit`. */\n const countBelow = (limit: number): number => {\n let lo = 0;\n let hi = pairStarts.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if ((pairStarts[mid] as number) < limit) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n };\n\n const toCodePoint = (utf16: number): number => {\n // Every pair fully before `utf16` counts one code unit too many; a pair\n // whose low half sits exactly at `utf16 - 1` is also fully before it.\n return utf16 - countBelow(utf16 - 1);\n };\n\n const toUtf16 = (codePoint: number): number => {\n // Smallest u with toCodePoint(u) >= codePoint, walked by pair count.\n let lo = 0;\n let hi = pairStarts.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n // Code point of the pair start `pairStarts[mid]`.\n const start = pairStarts[mid] as number;\n if (start - mid < codePoint) lo = mid + 1;\n else hi = mid;\n }\n return codePoint + lo;\n };\n\n return {\n toCodePoint,\n toUtf16,\n lengthCp: text.length - pairStarts.length,\n };\n}\n\n/** One-shot conversion; build an index when converting many offsets. */\nexport function toCodePointOffset(text: string, utf16: number): number {\n return buildCodePointIndex(text).toCodePoint(utf16);\n}\n\n/** One-shot conversion; build an index when converting many offsets. */\nexport function toUtf16Offset(text: string, codePoint: number): number {\n return buildCodePointIndex(text).toUtf16(codePoint);\n}\n","/**\n * The protected-construct vocabulary the source tokenizer recognises.\n *\n * Each list mirrors a live list in matrx-frontend's renderer splitter\n * (`content-splitter-v2.ts`) or its raw-HTML sanitizer (`rehypeSafeRawHtml.ts`);\n * the source is named on every constant. Inventory:\n * common-docs `projects/rich-content-unification/evidence/r2-protected-syntax.md`.\n */\n\n/** `XML_TAG_BLOCKS` — line-leading, attribute-less XML regions. */\nexport const XML_TAG_BLOCK_NAMES: readonly string[] = [\n \"thinking\",\n \"think\",\n \"reasoning\",\n \"info\",\n \"task\",\n \"database\",\n \"private\",\n \"plan\",\n \"event\",\n \"tool\",\n \"questionnaire\",\n \"flashcards\",\n \"cooking_recipe\",\n \"timeline\",\n \"progress_tracker\",\n \"troubleshooting\",\n \"resources\",\n \"research\",\n];\n\n/** The thinking family — the only XML regions recognised mid-line and as orphan closers. */\nexport const THINKING_FAMILY: readonly string[] = [\"thinking\", \"think\", \"reasoning\"];\n\n/** `ATTRIBUTE_XML_BLOCKS` — attribute-bearing XML, also detected mid-line. */\nexport const ATTRIBUTE_XML_NAMES: readonly string[] = [\n \"decision\",\n \"artifact\",\n \"editor_error\",\n \"editor_code_snippet\",\n \"audiocite\",\n];\n\nexport const KNOWN_XML_TAG_NAMES: ReadonlySet<string> = new Set([\n ...XML_TAG_BLOCK_NAMES,\n ...ATTRIBUTE_XML_NAMES,\n]);\n\n/** `ALLOWED_RAW_HTML_TAGS` (rehypeSafeRawHtml.ts) — raw HTML the renderer honours. */\nexport const ALLOWED_RAW_HTML_TAGS: ReadonlySet<string> = new Set([\n \"img\", \"a\", \"br\", \"hr\", \"span\", \"p\", \"strong\", \"b\", \"em\", \"i\", \"u\", \"s\",\n \"del\", \"ins\", \"sup\", \"sub\", \"mark\", \"kbd\", \"abbr\", \"small\", \"code\", \"pre\",\n \"ul\", \"ol\", \"li\", \"blockquote\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\",\n \"table\", \"thead\", \"tbody\", \"tfoot\", \"tr\", \"th\", \"td\", \"caption\",\n \"colgroup\", \"col\", \"figure\", \"figcaption\",\n]);\n\n/**\n * CommonMark HTML-block type 6 names within the allow-list: a line opening\n * with one of these starts an HTML block that runs to the next blank line.\n */\nexport const HTML_BLOCK_LEVEL_TAGS: ReadonlySet<string> = new Set([\n \"p\", \"hr\", \"ul\", \"ol\", \"li\", \"blockquote\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\",\n \"h6\", \"table\", \"thead\", \"tbody\", \"tfoot\", \"tr\", \"th\", \"td\", \"caption\",\n \"colgroup\", \"col\", \"figure\", \"figcaption\",\n]);\n\n/** `SPECIAL_CODE_LANGUAGES` — fence languages the renderer promotes to kinds. */\nexport const SPECIAL_CODE_LANGUAGES: ReadonlySet<string> = new Set([\n \"transcript\", \"tasks\", \"structured_info\", \"questionnaire\", \"flashcards\",\n \"cooking_recipe\", \"mermaid\", \"svg\", \"chart\", \"map\", \"stats\", \"diff\",\n \"html\", \"react\", \"matrx\",\n]);\n\n/** `CODE_LANGUAGE_ALIASES`. */\nexport const CODE_LANGUAGE_ALIASES: Readonly<Record<string, string>> = {\n mmd: \"mermaid\",\n jsx: \"react\",\n tsx: \"react\",\n};\n\n/** `JSON_BLOCK_PATTERNS` root keys → typed JSON block type. */\nexport const TYPED_JSON_ROOT_KEYS: Readonly<Record<string, string>> = {\n quiz_title: \"quiz\",\n presentation: \"presentation\",\n decision_tree: \"decision_tree\",\n comparison: \"comparison_table\",\n diagram: \"diagram\",\n math_problem: \"math_problem\",\n item_presentation: \"item_presentation\",\n name: \"schema_proposal\",\n};\n\n/** Box-drawing glyphs that mark a tree diagram (`TREE_CHARS`). */\nexport const TREE_GLYPHS = /[├└│┌┐┘┬┴┤┼─]/;\n\n/** A pinned annotation anchor (STORE-DESIGN §3.19): `<!--@a:k3f9-->`. */\nexport const PINNED_ANCHOR_RE = /^<!--@a:([A-Za-z0-9_-]+)-->$/;\n\n/** remarkMatrxVariable's strict variable token. */\nexport const STRICT_VARIABLE_RE = /^\\{\\{([a-zA-Z_][a-zA-Z0-9_.]*)\\}\\}$/;\n\n/** remarkMatrxCite's citation marker, anchored at the cursor. */\nexport const CITE_RE = /^<matrxcite\\s+n=\"(\\d+)\"\\s*\\/>/;\n\nexport function normalizeFenceLanguage(language: string): string {\n const lower = language.toLowerCase();\n return CODE_LANGUAGE_ALIASES[lower] ?? lower;\n}\n","// ─────────────────────────────────────────────────────────────────────────\n// THE ONE NESTED-FENCE RULE for a ```markdown / ```md / ```mdx fence.\n//\n// Source of truth (moved here from matrx-frontend\n// components/markdown-core/fence-nesting.ts, 2026-09-25). Consumers: the\n// source tokenizer (source/tokenize.ts), matrx-frontend's static splitter and\n// live StreamBlockAccumulator, and — by conformance, since Python cannot\n// import this — aidream matrx-ai `processing/blocks/fence_nesting.py`, which\n// runs the SAME generated vectors (`__tests__/fence-nesting-vectors.json`,\n// byte-identical copy at packages/matrx-ai/tests/fixtures/).\n//\n// Models write a markdown document inside a ```markdown fence and put their\n// own ```python … ``` blocks inside it with the SAME three backticks. Under\n// strict CommonMark the first inner bare ``` closes the outer fence: the\n// document ends mid-way, the rest leaks out as prose, and the outer closing\n// ``` opens a phantom code block that swallows everything after it.\n//\n// The rule, for MARKDOWN-language fences only (every other language keeps\n// strict CommonMark — a ```bash heredoc is code, not a document):\n// - a fence line WITH an info string (```python) opens a nested fence;\n// - a bare fence line (``` with at least the opener's tick count) closes\n// the innermost nested fence while one is open, and closes the outer\n// fence only when none is;\n// - a longer outer fence (````markdown) keeps working exactly as before —\n// an inner ``` is shorter than the opener, so it is plain content;\n// - if the text ENDS with a nested fence still open, the extraction is\n// redone under strict CommonMark (an unclosed inner fence must not eat\n// the outer closer and the rest of the message).\n// ─────────────────────────────────────────────────────────────────────────\n\n/** Fence languages whose body is itself a markdown document. */\nexport const NESTING_FENCE_LANGUAGES: ReadonlySet<string> = new Set([\n \"markdown\",\n \"md\",\n \"mdx\",\n]);\n\n/** True when a fence opened with this info-string language nests inner fences. */\nexport function fenceNestsInnerFences(language: string | undefined | null): boolean {\n return !!language && NESTING_FENCE_LANGUAGES.has(language.toLowerCase());\n}\n\nexport type InnerFenceLine =\n /** Not a fence line — ordinary content of the outer fence. */\n | \"content\"\n /** ```lang inside a markdown fence — content, and one level deeper. */\n | \"open-nested\"\n /** Bare ``` that closes the innermost nested fence — content, one level up. */\n | \"close-nested\"\n /** Bare ``` that closes the OUTER fence. */\n | \"close-outer\";\n\n/**\n * Classify one line inside an open backtick fence, already trimmed with\n * {@link trimFenceLine} (never a language's own `trim()`).\n *\n * @param trimmed the line with surrounding whitespace removed\n * @param openTicks backtick count of the outer fence's opener\n * @param nests whether the outer fence follows the nesting rule\n * @param nestedDepth how many nested fences are open right now\n */\n/**\n * The whitespace a fence line may carry around its backticks and info string:\n * CommonMark's ASCII whitespace — space, tab, LF, CR, form feed, vertical tab.\n * Defined HERE, not by a language's `trim()`: JavaScript's `trim()` also strips\n * U+FEFF, U+00A0 and the Unicode spaces, while Python's `strip()` also strips\n * U+0085 and U+001C–U+001F — which made the two twins disagree on lines such\n * as ```` ```\\uFEFF ```` (verify-RC-B3 residual R4). Every caller trims a line\n * with `trimFenceLine` before classifying it; the Python twin mirrors both.\n */\nexport const FENCE_WHITESPACE = \" \\t\\n\\r\\f\\v\";\n\nfunction isFenceWhitespace(ch: string | undefined): boolean {\n return ch !== undefined && ch !== \"\" && FENCE_WHITESPACE.includes(ch);\n}\n\n/** Strip {@link FENCE_WHITESPACE} (and nothing else) from both ends of a line. */\nexport function trimFenceLine(line: string): string {\n let start = 0;\n let end = line.length;\n while (start < end && isFenceWhitespace(line[start])) start++;\n while (end > start && isFenceWhitespace(line[end - 1])) end--;\n return start === 0 && end === line.length ? line : line.slice(start, end);\n}\n\n/**\n * The whitespace around a fence OPENER and inside its info string. The\n * renderer finds openers with JavaScript's `String#trim()` and splits the info\n * string on `/\\s/`; this set IS that definition, written out so the Python\n * twin can match it exactly — ECMAScript WhiteSpace + LineTerminator. It\n * differs from Python's `str.split()` on U+0085 and U+001C–U+001F (not JS\n * whitespace) and U+FEFF (JS whitespace) — verify-RC-B3 residual R4′.\n */\nexport const FENCE_OPENER_WHITESPACE =\n \"\\t\\n\\v\\f\\r \\u00a0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff\";\n\nfunction isOpenerWhitespace(ch: string | undefined): boolean {\n return ch !== undefined && ch !== \"\" && FENCE_OPENER_WHITESPACE.includes(ch);\n}\n\n/**\n * Parse a backtick fence OPENER line the way the renderer does: trim the line,\n * count the backtick run (3+), trim the rest, and take the first\n * whitespace-separated word as the language. null when the line opens nothing.\n */\nexport function parseFenceOpener(line: string): { ticks: number; lang: string } | null {\n let start = 0;\n let end = line.length;\n while (start < end && isOpenerWhitespace(line[start])) start++;\n while (end > start && isOpenerWhitespace(line[end - 1])) end--;\n let ticks = 0;\n while (start + ticks < end && line[start + ticks] === \"`\") ticks++;\n if (ticks < 3) return null;\n let infoStart = start + ticks;\n while (infoStart < end && isOpenerWhitespace(line[infoStart])) infoStart++;\n let langEnd = infoStart;\n while (langEnd < end && !isOpenerWhitespace(line[langEnd])) langEnd++;\n return { ticks, lang: line.slice(infoStart, langEnd) };\n}\n\nexport function classifyInnerFenceLine(\n trimmed: string,\n openTicks: number,\n nests: boolean,\n nestedDepth: number,\n): InnerFenceLine {\n let ticks = 0;\n while (ticks < trimmed.length && trimmed[ticks] === \"`\") ticks++;\n if (ticks < 3) return \"content\";\n const info = trimFenceLine(trimmed.slice(ticks));\n if (info === \"\") {\n if (ticks < openTicks) return \"content\";\n if (nests && nestedDepth > 0) return \"close-nested\";\n return \"close-outer\";\n }\n // A fence line with an info string never closes anything (CommonMark).\n // Inside a markdown fence it opens a nested one — unless the outer opener is\n // LONGER, in which case CommonMark already treats the inner fence as content\n // and its bare closer can never reach the outer fence.\n if (nests && ticks >= openTicks && !info.includes(\"`\")) return \"open-nested\";\n return \"content\";\n}\n","/**\n * THE ONE CODE-RANGE RULE — where code is in markdown source, for every surface.\n *\n * Ruling (RC-B10, 2026-09-25, REGISTER rulings ledger): the rule is the\n * RENDERER's rule — what the chat renderer's splitter, the source tokenizer\n * and the Python block detector already agree on — made container-aware only\n * where the renderer hands a block to remark:\n * - a BACKTICK fence opens on a line whose whitespace-trimmed text starts\n * with ``` at ANY indent (so a fence inside a list item opens at any\n * depth), after stripping blockquote `>` prefixes;\n * - a TILDE fence opens at ≤ 3 spaces relative to its container (a list\n * item's content column, inside any `>` prefixes);\n * - a backtick fence closes by THE nested-fence rule (`fence-nesting.ts`,\n * with the strict-CommonMark retry when a nested fence is left open) or by\n * the renderer's line-end closer (`code```` with nothing after it); inside\n * a ```json fence a backtick run inside a JSON string is text;\n * - a fence inside a blockquote ends where the blockquote ends;\n * - strict CommonMark's \"4+ spaces is not a fence\" is rejected on purpose:\n * users see what the renderer's splitter draws.\n * Inline code spans pair equal-length backtick runs inside one paragraph.\n *\n * Order is the renderer's: phase 1 is the splitter — every raw line whose\n * trimmed text starts with ``` opens a block, before remark sees anything\n * (so `- ```` can never close on a later raw ``` line; that line opens a\n * splitter block instead). Phase 2 is remark inside each prose segment the\n * splitter left: blockquote fences, fences on a list-marker line, tilde\n * fences, and code spans — none can run past its segment. A ``` line inside a\n * tilde fence is therefore drawn as code up to ITS closer (the splitter does\n * not know ~~~), exactly the tokenizer's `rendererOverflow`.\n *\n * Consumers: `findCodeRanges` (math pairing, kit's delimiter guard, chat's\n * speakable text, print, every matrx-frontend walker), and the line-level\n * primitives `fenceOpenerOf` / `closeFence`, which the tokenizer and the\n * renderer's splitters drive line by line. A private copy of fence or\n * code-span detection anywhere fails `__tests__/one-code-range-rule.test.ts`.\n */\nimport { classifyInnerFenceLine, fenceNestsInnerFences, parseFenceOpener, trimFenceLine } from \"./fence-nesting\";\n\nexport interface CodeRange {\n /** UTF-16 offset of the first character (the fence line start, or the opening backtick run). */\n start: number;\n /** Offset just past the closing fence line's content / closing backtick run (the fence's last line when unclosed). */\n end: number;\n kind: \"fence\" | \"span\";\n}\n\nexport interface FenceOpener {\n char: \"`\" | \"~\";\n /** Length of the opening run. */\n ticks: number;\n /** The info string's first word (\"\" when none). */\n lang: string;\n}\n\n/**\n * THE opener rule for one line's content (container prefixes already\n * removed; for a tilde fence, `content` starts at the container's column).\n */\nexport function fenceOpenerOf(content: string): FenceOpener | null {\n const t = content.trimStart();\n if (t.startsWith(\"```\")) {\n let ticks = 0;\n while (ticks < t.length && t[ticks] === \"`\") ticks++;\n return { char: \"`\", ticks, lang: parseFenceOpener(t)?.lang ?? \"\" };\n }\n if (content.length - t.length <= 3 && t.startsWith(\"~~~\")) {\n const open = /^(~{3,})(.*)$/.exec(t);\n if (!open) return null;\n return { char: \"~\", ticks: (open[1] as string).length, lang: (open[2] as string).trim().split(/\\s/)[0] ?? \"\" };\n }\n return null;\n}\n\n/** The lines a fence is read from. */\nexport interface FenceLines {\n count: number;\n /** Line `k`'s content (no terminator), or null when the fence's container has ended before it. */\n line(k: number): string | null;\n /** Streaming: line `k` has not ended yet, so it closes nothing. */\n openTail?(k: number): boolean;\n}\n\nexport interface FenceEnd {\n /** The closing line when `closed`; otherwise the fence's last line (text end, or the line before its container ended). */\n line: number;\n closed: boolean;\n}\n\n/**\n * THE closer rule, read line by line — the one implementation behind\n * `closeFence` and every streaming walker. Feed each following line\n * (container prefixes removed); `feed` returns true on the line that closes\n * the fence. A backtick fence closes by the nested-fence rule or the\n * renderer's line-end closer (`code````), and inside ```json a backtick run in\n * a JSON string is text; a tilde fence closes on `~~~` (≥ its length, ≤ 3\n * spaces). `nesting: false` forces strict CommonMark (the retry `closeFence`\n * makes when a nested fence is left open at the end; a streaming reader\n * cannot look ahead, so it reads with nesting and never retries).\n */\nexport class FenceReader {\n private state = { inString: false, escaped: false };\n private depth = 0;\n /** A nested fence was opened at some point. */\n sawNested = false;\n private readonly isJson: boolean;\n private readonly nesting: boolean;\n private readonly tildeCloser: RegExp | null;\n\n constructor(\n readonly opener: FenceOpener,\n options: { nesting?: boolean } = {},\n ) {\n this.isJson = opener.char === \"`\" && opener.lang === \"json\";\n this.nesting = opener.char === \"`\" && (options.nesting ?? fenceNestsInnerFences(opener.lang));\n this.tildeCloser = opener.char === \"~\" ? new RegExp(`^ {0,3}~{${opener.ticks},}[ \\\\t]*$`) : null;\n }\n\n /** How many nested fences are open right now. */\n get nestedDepth(): number {\n return this.depth;\n }\n\n feed(line: string): boolean {\n if (this.tildeCloser) return this.tildeCloser.test(line);\n const trimmedLine = trimFenceLine(line);\n const at = line.indexOf(\"```\");\n if (at === -1) {\n if (this.isJson) this.state = jsonStringState(line, 0, line.length, this.state);\n return false;\n }\n if (this.isJson) {\n const probe = jsonStringState(line, 0, at, this.state);\n if (probe.inString) {\n this.state = jsonStringState(line, at, line.length, probe);\n return false;\n }\n }\n if (trimmedLine.startsWith(\"```\")) {\n const kind = classifyInnerFenceLine(trimmedLine, this.opener.ticks, this.nesting, this.depth);\n if (kind === \"close-outer\") return true;\n if (kind === \"open-nested\") {\n this.depth++;\n this.sawNested = true;\n }\n if (kind === \"close-nested\") this.depth--;\n } else {\n // The renderer's line-end closer: `code```` with nothing after the run.\n const closeTicks = backtickRunLength(line, at);\n const after = trimFenceLine(line.slice(at + closeTicks));\n if (closeTicks >= this.opener.ticks && after === \"\" && this.depth === 0) return true;\n }\n if (this.isJson) this.state = jsonStringState(line, 0, line.length, this.state);\n return false;\n }\n}\n\n/** Where the fence opened on line `open` ends. */\nexport function closeFence(src: FenceLines, open: number, opener: FenceOpener): FenceEnd {\n const first = readFence(src, open, new FenceReader(opener));\n if (first.closed || !first.reader.sawNested || first.reader.nestedDepth <= 0) return { line: first.line, closed: first.closed };\n const strict = readFence(src, open, new FenceReader(opener, { nesting: false }));\n return { line: strict.line, closed: strict.closed };\n}\n\nfunction readFence(src: FenceLines, open: number, reader: FenceReader): FenceEnd & { reader: FenceReader } {\n for (let k = open + 1; k < src.count; k++) {\n // Streaming: a bare ``` on the unfinished last line may still grow into ```bash.\n if (src.openTail?.(k)) continue;\n const line = src.line(k);\n if (line === null) return { line: k - 1, closed: false, reader };\n if (reader.feed(line)) return { line: k, closed: true, reader };\n }\n return { line: src.count - 1, closed: false, reader };\n}\n\n/** JSON-string state after scanning `line[from, upTo)` from the given state. */\nexport function jsonStringState(\n line: string,\n from: number,\n upTo: number,\n state: { inString: boolean; escaped: boolean },\n): { inString: boolean; escaped: boolean } {\n let { inString, escaped } = state;\n for (let idx = from; idx < upTo; idx++) {\n const ch = line[idx];\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === \"\\\\\" && inString) {\n escaped = true;\n continue;\n }\n if (ch === '\"') inString = !inString;\n }\n return { inString, escaped };\n}\n\nexport function backtickRunLength(str: string, pos: number): number {\n let n = 0;\n while (pos + n < str.length && str[pos + n] === \"`\") n++;\n return n;\n}\n\n// ── the whole-text scan ────────────────────────────────────────────────────\n\n/** Blockquote prefix: how many `>` markers open the line, and where its content starts. */\nfunction quotePrefix(line: string): { depth: number; offset: number } {\n let depth = 0;\n let offset = 0;\n for (;;) {\n const m = /^ {0,3}> ?/.exec(line.slice(offset));\n if (!m) return { depth, offset };\n depth++;\n offset += m[0].length;\n }\n}\n\n/** Strip exactly `depth` blockquote markers; null when the line has fewer (the blockquote ended). */\nfunction stripQuotes(line: string, depth: number): string | null {\n let offset = 0;\n for (let d = 0; d < depth; d++) {\n const m = /^ {0,3}> ?/.exec(line.slice(offset));\n if (!m) return null;\n offset += m[0].length;\n }\n return line.slice(offset);\n}\n\nconst LIST_ITEM = /^( *)([-*+]|\\d{1,9}[.)])( +|\\t|$)/;\n\nfunction leadingSpaces(s: string): number {\n let i = 0;\n while (i < s.length && s[i] === \" \") i++;\n return i;\n}\n\ninterface Scan {\n ranges: CodeRange[];\n /** Every fence as lines: [opener line, last line, closed]. */\n fences: Array<[number, number, boolean]>;\n /** Paragraph runs outside fences, [start, end), for code-span pairing. */\n paragraphs: Array<[number, number]>;\n /** Text ends inside an open fence. */\n endsInFence: boolean;\n /** Start of the final, still-growing paragraph (streaming rule), -1 if none. */\n pendingPara: number;\n}\n\nfunction scan(text: string): Scan {\n const starts: number[] = [];\n const ends: number[] = [];\n for (let pos = 0; ; ) {\n const nl = text.indexOf(\"\\n\", pos);\n const lineEnd = nl === -1 ? text.length : nl;\n starts.push(pos);\n ends.push(lineEnd > pos && text.charCodeAt(lineEnd - 1) === 13 ? lineEnd - 1 : lineEnd);\n if (nl === -1) break;\n pos = nl + 1;\n }\n const count = starts.length;\n const raw = (k: number) => text.slice(starts[k] as number, ends[k] as number);\n const out: Scan = { ranges: [], fences: [], paragraphs: [], endsInFence: false, pendingPara: -1 };\n\n // Phase 1 — the renderer's splitter: every line whose trimmed text starts\n // with ``` opens a code block at ANY indent, before remark sees anything.\n const rawLines: FenceLines = { count, line: raw };\n let segment = 0;\n for (let k = 0; k < count; k++) {\n const opener = fenceOpenerOf(raw(k));\n if (!opener || opener.char !== \"`\") continue;\n prose(text, starts, ends, raw, segment, k, out);\n const end = closeFence(rawLines, k, opener);\n out.ranges.push({ start: starts[k] as number, end: ends[end.line] as number, kind: \"fence\" });\n out.fences.push([k, end.line, end.closed]);\n out.pendingPara = -1;\n if (!end.closed && end.line === count - 1) out.endsInFence = true;\n k = end.line;\n segment = k + 1;\n }\n prose(text, starts, ends, raw, segment, count, out);\n return out;\n}\n\n/**\n * Phase 2 — remark, inside one prose segment [from, to) the splitter left:\n * fences in blockquotes, on a list-marker line, and tilde fences (relative to\n * their container), plus the paragraphs whose backtick runs pair as spans. A\n * fence here can never run past its segment: the splitter's block begins there.\n */\nfunction prose(\n text: string,\n starts: number[],\n ends: number[],\n raw: (k: number) => string,\n from: number,\n to: number,\n out: Scan,\n): void {\n let para = -1;\n let quoteDepth = 0;\n let lists: number[] = []; // content columns of the open list items (inside the quote prefix)\n const closePara = (at: number) => {\n if (para !== -1) out.paragraphs.push([para, at]);\n para = -1;\n };\n for (let k = from; k < to; k++) {\n const line = raw(k);\n const { depth, offset } = quotePrefix(line);\n if (depth !== quoteDepth) {\n quoteDepth = depth;\n lists = [];\n }\n let content = line.slice(offset);\n if (content.trim() === \"\") {\n closePara(starts[k] as number);\n // The empty \"line\" after a final newline is not a blank line: the next\n // line may still join this paragraph.\n if (!(k === starts.length - 1 && line === \"\")) out.pendingPara = -1;\n continue;\n }\n const indent = leadingSpaces(content);\n while (lists.length && indent < (lists[lists.length - 1] as number)) lists.pop();\n const item = LIST_ITEM.exec(content);\n let column = lists.length ? (lists[lists.length - 1] as number) : 0;\n if (item) {\n const gap = (item[3] as string).length;\n column = (item[1] as string).length + (item[2] as string).length + (gap >= 1 && gap <= 4 ? gap : 1);\n lists.push(column);\n content = content.slice(Math.min(column, content.length));\n } else {\n content = content.slice(Math.min(indent, column));\n }\n const opener = fenceOpenerOf(content);\n if (!opener) {\n if (para === -1) para = starts[k] as number;\n if (out.pendingPara === -1) out.pendingPara = starts[k] as number;\n continue;\n }\n closePara(starts[k] as number);\n out.pendingPara = -1;\n const col = column;\n const src: FenceLines = {\n count: to,\n line: (j) => {\n const inner = stripQuotes(raw(j), depth);\n if (inner === null) return null;\n if (opener.char === \"~\" && col > 0) {\n const ind = leadingSpaces(inner);\n if (inner.trim() !== \"\" && ind < col) return null; // the list item ended\n return inner.slice(Math.min(ind, col));\n }\n return inner;\n },\n };\n const end = closeFence(src, k, opener);\n out.ranges.push({ start: starts[k] as number, end: ends[end.line] as number, kind: \"fence\" });\n out.fences.push([k, end.line, end.closed]);\n if (!end.closed && end.line === starts.length - 1) out.endsInFence = true;\n k = end.line;\n }\n closePara(to < starts.length ? (starts[to] as number) : text.length);\n}\n\n/**\n * THE code-span pairing table for one paragraph, text[from, to): a backtick\n * run closes at the first LATER run of exactly its length; a run with none is\n * literal text. `findCodeRanges` pairs runs in order; the tokenizer's inline\n * scanner asks `next` in the renderer's leftmost-first inline order.\n */\nexport class BacktickRuns {\n /** Every run, in order: [start, length]. */\n readonly all: Array<[number, number]> = [];\n private readonly byLength = new Map<number, number[]>();\n private readonly indexOf = new Map<number, number>();\n\n constructor(text: string, from: number, to: number) {\n for (let k = from; k < to; ) {\n if (text.charCodeAt(k) !== 96) {\n k++;\n continue;\n }\n let len = 1;\n while (k + len < to && text.charCodeAt(k + len) === 96) len++;\n this.indexOf.set(k, this.all.length);\n this.all.push([k, len]);\n const list = this.byLength.get(len);\n if (list) list.push(k);\n else this.byLength.set(len, [k]);\n k += len;\n }\n }\n\n /** Start of the first run of exactly `n` backticks at or after `after`, or -1. */\n next(n: number, after: number): number {\n const list = this.byLength.get(n);\n if (!list) return -1;\n let lo = 0;\n let hi = list.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if ((list[mid] as number) < after) lo = mid + 1;\n else hi = mid;\n }\n return list[lo] ?? -1;\n }\n\n /** Index of the run starting at `start` in `all`. */\n index(start: number): number {\n return this.indexOf.get(start) ?? -1;\n }\n}\n\nfunction codeSpans(text: string, from: number, to: number, out: CodeRange[]): void {\n const runs = new BacktickRuns(text, from, to);\n for (let r = 0; r < runs.all.length; ) {\n const [start, n] = runs.all[r] as [number, number];\n const close = runs.next(n, start + n);\n if (close === -1) {\n r++;\n continue;\n }\n out.push({ start, end: close + n, kind: \"span\" });\n r = runs.index(close) + 1;\n }\n}\n\n/**\n * Every code range in the text — fences (by the renderer's rule above) and\n * inline code spans — sorted by start. Linear: one pass over lines, one over\n * each paragraph's backtick runs.\n */\nexport function findCodeRanges(text: string): CodeRange[] {\n const s = scan(text);\n const ranges = [...s.ranges];\n for (const [from, to] of s.paragraphs) codeSpans(text, from, to, ranges);\n return ranges.sort((a, b) => a.start - b.start);\n}\n\n/**\n * Rewrite every code range (fences and spans, by THE rule) through `fn`; text\n * outside code is kept byte for byte. The one way to strip, replace or\n * placeholder code in markdown — never a private /```…```/ regex.\n */\nexport function mapCodeRanges(text: string, fn: (range: CodeRange, raw: string) => string): string {\n let out = \"\";\n let at = 0;\n for (const r of findCodeRanges(text)) {\n if (r.start < at) continue;\n out += text.slice(at, r.start) + fn(r, text.slice(r.start, r.end));\n at = r.end;\n }\n return out + text.slice(at);\n}\n\n/** A code span's text (CommonMark): the backtick runs off, then one padding space each side when both are there and the content is not all spaces. */\nexport function codeSpanText(raw: string): string {\n const ticks = backtickRunLength(raw, 0);\n const inner = raw.slice(ticks, raw.length - ticks);\n return inner.length >= 2 && inner.startsWith(\" \") && inner.endsWith(\" \") && inner.trim() !== \"\" ? inner.slice(1, -1) : inner;\n}\n\n/**\n * A fence range's parts: its opener, its body (the lines between the opener\n * and the closer, blockquote prefixes kept), and whether it closed. Reads\n * `raw` exactly as `findCodeRanges` returned it.\n */\nexport function fenceParts(raw: string): { opener: FenceOpener; body: string; closed: boolean } | null {\n const lines = raw.split(\"\\n\").map((l) => (l.endsWith(\"\\r\") ? l.slice(0, -1) : l));\n const { offset } = quotePrefix(lines[0] ?? \"\");\n const opener = fenceOpenerOf((lines[0] ?? \"\").slice(offset).replace(/^ *(?:[-*+]|\\d{1,9}[.)])(?= |\\t|$) ?/, \"\"));\n if (!opener) return null;\n const rest = lines.slice(1);\n const closed = rest.length > 0 && new FenceReader(opener, { nesting: false }).feed(rest[rest.length - 1] as string);\n if (!closed) return { opener, body: rest.join(\"\\n\"), closed };\n const last = rest[rest.length - 1] as string;\n // The renderer's line-end closer (`code````): the text before the run is code.\n const before = trimFenceLine(last).startsWith(\"```\") ? \"\" : last.slice(0, last.indexOf(\"```\"));\n return { opener, body: [...rest.slice(0, -1), ...(before.trim() ? [before] : [])].join(\"\\n\"), closed };\n}\n\nexport type FenceLineKind = \"prose\" | \"open\" | \"body\" | \"close\";\n\n/**\n * Where each line (the text split on \"\\n\") sits relative to the fences\n * `findCodeRanges` finds: its opener, its body, its closer, or prose. For a\n * line walker that must skip code — one rule, never a private `inFence` toggle.\n */\nexport function fenceLineKinds(text: string): FenceLineKind[] {\n const s = scan(text);\n let count = 1;\n for (let i = text.indexOf(\"\\n\"); i !== -1; i = text.indexOf(\"\\n\", i + 1)) count++;\n const kinds = new Array<FenceLineKind>(count).fill(\"prose\");\n for (const [open, last, closed] of s.fences) {\n kinds[open] = \"open\";\n for (let k = open + 1; k <= last; k++) kinds[k] = \"body\";\n if (closed && last > open) kinds[last] = \"close\";\n }\n return kinds;\n}\n\n/**\n * STREAMING: where the last, still-growing paragraph (no blank line or fence\n * after it) holds a backtick run that a later run could still close — a run\n * with no later run of its length, or the run touching the end of the text\n * (it may still lengthen). Such a code span can yet swallow any `$$` after it,\n * so a streaming tokenizer treats text from there as provisional. -1 if none.\n */\nexport function pendingCodeSpanStart(text: string): number {\n const n = text.length;\n if (n === 0 || /\\n[ \\t]*\\n[ \\t]*$/.test(text)) return -1;\n const s = scan(text);\n const para = s.pendingPara;\n if (s.endsInFence || para === -1) return -1;\n const runs: Array<[number, number]> = [];\n for (let k = para; k < n; ) {\n if (text.charCodeAt(k) !== 96) {\n k++;\n continue;\n }\n let len = 1;\n while (k + len < n && text.charCodeAt(k + len) === 96) len++;\n runs.push([k, len]);\n k += len;\n }\n // Pair runs the way findCodeRanges does, treating a run that touches the end\n // as still growing (it matches nothing yet); the first run left open is pending.\n const growing = (r: number) => {\n const [start, len] = runs[r] as [number, number];\n return start + len === n;\n };\n for (let r = 0; r < runs.length; ) {\n if (growing(r)) return (runs[r] as [number, number])[0];\n const len = (runs[r] as [number, number])[1];\n let j = r + 1;\n while (j < runs.length && ((runs[j] as [number, number])[1] !== len || growing(j))) j++;\n if (j >= runs.length) return (runs[r] as [number, number])[0];\n r = j + 1;\n }\n return -1;\n}\n","import { findCodeRanges } from \"./code-ranges\";\n\n/**\n * `$$` pairing — the core's rule for which `$$` delimiters are real math.\n *\n * Ported from `@ai-matrx/kit/delimiter-guard` (`guardMathDelimiters`), which\n * every math-capable renderer runs before remark-math. Its decisions:\n * - `$$` tokens outside code (``` / ~~~ fences, `inline code`) pair in\n * document order, open → close;\n * - a pair whose inside reads as prose or carries markdown structure is NOT\n * math: the renderer neutralizes its opener and the closer is retried as\n * the next opener;\n * - an unpaired `$$` is inert — it renders as literal text.\n * So the tokenizer protects exactly the pairs the renderer shows as math, and\n * a lone `$$` (a stray closer, or an opener that never closed) never locks\n * anything. Linear time: one regex pass per code shape, one sweep.\n */\n\nconst MAX_MATH_SPAN = 600;\nconst STRUCTURAL_MARKDOWN =\n /\\]\\(|https?:\\/\\/|\\*\\*|(?:^|\\n)[ \\t]{0,3}#{1,6}[ \\t]|(?:^|\\n)[ \\t]*[-*+][ \\t]+|(?:^|\\n)[ \\t]*\\d+[.)][ \\t]/;\nconst LATEX_COMMAND = /\\\\[a-zA-Z]/;\nconst PROSE_WORD = /[A-Za-z]{3,}/g;\nconst PROSE_WORD_LIMIT = 6;\n\n/**\n * `$$...$$`, `$$…$$`, `$$ · $$`: a PLACEHOLDER — prose describing the syntax,\n * never a formula. The pair is consumed whole as literal text (neither `$$`\n * may open the next span).\n */\nexport function isMathPlaceholder(inner: string): boolean {\n return /^[\\s.…·⋯_-]*$/.test(inner) && /[.…·⋯]/.test(inner);\n}\n\n/** A `$$` alone on its line opens a flow block (like a fence). */\nfunction opensFlowBlock(text: string, open: number): boolean {\n // Only whitespace between the line start and the opener, and after it to\n // the line end. Scans just that whitespace, so a line full of `$$` stays linear.\n for (let k = open - 1; k >= 0 && text[k] !== \"\\n\"; k--) if (text[k] !== \" \" && text[k] !== \"\\t\") return false;\n for (let k = open + 2; k < text.length && text[k] !== \"\\n\"; k++) if (text[k] !== \" \" && text[k] !== \"\\t\" && text[k] !== \"\\r\") return false;\n return true;\n}\n\n/**\n * The guard's `looksLikeMath`. `flow` = the opener is alone on its line: a\n * flow block may span blank lines (like a fence); a `$$` with text beside it\n * never crosses one — TeX's rule, and what keeps a stray prose `$$` from\n * pairing with the next paragraph's formula.\n */\nexport function looksLikeDisplayMath(inner: string, flow = false): boolean {\n const s = inner.trim();\n if (!s) return false;\n if (STRUCTURAL_MARKDOWN.test(s)) return false;\n if (s.length > MAX_MATH_SPAN) return false;\n // TeX's rule: display math never contains a blank line — a stray prose `$$`\n // never pairs with the next paragraph's formula, LaTeX in between or not.\n // On the UNtrimmed span: the blank line is often right before the closer.\n if (!flow && /\\n[ \\t]*\\n/.test(inner)) return false;\n if (LATEX_COMMAND.test(s)) {\n return (s.match(PROSE_WORD) ?? []).length < PROSE_WORD_LIMIT * 3;\n }\n return (s.match(PROSE_WORD) ?? []).length < PROSE_WORD_LIMIT;\n}\n\n/** Code ranges as `[start, end)` tuples — the ONE CommonMark rule (`./code-ranges`). */\nfunction codeRanges(text: string): Array<[number, number]> {\n return findCodeRanges(text).map((r) => [r.start, r.end]);\n}\n\nexport { pendingCodeSpanStart } from \"./code-ranges\";\n\n/**\n * STREAMING: the last `$$` token that is still unpaired AND could still pair\n * with a `$$` not yet arrived — its span so far is short enough, carries no\n * markdown structure, not too many prose words, and (unless it opens a flow\n * block) no blank line. Everything after it may yet become math, so a\n * streaming tokenizer treats it as provisional. -1 when there is none.\n */\nexport function pendingDisplayMathOpener(text: string): number {\n if (!text.includes(\"$$\")) return -1;\n const ranges = codeRanges(text);\n const tokens: number[] = [];\n let r = 0;\n let maxEnd = -1;\n for (let i = text.indexOf(\"$$\"); i !== -1 && i < text.length - 1; i = text.indexOf(\"$$\", i)) {\n while (r < ranges.length && (ranges[r] as [number, number])[0] <= i) {\n maxEnd = Math.max(maxEnd, (ranges[r] as [number, number])[1]);\n r++;\n }\n if (maxEnd <= i) tokens.push(i);\n i += 2;\n }\n const paired = new Set<number>();\n let j = 0;\n while (j < tokens.length) {\n const open = tokens[j] as number;\n const close = tokens[j + 1];\n if (close === undefined) break;\n if (isMathPlaceholder(text.slice(open + 2, close))) {\n j += 2;\n continue;\n }\n if (looksLikeDisplayMath(text.slice(open + 2, close), opensFlowBlock(text, open))) {\n paired.add(open);\n paired.add(close);\n j += 2;\n continue;\n }\n j += 1;\n }\n // The EARLIEST unpaired token that could still pair: a later token can yet\n // vanish into an inline code span whose closer has not arrived, which would\n // hand an earlier token a new partner.\n // Trailing whitespace is trimmed from every candidate's span; measure it once.\n let trail = 0;\n while (trail < text.length && /\\s/.test(text[text.length - 1 - trail] as string)) trail++;\n for (const token of tokens) {\n if (paired.has(token)) continue;\n // Cheap bound first (keeps this linear): a span to the end longer than the\n // math limit plus its surrounding whitespace can never pair.\n let lead = 0;\n while (lead <= MAX_MATH_SPAN && /\\s/.test(text[token + 2 + lead] ?? \"x\")) lead++;\n if (text.length - (token + 2) - lead - trail > MAX_MATH_SPAN) continue;\n const inner = text.slice(token + 2);\n const s = inner.trim();\n if (STRUCTURAL_MARKDOWN.test(s) || s.length > MAX_MATH_SPAN) continue;\n if (!opensFlowBlock(text, token) && /\\n[ \\t]*\\n/.test(inner)) continue;\n if ((s.match(PROSE_WORD) ?? []).length >= PROSE_WORD_LIMIT * 3) continue;\n return token;\n }\n return -1;\n}\n\n/** Map of `$$` opener offset → closer offset for every pair the renderer shows as math. */\nexport function pairDisplayMath(text: string): Map<number, number> {\n const pairs = new Map<number, number>();\n if (!text.includes(\"$$\")) return pairs;\n const ranges = codeRanges(text);\n const tokens: number[] = [];\n let r = 0;\n let maxEnd = -1;\n for (let i = text.indexOf(\"$$\"); i !== -1 && i < text.length - 1; i = text.indexOf(\"$$\", i)) {\n while (r < ranges.length && (ranges[r] as [number, number])[0] <= i) {\n maxEnd = Math.max(maxEnd, (ranges[r] as [number, number])[1]);\n r++;\n }\n if (maxEnd <= i) tokens.push(i);\n i += 2; // never treat the second `$` of a pair as a new opener\n }\n let j = 0;\n while (j < tokens.length) {\n const open = tokens[j] as number;\n const close = tokens[j + 1];\n if (close === undefined) break;\n if (isMathPlaceholder(text.slice(open + 2, close))) {\n j += 2;\n continue;\n }\n if (looksLikeDisplayMath(text.slice(open + 2, close), opensFlowBlock(text, open))) {\n pairs.set(open, close);\n j += 2;\n continue;\n }\n j += 1;\n }\n return pairs;\n}\n","import { isMathPlaceholder } from \"./math-pairs\";\n\nconst TEX_SIGNAL = /\\\\[A-Za-z]+|[\\\\^_{}=<>+]/;\nconst LONE_VARIABLE = /^[A-Za-z](?:'|[0-9])?$/;\nconst MATH_SHAPE_CHARS = /^[A-Za-z0-9'\\s(),.*\\/-]+$/;\n\n/**\n * THE single-dollar math rule — the one predicate that decides whether a\n * CLOSED `$…$` is inline math or currency, on screen, in every export and in\n * the editor's islands (the renderer's normalizer, the source tokenizer and\n * print all ask it).\n *\n * Pandoc's `tex_math_dollars` delimiters (what remark-math approximates, and\n * how ChatGPT and Claude render): the opening `$` is followed by a\n * non-space, the closing `$` is preceded by a non-space and not followed by a\n * digit — so `$5 and $10`, `$5-$10`, `$5/$10` stay currency while `$FC$`,\n * `$AB$`, `$5$` and `$(0, 0)$` are math. On top of that, content that reads as\n * something other than a formula is refused — each guard is a false positive\n * measured in stored answers (matrx-frontend\n * `scripts/measure-single-dollar-rule.ts`, 2026-09-25: over 85k assistant\n * messages and 4k notes the widening adds 128 spans, every one a formula\n * (`$FC$`, `$(0, 0)$`, `$3x + 6 = 15$`), and drops 22 the old rule drew as\n * math that were code, template literals, a printf or broken TeX):\n * - an unescaped `%` — TeX's comment character, and a percentage\n * (`$\\ge$20% owners**…**$`, a printf `%1$s`);\n * - a closing bracket or `/` first, or an opening bracket last\n * (`[$X] plus [$Y]`, `($/SF/Yr) | High-Cost Market ($`, a regex\n * `/…/, '').replace(/…$`), or a straight quote at either end (`[\"$\", \"$\"]`\n * in data);\n * - `:` `;` `,` `/` last — a separator between two `$` words\n * (`$HOME/.local/bin:$PATH`, `$AAPL/$TSLA`);\n * - a number glued to a following letter (`$10$N9qo…`, a bcrypt cost);\n * - a placeholder (`$...$`);\n * - prose, unless a TeX command or operator says otherwise: two plain\n * words (`$Tipping (fee)$`), a contraction (`$I'm$`, never `$X'Y$`), an\n * abbreviation (`$e.g. (x)$`).\n */\nexport function isSingleDollarMath(\n content: string,\n after: string | undefined,\n): boolean {\n if (!content || content.length > 400) return false;\n if (/^\\s/.test(content) || /\\s$/.test(content)) return false;\n if (after !== undefined && /[0-9]/.test(after)) return false;\n if (/(?:^|[^\\\\])%/.test(content)) return false;\n if (/^[)\\]}\"/]/.test(content) || /[(\\[{\":;,/]$/.test(content)) return false;\n if (/^[0-9]/.test(content) && after !== undefined && /[A-Za-z]/.test(after)) return false;\n if (isMathPlaceholder(content)) return false;\n return TEX_SIGNAL.test(content) || !readsAsProse(content);\n}\n\nconst FUNCTION_NAMES = new Set([\n \"sin\", \"cos\", \"tan\", \"sec\", \"csc\", \"cot\", \"log\", \"ln\", \"exp\",\n \"lim\", \"max\", \"min\", \"det\", \"gcd\", \"mod\", \"arg\", \"sinh\", \"cosh\", \"tanh\",\n]);\n\n/**\n * Words, not symbols: two plain words of three or more letters (standard\n * function names aside) with a space between them, a contraction (`I'm` — a\n * prime is never followed by a lowercase letter; `X'Y` is Boolean algebra), or an abbreviation (`e.g.` — a letter\n * is never followed by a period; `x.y` inside parentheses is fine).\n */\nfunction readsAsProse(content: string): boolean {\n if (/[A-Za-z]'[a-z]/.test(content)) return true;\n if (/(?:^|[\\s(,])[A-Za-z]\\.(?:[A-Za-z]\\.|\\s|$)/.test(content)) return true;\n if (!/\\s/.test(content)) return false;\n const words = (content.match(/[A-Za-z]{3,}/g) ?? []).filter((w) => !FUNCTION_NAMES.has(w.toLowerCase()));\n return words.length >= 2;\n}\n\n/**\n * Whether an UNCLOSED `$…` already reads as a formula — for a stream that\n * must decide before the closing `$` arrives (matrx-frontend `stream-heal`\n * holds such a tail back instead of printing raw TeX). Stricter than\n * {@link isSingleDollarMath} on purpose: with no closer there are no Pandoc\n * delimiter facts yet, so it needs a math SIGNAL — a TeX command or operator\n * (`\\alpha`, `^`, `_`, `{`, `=`, …), a lone variable (`x`, `x'`), or a\n * single-letter math shape (`f(g(x))`, `u v`). Content that opens with a digit\n * needs a real TeX command, so `$35 per stop` keeps showing while it streams.\n */\nexport function looksLikeOpenInlineMath(partial: string): boolean {\n if (!partial || partial.length > 400) return false;\n if (/^\\s/.test(partial) || /\\s$/.test(partial)) return false;\n if (LONE_VARIABLE.test(partial)) return true;\n if (/^[0-9]/.test(partial)) return /\\\\[A-Za-z]+|[\\\\^_{}]/.test(partial);\n return TEX_SIGNAL.test(partial) || isMathShape(partial);\n}\n\n/**\n * A math SHAPE with no TeX command or operator: single-letter identifiers\n * (optionally primed, optionally a standard function name) applied,\n * juxtaposed or listed — `f(g(x))`, `u v`, `f'(x)`, `(x, y)`, `ln(x)`.\n */\nfunction isMathShape(content: string): boolean {\n if (!MATH_SHAPE_CHARS.test(content)) return false;\n const words = content.match(/[A-Za-z]+/g);\n if (!words) return false;\n if (!words.every((w) => w.length === 1 || FUNCTION_NAMES.has(w))) return false;\n if (/[A-Za-z]'+[A-Za-z]/.test(content) || /(?:^|[\\s(,])[A-Za-z]\\.(?:[A-Za-z]\\.|\\s|$)/.test(content)) return false;\n return /[A-Za-z]'*\\(|[A-Za-z]'|\\b[A-Za-z]\\s+[A-Za-z]\\b|\\([^)]*[A-Za-z][^)]*\\)/.test(content);\n}\n\n/**\n * Where a single-dollar math span opened at `open` (a lone `$`) closes, or -1.\n * Same scan the normalizer uses: same line, backslash-escapes skipped, the\n * closer is a `$` not followed by another `$`, and the content passes\n * {@link isSingleDollarMath}. Returns the offset just past the closing `$`.\n */\nexport function singleDollarMathEnd(text: string, open: number, limit = text.length): number {\n // Content over 400 characters is never math, so the scan never needs to go\n // further — this keeps a line full of `$` linear.\n const bound = Math.min(limit, open + 403);\n let close = -1;\n for (let k = open + 1; k < bound; k += 1) {\n const c = text[k];\n if (c === \"\\n\") break;\n if (c === \"\\\\\") {\n k += 1;\n continue;\n }\n if (c === \"$\") {\n close = k;\n break;\n }\n }\n if (close === -1 || text[close + 1] === \"$\") return -1;\n const content = text.slice(open + 1, close);\n return isSingleDollarMath(content, text[close + 1]) ? close + 1 : -1;\n}\n","/**\n * XML tag reading + the generic-container balance scanner.\n *\n * Ported VERBATIM (behaviour) from matrx-frontend\n * `components/mardown-display/blocks/xml/readXmlTag.ts` and the\n * `XmlContainerTracker` in\n * `components/mardown-display/markdown-classification/processors/utils/content-splitter-v2.ts`\n * so the source tokenizer ends a generic XML section exactly where the\n * renderer does. Fences inside the section are found by THE one code-range\n * rule (source/code-ranges.ts `fenceOpenerOf` + `FenceReader`), which the\n * renderer's splitter imports too (RC-B10).\n */\nimport { FenceReader, fenceOpenerOf } from \"./code-ranges\";\n\nexport interface ReadXmlTag {\n tagName: string;\n raw: string;\n isClosing: boolean;\n isSelfClosing: boolean;\n attributes: Array<{ name: string; value: string }>;\n}\n\nconst XML_NAME_START = /[A-Za-z_]/;\nconst XML_NAME_CHARACTER = /[\\w.:-]/;\nconst WHITESPACE = /\\s/;\n\n/**\n * `find(needle, from)` must behave like `content.indexOf(needle, from)`; the\n * tokenizer passes a cached occurrence index so a text full of unclosed\n * attribute quotes stays linear. Behaviour is identical either way.\n */\nexport function readXmlTag(\n content: string,\n start: number,\n find: (needle: string, from: number) => number = (needle, from) => content.indexOf(needle, from),\n): ReadXmlTag | null {\n let cursor = start + 1;\n const isClosing = content[cursor] === \"/\";\n if (isClosing) cursor++;\n if (!XML_NAME_START.test(content[cursor] ?? \"\")) return null;\n const nameStart = cursor;\n while (XML_NAME_CHARACTER.test(content[cursor] ?? \"\")) cursor++;\n const tagName = content.slice(nameStart, cursor);\n const attributes: Array<{ name: string; value: string }> = [];\n if (isClosing) {\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n if (content[cursor] !== \">\") return null;\n return {\n tagName,\n raw: content.slice(start, cursor + 1),\n isClosing,\n isSelfClosing: false,\n attributes,\n };\n }\n while (cursor < content.length) {\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n if (content[cursor] === \">\")\n return {\n tagName,\n raw: content.slice(start, cursor + 1),\n isClosing,\n isSelfClosing: false,\n attributes,\n };\n if (content[cursor] === \"/\") {\n cursor++;\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n if (content[cursor] !== \">\") return null;\n return {\n tagName,\n raw: content.slice(start, cursor + 1),\n isClosing,\n isSelfClosing: true,\n attributes,\n };\n }\n if (!XML_NAME_START.test(content[cursor] ?? \"\")) return null;\n const attributeStart = cursor;\n while (XML_NAME_CHARACTER.test(content[cursor] ?? \"\")) cursor++;\n const name = content.slice(attributeStart, cursor);\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n if (content[cursor] !== \"=\") return null;\n cursor++;\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n const quote = content[cursor];\n if (quote !== '\"' && quote !== \"'\") return null;\n const valueStart = ++cursor;\n const valueEnd = find(quote, valueStart);\n if (valueEnd === -1) return null;\n cursor = valueEnd;\n attributes.push({ name, value: content.slice(valueStart, cursor) });\n cursor++;\n }\n return null;\n}\n\nfunction isEscapedBacktick(line: string, offset: number): boolean {\n let slashes = 0;\n for (let i = offset - 1; line[i] === \"\\\\\"; i--) slashes++;\n return slashes % 2 === 1;\n}\n\n/**\n * Balances ONE unknown root tag line by line, ignoring lookalike tags inside\n * fenced code, inline code spans, comments and CDATA. `consumeLine` returns\n * the offset (within that line) just past the root's closing tag, or null.\n */\nexport class XmlContainerTracker {\n private depth = 0;\n private inComment = false;\n private inCdata = false;\n private inlineTicks = 0;\n /** The open fence, read by THE one closer (source/code-ranges.ts). */\n private fence: FenceReader | null = null;\n\n constructor(readonly rootTag: string) {}\n\n consumeLine(line: string, startOffset = 0): number | null {\n if (this.fence) {\n if (this.fence.feed(line)) this.fence = null;\n return null;\n }\n if (!this.inComment && !this.inCdata && this.inlineTicks === 0) {\n const opener = fenceOpenerOf(line);\n if (opener) {\n this.fence = new FenceReader(opener);\n return null;\n }\n }\n\n for (let i = startOffset; i < line.length; i++) {\n if (this.inlineTicks > 0) {\n if (line[i] === \"`\") {\n let end = i;\n while (line[end] === \"`\") end++;\n if (end - i === this.inlineTicks) this.inlineTicks = 0;\n i = end - 1;\n }\n continue;\n }\n if (this.inComment) {\n const end = line.indexOf(\"-->\", i);\n if (end === -1) return null;\n this.inComment = false;\n i = end + 2;\n continue;\n }\n if (this.inCdata) {\n const end = line.indexOf(\"]]>\", i);\n if (end === -1) return null;\n this.inCdata = false;\n i = end + 2;\n continue;\n }\n if (line.startsWith(\"<!--\", i)) {\n this.inComment = true;\n i += 3;\n continue;\n }\n if (line.startsWith(\"<![CDATA[\", i)) {\n this.inCdata = true;\n i += 8;\n continue;\n }\n if (line[i] === \"`\" && !isEscapedBacktick(line, i)) {\n let end = i;\n while (line[end] === \"`\") end++;\n this.inlineTicks = end - i;\n i = end - 1;\n continue;\n }\n if (line[i] !== \"<\") continue;\n const tag = readXmlTag(line, i);\n if (!tag) continue;\n const tagEnd = i + tag.raw.length;\n if (tag.tagName === this.rootTag) {\n if (tag.isClosing) this.depth--;\n else if (!tag.isSelfClosing) this.depth++;\n if (this.depth === 0) return tagEnd;\n }\n i = tagEnd - 1;\n }\n return null;\n }\n}\n","/**\n * THE OFFSET-PRESERVING SOURCE TOKENIZER (rich-content PLAN decision 6).\n *\n * Cuts stored markdown into blocks that cover the text EXACTLY: the\n * concatenation of every block's `raw` is the input, always, byte for byte.\n * Nothing is trimmed, normalized, or re-serialized here — the tokenizer only\n * draws boundaries. Every custom construct the platform stores (kinds and\n * `__kind` JSON, typed JSON blocks, special fences, XML sections including\n * attribute-bearing, mid-line and unknown containers, `{{variables}}`,\n * `<matrxcite/>`, math, raw HTML, code fences, HTML comments and pinned\n * anchors `<!--@a:…-->`) is an ISLAND: an atomic span no editor may parse\n * into its own model. Islands that sit inside running prose (a variable, a\n * citation, inline math) stay inside their paragraph as `inlines`, so a\n * visual editor keeps the paragraph whole and holds the island as an atom.\n *\n * Block kinds:\n * - `prose` — a markdown paragraph run (headings, lists, tables…): the only\n * thing a visual editor may re-serialize, and only when edited.\n * - `island` — a protected construct; `islandType` says which.\n * - `gap` — the line terminator(s) and blank lines between blocks. Never\n * edited; they keep the document's exact spacing.\n *\n * Streaming-tolerant: never throws on partial input. A construct whose\n * closer has not arrived yet becomes an island running to the end of the text\n * with `complete: false` — the same ownership rule the renderer's splitter\n * applies, so a half-streamed fence or XML section is never reflowed.\n *\n * Boundaries follow matrx-frontend's renderer splitter (`content-splitter-v2.ts`)\n * wherever it decides where a construct ends, so the editor and the renderer\n * agree on what is locked. Offsets are UTF-16 (`start`/`end`) and code points\n * (`startCp`/`endCp`).\n */\n\nimport { buildCodePointIndex } from \"./offsets\";\nimport {\n ALLOWED_RAW_HTML_TAGS,\n ATTRIBUTE_XML_NAMES,\n CITE_RE,\n HTML_BLOCK_LEVEL_TAGS,\n KNOWN_XML_TAG_NAMES,\n PINNED_ANCHOR_RE,\n SPECIAL_CODE_LANGUAGES,\n STRICT_VARIABLE_RE,\n THINKING_FAMILY,\n TREE_GLYPHS,\n TYPED_JSON_ROOT_KEYS,\n XML_TAG_BLOCK_NAMES,\n normalizeFenceLanguage,\n} from \"./constants\";\nimport { BacktickRuns, backtickRunLength, closeFence, fenceOpenerOf, type FenceLines, type FenceOpener } from \"./code-ranges\";\nimport { singleDollarMathEnd } from \"./math\";\nimport { pairDisplayMath, pendingCodeSpanStart, pendingDisplayMathOpener } from \"./math-pairs\";\nimport { XmlContainerTracker, readXmlTag } from \"./xml-tag\";\n\nexport type SourceBlockKind = \"prose\" | \"island\" | \"gap\";\n\n/** Island types that own whole blocks. */\nexport type BlockIslandType =\n /** ``` / ~~~ fenced code of any language (meta.lang, meta.special). */\n | \"fence\"\n /** A bare JSON object block — typed JSON, `__kind` instances, directives. */\n | \"json\"\n /** A known attribute-less XML region (`<thinking>`, `<flashcards>`, …). */\n | \"xml_region\"\n /** An attribute-bearing XML element (`<artifact …>`, `<decision …>`, …). */\n | \"xml_attr\"\n /** Any other line-leading, balanced XML element. */\n | \"xml_container\"\n /** Allow-listed raw HTML block. */\n | \"html_block\"\n /** `<!-- … -->` comment. */\n | \"html_comment\"\n /** A pinned annotation anchor `<!--@a:id-->`. */\n | \"anchor\"\n /** `$$ … $$` display math on its own lines. */\n | \"math_block\"\n /** YAML (`---`) or TOML (`+++`) front matter at the start of the text (meta.format). */\n | \"front_matter\"\n /** A box-drawing tree diagram. */\n | \"tree\"\n /**\n * A generic-directive container `:::name[label]{attrs}` … `:::` (tabs,\n * columns, details, figures, callouts, TOC — meta.name), a leaf directive\n * `::name` on its own line (meta.leaf), or a MkDocs admonition\n * `!!! type \"Title\"` / `??? type` with its indented body (meta.syntax \"mkdocs\").\n */\n | \"directive\"\n /** A GitHub alert / Obsidian callout: a blockquote opening `> [!TYPE]` (meta.name). */\n | \"callout\"\n /** A footnote definition `[^id]: …` with its indented continuation lines (meta.id). */\n | \"footnote_def\";\n\n/** Island types that live inside a prose block. */\nexport type InlineIslandType =\n | \"variable\"\n | \"cite\"\n | \"math_inline\"\n | \"html_tag\"\n | \"xml_tag\"\n | \"xml_inline\"\n | \"html_comment\"\n | \"anchor\"\n | \"kind_json\"\n | \"media_ref\"\n /** `[[Page]]`, `[[Page|alias]]` (meta.target) — or `![[Page]]` (meta.embed). */\n | \"wikilink\";\n\nexport type IslandType = BlockIslandType | InlineIslandType;\n\nexport type IslandMeta = Readonly<Record<string, string | number | boolean>>;\n\nexport interface SourceSpan {\n /** UTF-16 offset of the first code unit. */\n readonly start: number;\n /** UTF-16 offset just past the last code unit. */\n readonly end: number;\n /** Code-point offset of `start`. */\n readonly startCp: number;\n /** Code-point offset of `end`. */\n readonly endCp: number;\n /** Exactly `text.slice(start, end)`. */\n readonly raw: string;\n}\n\nexport interface SourceIsland extends SourceSpan {\n readonly islandType: IslandType;\n /** True when the island sits inside a prose block. */\n readonly inline: boolean;\n /** False when the construct's closer never arrived (streaming / malformed). */\n readonly complete: boolean;\n readonly meta: IslandMeta;\n}\n\nexport interface SourceBlock extends SourceSpan {\n readonly kind: SourceBlockKind;\n /** Set only on `island` blocks. */\n readonly islandType: BlockIslandType | null;\n readonly complete: boolean;\n readonly meta: IslandMeta;\n /** Inline islands of a `prose` block, in document order. Empty otherwise. */\n readonly inlines: readonly SourceIsland[];\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// helpers\n// ─────────────────────────────────────────────────────────────────────────\n\ninterface RawIsland {\n type: IslandType;\n start: number;\n end: number;\n complete: boolean;\n meta: Record<string, string | number | boolean>;\n}\n\ninterface RawBlock {\n kind: SourceBlockKind;\n start: number;\n end: number;\n island: RawIsland | null;\n inlines: RawIsland[];\n}\n\nconst NOT_WHITESPACE = /\\S/;\n/** `:::name`, `::name` (leaf) — a name right after the colons. */\nconst DIRECTIVE_OPEN = /^(:{2,})([A-Za-z][\\w-]*)/;\nconst MKDOCS_OPEN = /^(!!!|\\?\\?\\?\\+?)[ \\t]+([A-Za-z][\\w-]*)/;\nconst CALLOUT_OPEN = /^>[ \\t]*\\[!([A-Za-z][\\w-]*)\\]([+-])?/;\n/**\n * Every callout spelling the renderer resolves (matrx-frontend\n * components/markdown-core/syntax/callout-types.ts ALIASES — keep in step).\n */\nexport const CALLOUT_NAMES: ReadonlySet<string> = new Set([\n \"note\", \"seealso\", \"example\", \"tip\", \"hint\", \"important\", \"warning\", \"warn\", \"attention\",\n \"caution\", \"danger\", \"error\", \"failure\", \"fail\", \"missing\", \"bug\", \"info\", \"abstract\",\n \"summary\", \"tldr\", \"todo\", \"success\", \"check\", \"done\", \"question\", \"help\", \"faq\", \"quote\", \"cite\",\n]);\nconst FOOTNOTE_DEF = /^\\[\\^([^\\]\\s]+)\\]:/;\n\nfunction countStructuralBraces(source: string): { opens: number; closes: number } {\n let opens = 0;\n let closes = 0;\n let inString = false;\n let escaped = false;\n for (let i = 0; i < source.length; i++) {\n const char = source[i];\n if (inString) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === '\"') inString = false;\n continue;\n }\n if (char === '\"') inString = true;\n else if (char === \"{\") opens++;\n else if (char === \"}\") closes++;\n }\n return { opens, closes };\n}\n\nfunction firstJsonKey(content: string): string | null {\n const match = /^\\{\\s*\"([^\"]+)\"/.exec(content.trimStart());\n return match ? (match[1] as string) : null;\n}\n\n/** Describe a JSON object's platform identity for island meta. */\nfunction jsonMeta(content: string): Record<string, string | number | boolean> {\n const meta: Record<string, string | number | boolean> = {};\n const key = firstJsonKey(content);\n if (key) meta.firstKey = key;\n try {\n const parsed: unknown = JSON.parse(content.trim());\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n const kind = (parsed as Record<string, unknown>).__kind;\n if (typeof kind === \"string\" && kind.trim()) meta.kind = kind;\n }\n } catch {\n // partial or malformed — identity from the head only\n const head = /^\\{\\s*\"__kind\"\\s*:\\s*\"([^\"]*)\"/.exec(content.trimStart());\n if (head) meta.kind = head[1] as string;\n }\n if (typeof meta.kind === \"string\" && meta.kind.startsWith(\"directive_v\")) {\n meta.directive = true;\n }\n if (key === \"matrx_version\") meta.directive = true;\n if (key && TYPED_JSON_ROOT_KEYS[key]) meta.typed = TYPED_JSON_ROOT_KEYS[key] as string;\n return meta;\n}\n\n/** A JSON object head the renderer already treats as a typed/kind block mid-stream. */\nfunction isRecognizedJsonHead(content: string): boolean {\n const key = firstJsonKey(content);\n if (!key) return false;\n return key === \"__kind\" || key === \"matrx_version\" || key in TYPED_JSON_ROOT_KEYS;\n}\n\nfunction matchingJsonObjectEnd(source: string, start: number, limit: number): number | null {\n if (source[start] !== \"{\") return null;\n const stack: string[] = [\"{\"];\n let inString = false;\n let escaped = false;\n for (let index = start + 1; index < limit; index++) {\n const char = source[index];\n if (inString) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === '\"') inString = false;\n continue;\n }\n if (char === '\"') {\n inString = true;\n continue;\n }\n if (char === \"{\" || char === \"[\") {\n stack.push(char);\n continue;\n }\n if (char !== \"}\" && char !== \"]\") continue;\n const opening = stack.pop();\n if ((char === \"}\" && opening !== \"{\") || (char === \"]\" && opening !== \"[\")) return null;\n if (stack.length === 0) return index + 1;\n }\n return null;\n}\n\nfunction declaredKind(candidate: string): string | null {\n try {\n const parsed: unknown = JSON.parse(candidate);\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) return null;\n const kind = (parsed as Record<string, unknown>).__kind;\n return typeof kind === \"string\" && kind.trim() ? kind : null;\n } catch {\n return null;\n }\n}\n\n/** Splitter's `isUnclosedGenericXmlOpening`: an unknown opening tag still arriving. */\nfunction isUnclosedGenericXmlOpening(source: string): boolean {\n const text = source.trimStart();\n const prefix = /^<([A-Za-z_][\\w.:-]*)(?=\\s|\\/|$)/.exec(text);\n if (\n !prefix ||\n KNOWN_XML_TAG_NAMES.has(prefix[1] as string) ||\n ALLOWED_RAW_HTML_TAGS.has((prefix[1] as string).toLowerCase())\n )\n return false;\n let quote: string | null = null;\n for (let i = prefix[0].length; i < text.length; i++) {\n if (quote) {\n if (text[i] === quote) quote = null;\n } else if (text[i] === \"'\" || text[i] === '\"') quote = text[i] as string;\n else if (text[i] === \">\") return false;\n }\n return true;\n}\n\n/** The renderer splitter's `isTreeLine` (box glyphs OR ASCII connectors) — used only to stop a root walk-back. */\nfunction isSplitterTreeLine(line: string): boolean {\n return TREE_GLYPHS.test(line) || /^[\\s│|]*[├└+|][\\s─\\-]+/.test(line);\n}\n\nconst MEDIA_REF_PREFIXES = [\"[Image URL:\", \"[Video URL:\", \"[Audio URL:\"] as const;\n\n// ─────────────────────────────────────────────────────────────────────────\n// the tokenizer\n// ─────────────────────────────────────────────────────────────────────────\n\nclass Tokenizer {\n private readonly n: number;\n private readonly lineStarts: number[] = [];\n private readonly contentEnds: number[] = [];\n private readonly lineEnds: number[] = [];\n private readonly blocks: RawBlock[] = [];\n private readonly blockCache = new Map<number, RawIsland | null>();\n /** Lazily built: for line i, first line j >= i where brace net from i drops to <= 0. */\n private braceStop: Int32Array | null = null;\n private braceNet: Int32Array | null = null;\n /** Every occurrence offset of each needle searched so far (overlapping, like indexOf). */\n private readonly occurrences = new Map<string, number[]>();\n /** `$$` opener → closer for the pairs the core renders as math. */\n private readonly mathPairs: Map<number, number>;\n private readonly finder = (needle: string, from: number): number => this.next(needle, from);\n\n constructor(\n private readonly text: string,\n private readonly streaming = false,\n private readonly meter: { work: number } | undefined = undefined,\n ) {\n this.n = text.length;\n this.tick(text.length); // the line split below walks the whole text\n this.mathPairs = pairDisplayMath(text);\n // Streaming: a `$$` still waiting for its partner may yet turn what follows\n // into math, so nothing at or after it is an island yet (G5).\n this.provisionalFrom = streaming ? pendingDisplayMathOpener(text) : -1;\n if (this.provisionalFrom === -1) this.provisionalFrom = Number.POSITIVE_INFINITY;\n // Streaming: the pairing rule's code ranges depend on backtick / tilde runs\n // the next bytes can still complete (`` → ```, an inline span's closing `),\n // which can re-pair `$$` tokens already read. Pair the text as if each\n // completion had arrived; any `$$` paired differently is not settled.\n if (streaming && text.includes(\"$$\")) {\n // A code span the final paragraph may still close can swallow any `$$`\n // after its opener (the pairing rule's code spans run across lines).\n // Only `$$` readings can change: the first token after the span's opener,\n // and the opener of any pair whose closer lies after it.\n const span = pendingCodeSpanStart(text);\n if (span !== -1) {\n const firstToken = text.indexOf(\"$$\", span);\n if (firstToken !== -1) this.provisionalFrom = Math.min(this.provisionalFrom, firstToken);\n for (const [open, close] of this.mathPairs) {\n if (close >= span) this.provisionalFrom = Math.min(this.provisionalFrom, open);\n }\n }\n for (const pad of [\"`\", \"``\", \"```\", \"~~~\"]) {\n const alt = pairDisplayMath(text + pad);\n for (const [open, close] of this.mathPairs) {\n if (alt.get(open) !== close) this.provisionalFrom = Math.min(this.provisionalFrom, open);\n }\n for (const [open, close] of alt) {\n if (close < text.length && this.mathPairs.get(open) !== close) {\n this.provisionalFrom = Math.min(this.provisionalFrom, open);\n }\n }\n }\n }\n let start = 0;\n for (let i = 0; i < text.length; i++) {\n if (text.charCodeAt(i) === 10) {\n this.lineStarts.push(start);\n this.contentEnds.push(i > start && text.charCodeAt(i - 1) === 13 ? i - 1 : i);\n this.lineEnds.push(i + 1);\n start = i + 1;\n }\n }\n if (start < text.length || text.length === 0) {\n // Streaming: a final lone CR is the first half of a CRLF still arriving —\n // it is not content (once the LF lands it never is), so a construct\n // ending on this line does not shrink by one when it does (G5).\n this.pendingCR = streaming && text.length > start && text.charCodeAt(text.length - 1) === 13;\n this.lineStarts.push(start);\n this.contentEnds.push(this.pendingCR ? text.length - 1 : text.length);\n this.lineEnds.push(text.length);\n }\n }\n\n /** Streaming: where provisional text starts (a pending `$$`), or +∞. */\n private provisionalFrom = Number.POSITIVE_INFINITY;\n\n /** Streaming: the text ends in a lone CR whose LF has not arrived yet. */\n private pendingCR = false;\n\n /**\n * Streaming: an open last line that begins with `{` is undecided — each new\n * byte can balance or unbalance its braces and flip the whole line between\n * prose and a JSON island — and so is a line that is exactly one allowed\n * HTML tag so far; both are provisional until they end (G5).\n */\n private markOpenJsonTail(): void {\n const last = this.lineStarts.length - 1;\n if (!this.isOpenTail(last)) return;\n const start = this.lineStarts[last] as number;\n const t = this.lineText(last).trim();\n // A line that is (so far) exactly one allowed HTML tag becomes a block when\n // it ends, or stays prose if more arrives — undecided either way.\n const oneTag = t.startsWith(\"<\") ? readXmlTag(t, 0) : null;\n const loneTag = !!oneTag && oneTag.raw === t && ALLOWED_RAW_HTML_TAGS.has(oneTag.tagName.toLowerCase());\n if (t.startsWith(\"{\") || loneTag) {\n this.provisionalFrom = Math.min(this.provisionalFrom, start);\n }\n }\n\n /**\n * `text.indexOf(needle, from)` in O(log k): the first query for a needle\n * indexes all of its occurrences once, so repeated searches for a closer\n * that never comes stay linear over the whole text.\n */\n private next(needle: string, from: number): number {\n let list = this.occurrences.get(needle);\n if (!list) {\n list = [];\n for (let at = this.text.indexOf(needle); at !== -1; at = this.text.indexOf(needle, at + 1)) {\n list.push(at);\n }\n this.occurrences.set(needle, list);\n }\n let lo = 0;\n let hi = list.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if ((list[mid] as number) < from) lo = mid + 1;\n else hi = mid;\n }\n return lo < list.length ? (list[lo] as number) : -1;\n }\n\n /** Charge `n` visited characters to the diagnostic meter (complexity tests). */\n private tick(n: number): void {\n if (this.meter) this.meter.work += n;\n }\n\n /** Streaming only: a paragraph ending at `pe` may still be continued by a line not yet arrived. */\n private paragraphMayGrow(pe: number): boolean {\n if (!this.streaming) return false;\n const rest = this.n - pe;\n if (rest === 0) return true;\n const tail = this.text.slice(pe);\n return tail === \"\\n\" || tail === \"\\r\\n\" || tail === \"\\r\";\n }\n\n /** Streaming only: the final line, still waiting for its terminator. */\n private isOpenTail(k: number): boolean {\n return (\n this.streaming &&\n k === this.lineStarts.length - 1 &&\n (this.lineEnds[k] === this.contentEnds[k] || this.pendingCR)\n );\n }\n\n private get lineCount(): number {\n return this.lineStarts.length;\n }\n\n private lineOf(pos: number): number {\n let lo = 0;\n let hi = this.lineStarts.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >>> 1;\n if ((this.lineStarts[mid] as number) <= pos) lo = mid;\n else hi = mid - 1;\n }\n return lo;\n }\n\n private isBlank(from: number, to: number): boolean {\n return !NOT_WHITESPACE.test(this.text.slice(from, to));\n }\n\n private lineIsBlank(li: number): boolean {\n return this.isBlank(this.lineStarts[li] as number, this.contentEnds[li] as number);\n }\n\n private lineText(li: number): string {\n return this.text.slice(this.lineStarts[li] as number, this.contentEnds[li] as number);\n }\n\n run(): RawBlock[] {\n if (this.streaming) this.markOpenJsonTail();\n let pos = 0;\n while (pos < this.n) {\n const li = this.lineOf(pos);\n const ce = this.contentEnds[li] as number;\n if (this.isBlank(pos, ce)) {\n pos = this.gap(pos, li);\n continue;\n }\n if (pos >= this.provisionalFrom) {\n this.push({ kind: \"prose\", start: pos, end: this.n, island: null, inlines: [] });\n break;\n }\n const island = this.detectBlock(pos, li, true);\n if (island) {\n this.push({ kind: \"island\", start: island.start, end: island.end, island, inlines: [] });\n pos = island.end;\n continue;\n }\n pos = this.paragraph(pos, li);\n }\n return this.blocks;\n }\n\n private push(block: RawBlock): void {\n if (block.end <= block.start) return;\n if (block.kind === \"prose\" && this.isBlank(block.start, block.end)) {\n block = { kind: \"gap\", start: block.start, end: block.end, island: null, inlines: [] };\n }\n const last = this.blocks[this.blocks.length - 1];\n if (block.kind === \"gap\" && last && last.kind === \"gap\" && last.end === block.start) {\n last.end = block.end;\n return;\n }\n this.blocks.push(block);\n }\n\n private gap(pos: number, li: number): number {\n let end = this.lineEnds[li] as number;\n let k = li + 1;\n while (k < this.lineCount && this.lineIsBlank(k)) {\n end = this.lineEnds[k] as number;\n k++;\n }\n this.push({ kind: \"gap\", start: pos, end, island: null, inlines: [] });\n return end;\n }\n\n // ── block detection ────────────────────────────────────────────────────\n\n private detectBlock(p: number, li: number, atParaStart: boolean): RawIsland | null {\n const cacheKey = atParaStart ? -1 - p : p;\n if (this.blockCache.has(cacheKey)) return this.blockCache.get(cacheKey) ?? null;\n const found = this.detectBlockUncached(p, li, atParaStart);\n this.blockCache.set(cacheKey, found);\n return found;\n }\n\n private detectBlockUncached(p: number, li: number, atParaStart: boolean): RawIsland | null {\n const ce = this.contentEnds[li] as number;\n const seg = this.text.slice(p, ce);\n const t = seg.trimStart();\n const indent = seg.length - t.length;\n const tp = p + indent;\n\n if (p === 0) {\n const fm = this.frontMatter(li, t);\n if (fm) return fm;\n }\n // An indented `:::` / `> [!x]` under a list item belongs to that item:\n // the renderer draws it INSIDE the list, so it must stay in the list's\n // prose block — cutting it out would let an editor move it away from its\n // item (verify-RC-B8 round 2, SAFETY).\n const listNested = indent > 0 && this.inListContinuation(li);\n if (indent <= 3 && !listNested && t.startsWith(\"::\")) {\n const directive = this.directive(p, li, t);\n if (directive) return directive;\n }\n if (indent === 0 && (t.startsWith(\"!!!\") || t.startsWith(\"???\"))) {\n const admonition = this.mkdocsAdmonition(p, li, t);\n if (admonition) return admonition;\n }\n if (indent <= 3 && !listNested && t.startsWith(\">\")) {\n const callout = this.callout(p, li, t);\n if (callout) return callout;\n }\n if (atParaStart && indent <= 3 && t.startsWith(\"[^\")) {\n const footnote = this.footnoteDefinition(p, li, t);\n if (footnote) return footnote;\n }\n // THE one fence rule (source/code-ranges.ts): backtick at any indent, tilde at <= 3.\n const fence = fenceOpenerOf(seg);\n if (fence?.char === \"`\") return this.backtickFence(p, li, fence);\n if (fence?.char === \"~\") return this.tildeFence(p, li, fence);\n if (t.startsWith(\"$$\")) {\n const math = this.mathBlock(p, tp);\n if (math) return math;\n }\n if (t.startsWith(\"<\")) {\n const attr = this.attributeXml(p, tp, t);\n if (attr) return attr;\n const region = this.xmlRegion(p, tp, t);\n if (region) return region;\n const container = this.genericXml(p, li, seg, indent);\n if (container) return container;\n if (t.startsWith(\"<!--\")) {\n const comment = this.blockComment(p, tp, li);\n if (comment) return comment;\n }\n const html = this.htmlBlock(p, li, t, tp, atParaStart);\n if (html) return html;\n }\n if (t.startsWith(\"{\")) {\n const json = this.bareJson(p, li, tp);\n if (json) return json;\n }\n if (TREE_GLYPHS.test(t)) {\n const tree = this.tree(p, li);\n if (tree) return tree;\n }\n return null;\n }\n\n /** True when line `li` continues a list item (the nearest non-blank line above is a list item or indented text under one). */\n private inListContinuation(li: number): boolean {\n for (let k = li - 1; k >= 0; k--) {\n const line = this.lineText(k);\n if (!NOT_WHITESPACE.test(line)) continue;\n if (/^[ \\t]*(?:[-*+]|\\d{1,9}[.)])[ \\t]/.test(line)) return true;\n if (/^[ \\t]/.test(line)) continue;\n return false;\n }\n return false;\n }\n\n private island(\n type: IslandType,\n start: number,\n end: number,\n complete: boolean,\n meta: Record<string, string | number | boolean> = {},\n ): RawIsland {\n return { type, start, end, complete, meta };\n }\n\n private frontMatter(li: number, t: string): RawIsland | null {\n const fence = this.lineText(li);\n if ((fence !== \"---\" && fence !== \"+++\") || t !== fence) return null;\n const toml = fence === \"+++\";\n let sawContent = false;\n for (let k = li + 1; k < this.lineCount; k++) {\n const line = this.lineText(k);\n if (line === fence || (!toml && line === \"...\")) {\n return sawContent\n ? this.island(\"front_matter\", 0, this.contentEnds[k] as number, true, { format: toml ? \"toml\" : \"yaml\" })\n : null;\n }\n if (!NOT_WHITESPACE.test(line)) continue;\n const shaped = toml\n ? /^\\s*(?:[A-Za-z0-9_.\"-]+\\s*=|\\[|#)/.test(line)\n : /^(?:[A-Za-z0-9_\"'-][^:]*:(?:\\s|$)|\\s+\\S|-\\s|#)/.test(line);\n if (!shaped) return null;\n sawContent = true;\n }\n return null;\n }\n\n /**\n * `:::name[label]{attrs}` … closing `:::` (a colon run at least as long as\n * the opener's, nesting counted), or a leaf `::name[…]{…}` line. The whole\n * container is ONE island: its grammar (fence lengths, labels, attributes,\n * nested tabs) is exactly what a visual editor would re-serialize wrongly.\n */\n private directive(p: number, li: number, t: string): RawIsland | null {\n const open = DIRECTIVE_OPEN.exec(t);\n if (!open) return null;\n const colons = (open[1] as string).length;\n const name = open[2] as string;\n if (colons === 2) {\n return this.island(\"directive\", p, this.contentEnds[li] as number, true, { name, leaf: true });\n }\n const stack: number[] = [colons];\n for (let k = li + 1; k < this.lineCount; k++) {\n const line = this.lineText(k).trim();\n const inner = DIRECTIVE_OPEN.exec(line);\n if (inner && (inner[1] as string).length >= 3) {\n stack.push((inner[1] as string).length);\n continue;\n }\n const close = /^(:{3,})\\s*$/.exec(line);\n if (close && (close[1] as string).length >= (stack[stack.length - 1] as number)) {\n stack.pop();\n if (stack.length === 0) return this.island(\"directive\", p, this.contentEnds[k] as number, true, { name });\n }\n }\n return this.island(\"directive\", p, this.n, false, { name });\n }\n\n /** MkDocs `!!! type \"Title\"` / `??? type` / `???+ type` and its indented (or blank-separated indented) body. */\n private mkdocsAdmonition(p: number, li: number, t: string): RawIsland | null {\n const open = MKDOCS_OPEN.exec(t);\n if (!open) return null;\n let last = li;\n for (let k = li + 1; k < this.lineCount; k++) {\n const line = this.lineText(k);\n if (/^(?: {4}|\\t)/.test(line) && NOT_WHITESPACE.test(line)) {\n last = k;\n continue;\n }\n if (!NOT_WHITESPACE.test(line)) continue;\n break;\n }\n return this.island(\"directive\", p, this.contentEnds[last] as number, true, {\n name: (open[2] as string).toLowerCase(),\n syntax: \"mkdocs\",\n });\n }\n\n /** A blockquote whose first line is `> [!TYPE]…` — every following `>` line belongs to it. */\n private callout(p: number, li: number, t: string): RawIsland | null {\n const open = CALLOUT_OPEN.exec(t);\n // Only a name the renderer draws as a callout is one; `> [!BOGUS]` is an\n // ordinary quote there, so it stays editable prose here (verify-RC-B8).\n if (!open || !CALLOUT_NAMES.has((open[1] as string).toLowerCase())) return null;\n let last = li;\n for (let k = li + 1; k < this.lineCount; k++) {\n if (!/^ {0,3}>/.test(this.lineText(k))) break;\n last = k;\n }\n return this.island(\"callout\", p, this.contentEnds[last] as number, true, {\n name: (open[1] as string).toLowerCase(),\n ...(open[2] ? { fold: open[2] === \"-\" ? \"closed\" : \"open\" } : {}),\n });\n }\n\n /** `[^id]: text` plus its continuation lines (indented, or lazy text before a blank line). */\n private footnoteDefinition(p: number, li: number, t: string): RawIsland | null {\n const open = FOOTNOTE_DEF.exec(t);\n if (!open) return null;\n let last = li;\n for (let k = li + 1; k < this.lineCount; k++) {\n const line = this.lineText(k);\n if (!NOT_WHITESPACE.test(line)) {\n // A blank line continues the note only when an indented line follows.\n let j = k + 1;\n while (j < this.lineCount && !NOT_WHITESPACE.test(this.lineText(j))) j++;\n if (j < this.lineCount && /^(?: {4}|\\t)/.test(this.lineText(j))) {\n k = j - 1;\n continue;\n }\n break;\n }\n if (/^(?: {4}|\\t)/.test(line)) {\n last = k;\n continue;\n }\n // Streaming: an unterminated last line may still become `[^m]: …` (a new\n // note), a block, or this note's lazy continuation — undecided (G5, H1).\n // Checked BEFORE block detection: what that line is, is not known yet.\n if (this.isOpenTail(k)) return this.heldFootnote(p, open[1] as string);\n if (FOOTNOTE_DEF.test(line.trimStart()) || this.detectBlock(this.lineStarts[k] as number, k, false)) break;\n last = k;\n }\n const end = this.contentEnds[last] as number;\n // Streaming: a note that ends the text (at most one line terminator after\n // it) may still gain a lazy continuation line — held open, never settled,\n // until that is decided (verify-RC-B3 H1).\n if (this.paragraphMayGrow(end)) return this.heldFootnote(p, open[1] as string);\n return this.island(\"footnote_def\", p, end, true, { id: open[1] as string });\n }\n\n /** A footnote whose continuation is still arriving: open to the end of the text. */\n private heldFootnote(p: number, id: string): RawIsland {\n return this.island(\"footnote_def\", p, this.n, false, { id });\n }\n\n /** The text's lines as the one fence closer reads them (streaming: the open tail closes nothing). */\n private get fenceLines(): FenceLines {\n return {\n count: this.lineCount,\n line: (k) => this.lineText(k),\n openTail: (k) => this.isOpenTail(k),\n };\n }\n\n /**\n * Backtick fence — THE one closer (`closeFence`, source/code-ranges.ts): the\n * nested-fence rule for markdown fences with the strict-CommonMark retry, the\n * renderer's line-end closer, JSON-string awareness for ```json.\n */\n private backtickFence(p: number, li: number, opener: FenceOpener): RawIsland {\n const lang = opener.lang;\n const isJson = lang === \"json\";\n const normalized = normalizeFenceLanguage(lang);\n const meta: Record<string, string | number | boolean> = { fence: \"`\", ticks: opener.ticks, lang };\n if (normalized && SPECIAL_CODE_LANGUAGES.has(normalized)) meta.special = normalized;\n const end = closeFence(this.fenceLines, li, opener);\n if (end.closed) {\n return this.fenceIsland(p, this.contentEnds[end.line] as number, true, meta, li, end.line, isJson);\n }\n return this.fenceIsland(p, this.n, false, meta, li, this.lineCount, isJson);\n }\n\n private fenceIsland(\n p: number,\n end: number,\n complete: boolean,\n meta: Record<string, string | number | boolean>,\n openLine: number,\n closeLine: number,\n isJson: boolean,\n ): RawIsland {\n if (isJson && openLine + 1 < this.lineCount) {\n const bodyEnd =\n closeLine < this.lineCount ? (this.lineStarts[closeLine] as number) : this.n;\n const body = this.text.slice(this.lineStarts[openLine + 1] as number, Math.max(bodyEnd, this.lineStarts[openLine + 1] as number));\n if (body.trimStart().startsWith(\"{\")) Object.assign(meta, jsonMeta(body));\n }\n return this.island(\"fence\", p, end, complete, meta);\n }\n\n private tildeFence(p: number, li: number, opener: FenceOpener): RawIsland {\n const lang = opener.lang;\n const meta: Record<string, string | number | boolean> = { fence: \"~\", ticks: opener.ticks, lang };\n const normalized = normalizeFenceLanguage(lang);\n if (normalized && SPECIAL_CODE_LANGUAGES.has(normalized)) meta.special = normalized;\n const close = closeFence(this.fenceLines, li, opener);\n if (close.closed) {\n const tildeEnd = this.contentEnds[close.line] as number;\n const end = this.rendererOverflow(li + 1, close.line, tildeEnd);\n return this.island(\"fence\", p, end, end === this.n ? this.overflowComplete : true, meta);\n }\n return this.island(\"fence\", p, this.n, false, meta);\n }\n\n /** Completion of the last `rendererOverflow` that ran to the end of the text. */\n private overflowComplete = true;\n\n /**\n * The renderer's splitter does not know ~~~ fences: it reads the lines inside\n * one as ordinary lines, so a ```` ``` ```` fence (or an XML section, a JSON\n * block…) that STARTS inside the tilde fence can run past its closer. The\n * editor must lock at least what the renderer draws (verify-RC-B3 residual\n * R5), so a tilde island extends over every block the renderer would detect\n * starting inside it. Returns the island's end.\n */\n private rendererOverflow(firstLine: number, closeLine: number, tildeEnd: number): number {\n let end = tildeEnd;\n this.overflowComplete = true;\n for (let j = firstLine; j <= closeLine && j < this.lineCount; j++) {\n const start = this.lineStarts[j] as number;\n if (this.lineIsBlank(j)) continue;\n // The renderer sees no tildes: a ~~~ line (the closer included) opens\n // nothing, and skipping it BEFORE detection keeps this scan from ever\n // re-entering tildeFence (no recursion, however many ~~~ lines follow).\n if (fenceOpenerOf(this.lineText(j))?.char === \"~\") continue;\n const inner = this.detectBlockUncached(start, j, false);\n if (!inner) continue;\n if (inner.end > end) {\n end = inner.end;\n this.overflowComplete = inner.complete;\n }\n const lastLine = this.lineOf(Math.max(start, inner.end - 1));\n if (lastLine > j) j = lastLine;\n }\n return end;\n }\n\n /**\n * A line-leading `$$` that OPENS a math pair (source/math-pairs.ts — the\n * core's rule). A closer, an unpaired `$$`, or a prose pair is never a block:\n * a lone `$$` renders as literal text and locks nothing.\n */\n private mathBlock(p: number, tp: number): RawIsland | null {\n const close = this.mathPairs.get(tp);\n if (close === undefined) return null;\n const end = close + 2;\n const li = this.lineOf(tp);\n const ce = this.contentEnds[li] as number;\n // `$$x$$` followed by prose on its line is inline math inside a paragraph.\n if (end <= ce && !this.isBlank(end, ce)) return null;\n const endLine = this.lineOf(close);\n const endCe = this.contentEnds[endLine] as number;\n // A multi-line pair whose closer is followed by prose stays in its paragraph.\n if (endLine !== li && !this.isBlank(end, endCe)) return null;\n // Streaming: a closer on the still-open last line may yet be followed by\n // prose on that line (which makes it inline math in a paragraph), so the\n // block is not settled until the line ends (verify-RC-B3 residual R2′).\n // (An unsettled island runs to the end of the text, like every open island.)\n if (this.isOpenTail(endLine)) return this.island(\"math_block\", p, this.n, false, { delimiter: \"$$\" });\n return this.island(\"math_block\", p, end, true, { delimiter: \"$$\" });\n }\n\n /** `<artifact …>`, `<decision …>`, … at the start of a line. */\n private attributeXml(p: number, tp: number, t: string): RawIsland | null {\n for (const name of ATTRIBUTE_XML_NAMES) {\n const prefix = `<${name}`;\n if (!t.startsWith(prefix)) continue;\n const next = t[prefix.length];\n if (next !== \" \" && next !== \">\" && next !== \"/\" && next !== \"\\t\") continue;\n return this.attributeElement(name, p, tp, \"xml_attr\");\n }\n return null;\n }\n\n /** Opening tag at `tp` through its `</name>` (or to EOF when still streaming). */\n private attributeElement(\n name: string,\n p: number,\n tp: number,\n type: IslandType,\n ): RawIsland | null {\n const li = this.lineOf(tp);\n const ce = this.contentEnds[li] as number;\n const tag = readXmlTag(this.text, tp, this.finder);\n this.tick(tag ? tag.raw.length : 1);\n let openEnd: number;\n if (tag && !tag.isClosing) {\n if (tag.isSelfClosing) {\n return this.island(type, p, tp + tag.raw.length, true, { tag: name, selfClosing: true });\n }\n openEnd = tp + tag.raw.length;\n } else {\n const gt = this.next(\">\", tp);\n if (gt === -1) return this.island(type, p, this.n, false, { tag: name });\n if (gt >= ce) return null;\n openEnd = gt + 1;\n }\n const closer = `</${name}>`;\n const close = this.next(closer, openEnd);\n if (close === -1) return this.island(type, p, this.n, false, { tag: name });\n return this.island(type, p, close + closer.length, true, { tag: name });\n }\n\n /** `<thinking>`, `<flashcards>`, … — exact attribute-less openers. */\n private xmlRegion(p: number, tp: number, t: string): RawIsland | null {\n for (const name of XML_TAG_BLOCK_NAMES) {\n const opener = `<${name}>`;\n if (!t.startsWith(opener)) continue;\n const closer = `</${name}>`;\n const close = this.next(closer, tp + opener.length);\n if (close === -1) return this.island(\"xml_region\", p, this.n, false, { tag: name });\n return this.island(\"xml_region\", p, close + closer.length, true, { tag: name });\n }\n return null;\n }\n\n /** Line-leading unknown XML element — balanced by the renderer's own tracker. */\n private genericXml(p: number, li: number, seg: string, indent: number): RawIsland | null {\n const first = seg.slice(indent);\n const opening = readXmlTag(first, 0);\n if (opening && !opening.isClosing) {\n const root = opening.tagName;\n if (KNOWN_XML_TAG_NAMES.has(root) || ALLOWED_RAW_HTML_TAGS.has(root.toLowerCase())) {\n return null;\n }\n const tracker = new XmlContainerTracker(root);\n const firstEnd = tracker.consumeLine(seg, indent);\n if (firstEnd !== null) {\n return this.island(\"xml_container\", p, p + firstEnd, true, { tag: root });\n }\n for (let k = li + 1; k < this.lineCount; k++) {\n const end = tracker.consumeLine(this.lineText(k));\n if (end !== null) {\n return this.island(\"xml_container\", p, (this.lineStarts[k] as number) + end, true, {\n tag: root,\n });\n }\n }\n return this.island(\"xml_container\", p, this.n, false, { tag: root });\n }\n if (isUnclosedGenericXmlOpening(seg)) {\n return this.island(\"xml_container\", p, this.n, false, {});\n }\n return null;\n }\n\n private blockComment(p: number, tp: number, li: number): RawIsland | null {\n const close = this.next(\"-->\", tp + 4);\n if (close === -1) return this.island(\"html_comment\", p, this.n, false);\n const end = close + 3;\n const raw = this.text.slice(tp, end);\n const anchor = PINNED_ANCHOR_RE.exec(raw);\n const ce = this.contentEnds[li] as number;\n if (anchor) {\n // A pinned anchor followed by prose on its line is an inline marker.\n if (end <= ce && !this.isBlank(end, ce)) return null;\n return this.island(\"anchor\", p, end, true, { id: anchor[1] as string });\n }\n return this.island(\"html_comment\", p, end, true);\n }\n\n private htmlBlock(\n p: number,\n li: number,\n t: string,\n tp: number,\n atParaStart: boolean,\n ): RawIsland | null {\n const tag = readXmlTag(t, 0);\n if (!tag) return null;\n const name = tag.tagName.toLowerCase();\n if (!ALLOWED_RAW_HTML_TAGS.has(name)) return null;\n if (name === \"pre\" && !tag.isClosing) {\n const closer = /<\\/pre\\s*>/gi;\n closer.lastIndex = tp;\n const close = closer.exec(this.text);\n if (!close) return this.island(\"html_block\", p, this.n, false, { tag: name });\n return this.island(\"html_block\", p, close.index + close[0].length, true, { tag: name });\n }\n const typeSix = HTML_BLOCK_LEVEL_TAGS.has(name);\n // A line that is only one tag opens a block; while that line is still\n // arriving, more bytes can make it prose, so it decides nothing (G5).\n const loneTag = atParaStart && t.trimEnd() === tag.raw;\n if (loneTag && this.isOpenTail(li)) {\n // Undecided: this becomes a block when the line ends here, or prose if\n // more arrives. Hold it (and the rest) provisional (G5).\n this.provisionalFrom = Math.min(this.provisionalFrom, p);\n return null;\n }\n const typeSeven = loneTag;\n if (!typeSix && !typeSeven) return null;\n let end = this.contentEnds[li] as number;\n for (let k = li + 1; k < this.lineCount && !this.lineIsBlank(k); k++) {\n end = this.contentEnds[k] as number;\n }\n return this.island(\"html_block\", p, end, true, { tag: name });\n }\n\n private buildBraceTables(): void {\n const count = this.lineCount;\n // prefix[i] = net braces over lines [0, i)\n const prefix = new Int32Array(count + 1);\n for (let i = 0; i < count; i++) {\n const { opens, closes } = countStructuralBraces(this.lineText(i));\n prefix[i + 1] = (prefix[i] as number) + opens - closes;\n }\n // stop[i] = smallest j >= i with prefix[j + 1] <= prefix[i], or -1.\n const stop = new Int32Array(count).fill(-1);\n const stack: number[] = [];\n // Next index m > i (over prefix positions) with prefix[m] <= prefix[i].\n for (let m = 0; m <= count; m++) {\n const value = prefix[m] as number;\n while (stack.length && (prefix[stack[stack.length - 1] as number] as number) >= value) {\n const i = stack.pop() as number;\n if (i < count) stop[i] = m - 1;\n }\n stack.push(m);\n }\n this.braceNet = prefix;\n this.braceStop = stop;\n }\n\n /** A line-leading bare JSON object — the splitter's structural brace walk. */\n private bareJson(p: number, li: number, tp: number): RawIsland | null {\n let lastLine: number | null = null;\n let net = 0;\n if (p === (this.lineStarts[li] as number)) {\n if (!this.braceStop || !this.braceNet) this.buildBraceTables();\n const stop = (this.braceStop as Int32Array)[li] as number;\n if (stop !== -1) {\n lastLine = stop;\n net =\n ((this.braceNet as Int32Array)[stop + 1] as number) -\n ((this.braceNet as Int32Array)[li] as number);\n }\n } else {\n let running = 0;\n for (let k = li; k < this.lineCount; k++) {\n const line = k === li ? this.text.slice(tp, this.contentEnds[li] as number) : this.lineText(k);\n const { opens, closes } = countStructuralBraces(line);\n running += opens - closes;\n if (running <= 0) {\n lastLine = k;\n net = running;\n break;\n }\n }\n }\n if (lastLine === null) {\n // Only the head decides; the whole tail is read once, when it is ours.\n if (isRecognizedJsonHead(this.text.slice(tp, tp + 512))) {\n return this.island(\"json\", p, this.n, false, jsonMeta(this.text.slice(tp)));\n }\n return null;\n }\n if (net !== 0) return null;\n const end = this.contentEnds[lastLine] as number;\n const content = this.text.slice(tp, end).trim();\n try {\n const parsed: unknown = JSON.parse(content);\n if (parsed === null || typeof parsed !== \"object\") return null;\n } catch {\n return null;\n }\n return this.island(\"json\", p, end, true, jsonMeta(content));\n }\n\n private tree(p: number, li: number): RawIsland | null {\n let treeLines = 0;\n let lastTree = li;\n let k = li;\n while (k < this.lineCount) {\n if (this.lineIsBlank(k)) {\n k++;\n continue;\n }\n if (!TREE_GLYPHS.test(this.lineText(k))) break;\n treeLines++;\n lastTree = k;\n k++;\n }\n if (treeLines < 3) return null;\n return this.island(\"tree\", p, this.contentEnds[lastTree] as number, true);\n }\n\n // ── prose ──────────────────────────────────────────────────────────────\n\n private paragraph(pos: number, li: number): number {\n let end = this.contentEnds[li] as number;\n let breakLine = -1;\n for (let k = li + 1; k < this.lineCount; k++) {\n if (this.lineIsBlank(k)) break;\n if (this.detectBlock(this.lineStarts[k] as number, k, false)) {\n breakLine = k;\n break;\n }\n end = this.contentEnds[k] as number;\n }\n\n // A tree's root label (the non-blank, glyph-free, non-heading lines\n // directly above its first connector) belongs to the tree — the renderer\n // splitter's findTreeBlockStart.\n if (breakLine !== -1) {\n const breakIsland = this.detectBlock(this.lineStarts[breakLine] as number, breakLine, false);\n if (breakIsland?.type === \"tree\") {\n let root = breakLine;\n for (let j = breakLine - 1; j >= li; j--) {\n const trimmed = this.lineText(j).trim();\n if (!trimmed || isSplitterTreeLine(trimmed) || /^#{1,6}\\s/.test(trimmed)) break;\n root = j;\n }\n if (root < breakLine) {\n const treeStart = root === li ? pos : (this.lineStarts[root] as number);\n const tree = { ...breakIsland, start: treeStart };\n if (treeStart > pos) {\n const proseEnd = this.contentEnds[root - 1] as number;\n const scan = this.scanInline(pos, proseEnd);\n if (!scan.breakIsland) {\n this.push({ kind: \"prose\", start: pos, end: proseEnd, island: null, inlines: scan.inlines });\n this.push({ kind: \"gap\", start: proseEnd, end: treeStart, island: null, inlines: [] });\n this.push({ kind: \"island\", start: treeStart, end: tree.end, island: tree, inlines: [] });\n return tree.end;\n }\n } else {\n this.push({ kind: \"island\", start: treeStart, end: tree.end, island: tree, inlines: [] });\n return tree.end;\n }\n }\n }\n }\n\n const scan = this.scanInline(pos, end);\n if (!scan.breakIsland) {\n this.push({ kind: \"prose\", start: pos, end, island: null, inlines: scan.inlines });\n return end;\n }\n const br = scan.breakIsland;\n if (scan.orphan) {\n // The continuation half of a thinking region split across persisted\n // parts: everything since the last island is region body (splitter 3d).\n let start = pos;\n while (this.blocks.length) {\n const last = this.blocks[this.blocks.length - 1] as RawBlock;\n if (last.kind === \"island\") break;\n this.blocks.pop();\n start = last.start;\n }\n const island = { ...br, start };\n this.push({ kind: \"island\", start, end: island.end, island, inlines: [] });\n return island.end;\n }\n this.push({\n kind: \"prose\",\n start: pos,\n end: br.start,\n island: null,\n inlines: scan.inlines.filter((inline) => inline.end <= br.start),\n });\n this.push({ kind: \"island\", start: br.start, end: br.end, island: br, inlines: [] });\n return br.end;\n }\n\n private scanInline(\n ps: number,\n pe: number,\n ): { inlines: RawIsland[]; breakIsland: RawIsland | null; orphan: boolean } {\n const text = this.text;\n const inlines: RawIsland[] = [];\n this.tick(pe - ps); // the scan below visits each position of the paragraph at most once\n const hasKind = text.slice(ps, pe).includes(\"__kind\");\n // Embedded-kind JSON probing is capped per paragraph so a paragraph full\n // of unclosed `{\"…` stays linear; a candidate longer than the cap stays prose.\n let kindBudget = 4 * (pe - ps) + 65536;\n const stop = (island: RawIsland, orphan = false) => ({ inlines, breakIsland: island, orphan });\n const within = (needle: string, from: number): number => {\n const at = this.next(needle, from);\n return at !== -1 && at + needle.length <= pe ? at : -1;\n };\n let runs: BacktickRuns | null = null;\n /** First maximal backtick run of exactly `n` starting at or after `from`, within the paragraph (THE pairing table). */\n const codeSpanClose = (n: number, from: number): number => {\n if (!runs) {\n this.tick(pe - ps); // one pass builds the backtick-run table\n runs = new BacktickRuns(text, ps, pe);\n }\n const at = runs.next(n, from);\n return at !== -1 && at + n <= pe ? at : -1;\n };\n\n let i = ps;\n // The paragraph's END is computed exactly as one-shot computes it (so its\n // islands are read the same way); only what is REPORTED stops at the\n // provisional point.\n const scanEnd = Math.min(pe, this.provisionalFrom);\n while (i < scanEnd) {\n const ch = text[i];\n if (ch === \"\\\\\") {\n const nextCh = text[i + 1];\n if (nextCh === \"(\" || nextCh === \"[\") {\n const close = within(nextCh === \"(\" ? \"\\\\)\" : \"\\\\]\", i + 2);\n if (close !== -1) {\n inlines.push(this.island(\"math_inline\", i, close + 2, true, { delimiter: nextCh === \"(\" ? \"\\\\(\" : \"\\\\[\" }));\n i = close + 2;\n continue;\n }\n }\n i += 2;\n continue;\n }\n if (ch === \"`\") {\n const n = backtickRunLength(text, i);\n const close = codeSpanClose(n, i + n);\n // Streaming: while the paragraph can still grow — nothing follows it\n // but at most one line terminator, so the next line may join it — an\n // unclosed backtick run may yet be closed and turn everything after it\n // into code. Nothing after it is an island until then (G5 / flicker).\n if (close === -1 && this.streaming && this.paragraphMayGrow(pe)) {\n return { inlines, breakIsland: null, orphan: false };\n }\n i = close === -1 ? i + n : close + n;\n continue;\n }\n if (ch === \"$\") {\n if (text[i + 1] === \"$\") {\n const close = this.mathPairs.get(i);\n if (close === undefined) {\n i += 2;\n continue;\n }\n if (close + 2 > pe) return stop(this.island(\"math_block\", i, close + 2, true, { delimiter: \"$$\" }));\n inlines.push(this.island(\"math_inline\", i, close + 2, true, { delimiter: \"$$\" }));\n i = close + 2;\n continue;\n }\n const end = singleDollarMathEnd(text, i, pe);\n this.tick(end > 0 ? end - i : Math.min(403, pe - i));\n // Streaming: a closing `$` that is the last byte so far is undecided —\n // the next byte (a digit) can turn it back into currency, and anything\n // else makes the whole span math. Either way nothing from its opener\n // on is settled yet (G4, G5).\n if (end > 0 && this.streaming && end === this.n) {\n this.provisionalFrom = Math.min(this.provisionalFrom, i);\n return { inlines, breakIsland: null, orphan: false };\n }\n if (end > 0) {\n inlines.push(this.island(\"math_inline\", i, end, true, { delimiter: \"$\" }));\n i = end;\n continue;\n }\n i++;\n continue;\n }\n if (ch === \"{\") {\n if (text[i + 1] === \"{\") {\n const close = this.next(\"}}\", i + 2);\n if (\n close !== -1 &&\n close + 2 <= pe &&\n close - i <= 200 &&\n !text.slice(i, close).includes(\"\\n\")\n ) {\n const raw = text.slice(i, close + 2);\n const strict = STRICT_VARIABLE_RE.exec(raw);\n inlines.push(\n this.island(\"variable\", i, close + 2, true, strict ? { name: strict[1] as string } : { template: true }),\n );\n i = close + 2;\n continue;\n }\n i += 2;\n continue;\n }\n if (hasKind && kindBudget > 0 && /^\\{\\s*\"/.test(text.slice(i, i + 64))) {\n const limit = Math.min(pe, i + 65536);\n const end = matchingJsonObjectEnd(text, i, limit);\n kindBudget -= (end ?? limit) - i;\n this.tick((end ?? limit) - i);\n if (end !== null) {\n const kind = declaredKind(text.slice(i, end));\n if (kind) {\n inlines.push(this.island(\"kind_json\", i, end, true, jsonMeta(text.slice(i, end))));\n i = end;\n continue;\n }\n }\n }\n i++;\n continue;\n }\n if ((ch === \"[\" && text[i + 1] === \"[\") || (ch === \"!\" && text[i + 1] === \"[\" && text[i + 2] === \"[\")) {\n const open = ch === \"!\" ? i + 3 : i + 2;\n const close = within(\"]]\", open);\n const newline = this.next(\"\\n\", open);\n const inner = close === -1 ? \"\" : text.slice(open, close);\n if (close !== -1 && (newline === -1 || newline > close) && inner.trim() && !/[[\\]]/.test(inner)) {\n const cut = inner.search(/\\\\?\\|/);\n const target = (cut < 0 ? inner : inner.slice(0, cut)).trim();\n inlines.push(\n this.island(\"wikilink\", i, close + 2, true, ch === \"!\" ? { target, embed: true } : { target }),\n );\n i = close + 2;\n continue;\n }\n }\n if (ch === \"[\") {\n const media = MEDIA_REF_PREFIXES.find((prefix) => text.startsWith(prefix, i));\n if (media) {\n const close = within(\"]\", i + media.length);\n const newline = this.next(\"\\n\", i);\n if (close !== -1 && (newline === -1 || newline > close)) {\n inlines.push(this.island(\"media_ref\", i, close + 1, true, { media: media.slice(1, 6).toLowerCase() }));\n i = close + 1;\n continue;\n }\n }\n i++;\n continue;\n }\n if (ch === \"<\") {\n if (text.startsWith(\"<!--\", i)) {\n const close = this.next(\"-->\", i + 4);\n if (close === -1) return stop(this.island(\"html_comment\", i, this.n, false));\n const end = close + 3;\n const anchor = end - i <= 64 ? PINNED_ANCHOR_RE.exec(text.slice(i, end)) : null;\n const type: IslandType = anchor ? \"anchor\" : \"html_comment\";\n const meta = anchor ? { id: anchor[1] as string } : {};\n if (end > pe) return stop(this.island(type, i, end, true, meta));\n inlines.push(this.island(type, i, end, true, meta));\n i = end;\n continue;\n }\n const cite = CITE_RE.exec(text.slice(i, i + 64));\n if (cite) {\n inlines.push(this.island(\"cite\", i, i + cite[0].length, true, { n: Number(cite[1]) }));\n i += cite[0].length;\n continue;\n }\n const tag = readXmlTag(text, i, this.finder);\n this.tick(tag ? tag.raw.length : 1);\n if (tag && i + tag.raw.length <= pe) {\n const name = tag.tagName;\n const tagEnd = i + tag.raw.length;\n const isAttr = ATTRIBUTE_XML_NAMES.includes(name);\n const isThinking = THINKING_FAMILY.includes(name) && tag.raw === `<${name}>`;\n if (!tag.isClosing && (isAttr || isThinking)) {\n if (tag.isSelfClosing) {\n inlines.push(this.island(\"xml_inline\", i, tagEnd, true, { tag: name, selfClosing: true }));\n i = tagEnd;\n continue;\n }\n const closer = `</${name}>`;\n const close = this.next(closer, tagEnd);\n const blockType: IslandType = isAttr ? \"xml_attr\" : \"xml_region\";\n if (close === -1) return stop(this.island(blockType, i, this.n, false, { tag: name }));\n const end = close + closer.length;\n if (end > pe) return stop(this.island(blockType, i, end, true, { tag: name }));\n inlines.push(this.island(\"xml_inline\", i, end, true, { tag: name }));\n i = end;\n continue;\n }\n if (tag.isClosing && THINKING_FAMILY.includes(name)) {\n return stop(this.island(\"xml_region\", i, tagEnd, true, { tag: name, continuation: true }), true);\n }\n const lower = name.toLowerCase();\n inlines.push(\n this.island(ALLOWED_RAW_HTML_TAGS.has(lower) ? \"html_tag\" : \"xml_tag\", i, tagEnd, true, {\n tag: name,\n }),\n );\n i = tagEnd;\n continue;\n }\n // An attribute-bearing opener still arriving (no `>` anywhere yet).\n const pending = ATTRIBUTE_XML_NAMES.find(\n (name) => text.startsWith(`<${name}`, i) && /\\s/.test(text[i + name.length + 1] ?? \"\"),\n );\n if (pending && this.next(\">\", i) === -1) {\n return stop(this.island(\"xml_attr\", i, this.n, false, { tag: pending }));\n }\n i++;\n continue;\n }\n i++;\n }\n return { inlines, breakIsland: null, orphan: false };\n }\n}\n\n/**\n * Cut `text` into blocks whose raw concatenation is exactly `text`.\n * Never throws; unclosed constructs are islands with `complete: false`.\n */\nexport interface TokenizeOptions {\n /**\n * The text is a prefix of a message still arriving. The final line (no\n * terminator yet) can still grow — a bare ``` there may become ```bash — so\n * it closes no fence until its newline arrives (verify-RC-B3 residual R2).\n * Omit for stored text: a complete document's last line is final.\n */\n readonly streaming?: boolean;\n /**\n * DIAGNOSTIC — complexity tests only. When given, every loop that walks the\n * text itself adds the characters it visits to `meter.work`, so a test can\n * assert the tokenizer's work grows linearly with its input (deterministic,\n * unlike wall-clock timing). Loops over a slice are not charged here: the\n * slice's own cost covers them. Omit in production.\n */\n readonly meter?: { work: number };\n}\n\nexport function tokenizeSource(text: string, options: TokenizeOptions = {}): SourceBlock[] {\n const raw = new Tokenizer(text, options.streaming ?? false, options.meter).run();\n const cp = buildCodePointIndex(text);\n const inline = (island: RawIsland): SourceIsland => ({\n islandType: island.type,\n inline: true,\n complete: island.complete,\n meta: island.meta,\n start: island.start,\n end: island.end,\n startCp: cp.toCodePoint(island.start),\n endCp: cp.toCodePoint(island.end),\n raw: text.slice(island.start, island.end),\n });\n return raw.map(\n (block): SourceBlock => ({\n kind: block.kind,\n islandType: (block.island?.type as BlockIslandType | undefined) ?? null,\n complete: block.island ? block.island.complete : true,\n meta: block.island?.meta ?? {},\n inlines: block.inlines.map(inline),\n start: block.start,\n end: block.end,\n startCp: cp.toCodePoint(block.start),\n endCp: cp.toCodePoint(block.end),\n raw: text.slice(block.start, block.end),\n }),\n );\n}\n\n/** The exact source the blocks were cut from. */\nexport function joinSource(blocks: readonly SourceBlock[]): string {\n let out = \"\";\n for (const block of blocks) out += block.raw;\n return out;\n}\n\n/** Every island — block-level and inline — in document order. */\nexport function listIslands(blocks: readonly SourceBlock[]): SourceIsland[] {\n const out: SourceIsland[] = [];\n for (const block of blocks) {\n if (block.kind === \"island\" && block.islandType) {\n out.push({\n islandType: block.islandType,\n inline: false,\n complete: block.complete,\n meta: block.meta,\n start: block.start,\n end: block.end,\n startCp: block.startCp,\n endCp: block.endCp,\n raw: block.raw,\n });\n } else {\n // A loop, never a spread: a block can hold 100k+ inline islands and a\n // spread passes each as a call argument (RangeError, residual R3).\n for (const inline of block.inlines) out.push(inline);\n }\n }\n return out;\n}\n\n/** The block containing UTF-16 offset `offset` (the later block at a boundary). */\nexport function blockAt(blocks: readonly SourceBlock[], offset: number): SourceBlock | null {\n let lo = 0;\n let hi = blocks.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const block = blocks[mid] as SourceBlock;\n if (offset < block.start) hi = mid - 1;\n else if (offset >= block.end) lo = mid + 1;\n else return block;\n }\n return null;\n}\n","/**\n * SAVE = SPLICE (rich-content PLAN decision 6).\n *\n * An editor never hands back a whole re-serialized document. It hands back\n * per-block replacements for exactly the blocks the person changed; every\n * other byte of the stored text is written back as it was. This module\n * applies those replacements and returns:\n *\n * - the new text,\n * - a change set (old range → new range, in UTF-16 AND code points,\n * narrowed to the bytes that actually differ) that the annotation layer\n * uses to carry every live anchor through the save\n * (STORE-DESIGN §3.19 — the ProseMirror / Google Docs position-mapping\n * model), and\n * - an integrity guarantee: every island not explicitly replaced must still\n * be the same island, at its mapped position, in the new text. An edit\n * that opens an unclosed fence and swallows a kind below it is REFUSED.\n *\n * ISLANDS CHANGE ONLY THROUGH `islandEdit`. A prose/range edit must hand back\n * every island inside its range byte-identical and in order (a visual editor\n * holds them as atoms); if one is altered or dropped the save throws\n * `SourceSpliceError(\"island_edit\")` naming the island. A kind editor or code\n * view changes an island with `islandEdit(island, newRaw)`.\n *\n * A no-edit save (or edits whose text equals the original block) returns the\n * original string itself — byte-identical, zero changes.\n */\n\nimport { buildCodePointIndex, splitsSurrogatePair } from \"./offsets\";\nimport {\n joinSource,\n listIslands,\n tokenizeSource,\n type IslandType,\n type SourceBlock,\n type SourceIsland,\n} from \"./tokenize\";\n\n/**\n * Replace `[start, end)` (UTF-16) of the original with `text`. A plain edit\n * starts and ends on block boundaries; an island edit (`island: true`, made by\n * `islandEdit`) names exactly one island's span.\n */\nexport interface SourceEdit {\n readonly start: number;\n readonly end: number;\n readonly text: string;\n readonly island?: boolean;\n}\n\nexport interface SourceChange {\n /** The block-aligned range the edit named, in the ORIGINAL text. */\n readonly blockStart: number;\n readonly blockEnd: number;\n /** The narrowed range that actually differs: old text … */\n readonly oldStart: number;\n readonly oldEnd: number;\n /** … and where its replacement sits in the NEW text. */\n readonly newStart: number;\n readonly newEnd: number;\n readonly oldStartCp: number;\n readonly oldEndCp: number;\n readonly newStartCp: number;\n readonly newEndCp: number;\n}\n\nexport interface DisturbedIsland {\n readonly islandType: IslandType;\n readonly inline: boolean;\n /** Where the island was in the original (UTF-16). */\n readonly start: number;\n readonly end: number;\n /** Where it should have been in the new text. */\n readonly mappedStart: number;\n}\n\nexport interface SpliceIntegrity {\n /** True when every untouched island survived intact and outside bytes are identical. */\n readonly ok: boolean;\n /** Always true by construction; checked anyway because it is THE guarantee. */\n readonly bytesOutsideEditsIdentical: boolean;\n readonly disturbed: readonly DisturbedIsland[];\n}\n\nexport interface SpliceResult {\n readonly text: string;\n readonly changed: boolean;\n readonly changes: readonly SourceChange[];\n readonly integrity: SpliceIntegrity;\n /** Tokenization of the new text. */\n readonly blocks: readonly SourceBlock[];\n}\n\nexport type SourceSpliceErrorCode =\n | \"out_of_range\"\n | \"misaligned\"\n | \"overlap\"\n | \"stale_blocks\"\n | \"island_edit\"\n | \"integrity\";\n\nexport class SourceSpliceError extends Error {\n constructor(\n readonly code: SourceSpliceErrorCode,\n message: string,\n ) {\n super(message);\n this.name = \"SourceSpliceError\";\n }\n}\n\nexport interface SpliceOptions {\n /** The tokenization of `original`, when the caller already holds it. */\n readonly blocks?: readonly SourceBlock[];\n /**\n * Default `true`: a save that disturbs any island it did not explicitly\n * replace throws `SourceSpliceError(\"integrity\")`. `false` is for TOOLING\n * ONLY (diagnostic scripts that want the report instead of the refusal) —\n * no editor or persistence path may pass it.\n */\n readonly requireIntegrity?: boolean;\n}\n\n/** An edit that replaces one block's raw text. */\nexport function blockEdit(block: SourceBlock, text: string): SourceEdit {\n return { start: block.start, end: block.end, text };\n}\n\n/** The one door that changes an island: replace exactly its span with `text`. */\nexport function islandEdit(\n island: { readonly start: number; readonly end: number },\n text: string,\n): SourceEdit {\n return { start: island.start, end: island.end, text, island: true };\n}\n\n/** An edit that replaces a contiguous run of blocks `[first, last]`. */\nexport function blockRangeEdit(first: SourceBlock, last: SourceBlock, text: string): SourceEdit {\n return { start: first.start, end: last.end, text };\n}\n\n/**\n * Where an island's raw text sits in a replacement, at or after `from`, or -1\n * when the island is gone. Candidates: the island's own position measured from\n * the previous island and from the end of the edit, plus the nearest\n * occurrences either side. When the island's bytes occur more than once — a\n * copy inside a code span, or an insertion that itself contains a copy\n * (verify-RC-B3 residual R1) — the candidate whose surroundings still match\n * the original text wins, so a coincidental copy at the expected offset never\n * steals the island.\n */\nconst CONTEXT_WINDOW = 64;\n\nfunction locateIsland(\n text: string,\n raw: string,\n from: number,\n expected: number,\n expectedFromEnd: number,\n oldText: string,\n oldStart: number,\n oldEnd: number,\n): number {\n const candidates = new Set<number>();\n if (expected >= from && text.startsWith(raw, expected)) candidates.add(expected);\n if (expectedFromEnd >= from && text.startsWith(raw, expectedFromEnd)) candidates.add(expectedFromEnd);\n const after = text.indexOf(raw, Math.max(from, expected));\n if (after !== -1) candidates.add(after);\n const before = expected > from ? text.lastIndexOf(raw, expected) : -1;\n if (before >= from) candidates.add(before);\n if (candidates.size === 0) return text.indexOf(raw, from);\n if (candidates.size === 1) return candidates.values().next().value as number;\n let best = -1;\n let bestScore = -1;\n for (const at of candidates) {\n let score = 0;\n // Matching bytes just after the island …\n for (let k = 0; k < CONTEXT_WINDOW; k++) {\n const n = text[at + raw.length + k];\n if (n === undefined || n !== oldText[oldEnd + k]) break;\n score++;\n }\n // … and just before it.\n for (let k = 1; k <= CONTEXT_WINDOW; k++) {\n const n = text[at - k];\n if (n === undefined || n !== oldText[oldStart - k]) break;\n score++;\n }\n if (score > bestScore || (score === bestScore && at === expected)) {\n best = at;\n bestScore = score;\n }\n }\n return best;\n}\n\nfunction commonPrefix(a: string, b: string): number {\n const max = Math.min(a.length, b.length);\n let i = 0;\n while (i < max && a.charCodeAt(i) === b.charCodeAt(i)) i++;\n if (i > 0 && (splitsSurrogatePair(a, i) || splitsSurrogatePair(b, i))) i--;\n return i;\n}\n\nfunction commonSuffix(a: string, b: string, prefix: number): number {\n const max = Math.min(a.length, b.length) - prefix;\n let i = 0;\n while (i < max && a.charCodeAt(a.length - 1 - i) === b.charCodeAt(b.length - 1 - i)) i++;\n if (i > 0 && (splitsSurrogatePair(a, a.length - i) || splitsSurrogatePair(b, b.length - i))) i--;\n return i;\n}\n\n/**\n * Apply block-aligned replacements to `original`. Bytes outside the edits are\n * copied, never rebuilt; an edit equal to its block changes nothing.\n */\nexport function spliceSave(\n original: string,\n edits: readonly SourceEdit[],\n options: SpliceOptions = {},\n): SpliceResult {\n const blocks = options.blocks ?? tokenizeSource(original);\n if (options.blocks && joinSource(blocks) !== original) {\n throw new SourceSpliceError(\"stale_blocks\", \"the blocks passed in were not cut from this original text\");\n }\n\n const boundaries = new Set<number>([0, original.length]);\n for (const block of blocks) {\n boundaries.add(block.start);\n boundaries.add(block.end);\n }\n const islands = listIslands(blocks);\n const islandAt = new Map<string, SourceIsland>();\n for (const island of islands) islandAt.set(`${island.start}:${island.end}`, island);\n\n const sorted = [...edits].sort((a, b) => a.start - b.start || a.end - b.end);\n let previousEnd = -1;\n for (const edit of sorted) {\n if (edit.start < 0 || edit.end > original.length || edit.start > edit.end) {\n throw new SourceSpliceError(\"out_of_range\", `edit [${edit.start}, ${edit.end}) is outside the text`);\n }\n if (edit.island) {\n if (!islandAt.has(`${edit.start}:${edit.end}`)) {\n throw new SourceSpliceError(\n \"misaligned\",\n `islandEdit [${edit.start}, ${edit.end}) does not name an island's exact span`,\n );\n }\n } else if (!boundaries.has(edit.start) || !boundaries.has(edit.end)) {\n throw new SourceSpliceError(\n \"misaligned\",\n `edit [${edit.start}, ${edit.end}) does not start and end on block boundaries`,\n );\n }\n if (edit.start < previousEnd) {\n throw new SourceSpliceError(\"overlap\", `edit [${edit.start}, ${edit.end}) overlaps the previous edit`);\n }\n previousEnd = edit.end;\n }\n\n // Split every edit into the byte ranges that actually differ. A plain edit\n // must carry each island inside its range through byte-identical and in\n // order; the text between islands is diffed segment by segment.\n interface Narrowed {\n oldStart: number;\n oldEnd: number;\n replacement: string;\n }\n const effective: Narrowed[] = [];\n const replacedIslands = new Set<string>();\n const pushSegment = (oldStart: number, oldEnd: number, replacement: string) => {\n const old = original.slice(oldStart, oldEnd);\n if (old === replacement) return;\n const prefix = commonPrefix(old, replacement);\n const suffix = commonSuffix(old, replacement, prefix);\n effective.push({\n oldStart: oldStart + prefix,\n oldEnd: oldEnd - suffix,\n replacement: replacement.slice(prefix, replacement.length - suffix),\n });\n };\n for (const edit of sorted) {\n if (edit.island) {\n replacedIslands.add(`${edit.start}:${edit.end}`);\n pushSegment(edit.start, edit.end, edit.text);\n continue;\n }\n if (edit.text === original.slice(edit.start, edit.end)) continue;\n const inside = islands.filter((island) => island.start >= edit.start && island.end <= edit.end);\n let oldCursor = edit.start;\n let newCursor = 0;\n for (const island of inside) {\n // Context is compared against the edit's own old/new text, clipped to the edit.\n const at = locateIsland(\n edit.text,\n island.raw,\n newCursor,\n newCursor + (island.start - oldCursor),\n edit.text.length - (edit.end - island.start),\n original.slice(edit.start, edit.end),\n island.start - edit.start,\n island.end - edit.start,\n );\n if (at === -1) {\n const name = island.meta.tag ?? island.meta.name ?? island.meta.lang ?? \"\";\n throw new SourceSpliceError(\n \"island_edit\",\n `edit [${edit.start}, ${edit.end}) changes or removes the protected ${island.islandType}` +\n `${name ? ` (${String(name)})` : \"\"} island at [${island.start}, ${island.end}); ` +\n \"islands change only through islandEdit()\",\n );\n }\n pushSegment(oldCursor, island.start, edit.text.slice(newCursor, at));\n oldCursor = island.end;\n newCursor = at + island.raw.length;\n }\n pushSegment(oldCursor, edit.end, edit.text.slice(newCursor));\n }\n\n if (effective.length === 0) {\n return {\n text: original,\n changed: false,\n changes: [],\n integrity: { ok: true, bytesOutsideEditsIdentical: true, disturbed: [] },\n blocks,\n };\n }\n\n let text = \"\";\n let cursor = 0;\n let delta = 0;\n const pending: Array<Omit<SourceChange, \"oldStartCp\" | \"oldEndCp\" | \"newStartCp\" | \"newEndCp\">> = [];\n for (const edit of effective) {\n text += original.slice(cursor, edit.oldStart);\n const newStart = edit.oldStart + delta;\n text += edit.replacement;\n const newEnd = newStart + edit.replacement.length;\n const owner = sorted.find((e) => e.start <= edit.oldStart && e.end >= edit.oldEnd);\n pending.push({\n blockStart: owner?.start ?? edit.oldStart,\n blockEnd: owner?.end ?? edit.oldEnd,\n oldStart: edit.oldStart,\n oldEnd: edit.oldEnd,\n newStart,\n newEnd,\n });\n delta += edit.replacement.length - (edit.oldEnd - edit.oldStart);\n cursor = edit.oldEnd;\n }\n text += original.slice(cursor);\n\n const oldCp = buildCodePointIndex(original);\n const newCp = buildCodePointIndex(text);\n const changes: SourceChange[] = pending.map((change) => ({\n ...change,\n oldStartCp: oldCp.toCodePoint(change.oldStart),\n oldEndCp: oldCp.toCodePoint(change.oldEnd),\n newStartCp: newCp.toCodePoint(change.newStart),\n newEndCp: newCp.toCodePoint(change.newEnd),\n }));\n\n // Guard 1: every byte outside the changed ranges is the original byte.\n let bytesOutsideEditsIdentical = true;\n let oldCursor = 0;\n let newCursor = 0;\n for (const change of changes) {\n if (original.slice(oldCursor, change.oldStart) !== text.slice(newCursor, change.newStart)) {\n bytesOutsideEditsIdentical = false;\n }\n oldCursor = change.oldEnd;\n newCursor = change.newEnd;\n }\n if (original.slice(oldCursor) !== text.slice(newCursor)) bytesOutsideEditsIdentical = false;\n\n // Guard 2: every island not explicitly replaced is still that island, at its\n // mapped position, in the re-tokenized new text.\n const newBlocks = tokenizeSource(text);\n const newIslandsByStart = new Map<number, string[]>();\n for (const island of listIslands(newBlocks)) {\n const list = newIslandsByStart.get(island.start);\n if (list) list.push(island.raw);\n else newIslandsByStart.set(island.start, [island.raw]);\n }\n const disturbed: DisturbedIsland[] = [];\n // Islands a plain edit carried through: the edit claims to keep them, so if\n // one did not survive as that island its bytes were matched to a copy that\n // is not an island — the edit changed an island (island_edit, always).\n const carried = (island: SourceIsland) =>\n sorted.some((edit) => !edit.island && island.start >= edit.start && island.end <= edit.end);\n const changedInside: SourceIsland[] = [];\n for (const island of islands) {\n if (replacedIslands.has(`${island.start}:${island.end}`)) continue;\n const mappedStart = mapPosition(changes, island.start, { assoc: 1 }).pos;\n const candidates = newIslandsByStart.get(mappedStart);\n if (!candidates || !candidates.includes(island.raw)) {\n if (carried(island)) {\n changedInside.push(island);\n continue;\n }\n disturbed.push({\n islandType: island.islandType,\n inline: island.inline,\n start: island.start,\n end: island.end,\n mappedStart,\n });\n }\n }\n\n if (changedInside.length > 0) {\n const first = changedInside[0] as SourceIsland;\n const name = first.meta.tag ?? first.meta.name ?? first.meta.lang ?? \"\";\n throw new SourceSpliceError(\n \"island_edit\",\n `the edit changes the protected ${first.islandType}${name ? ` (${String(name)})` : \"\"} island at ` +\n `[${first.start}, ${first.end}) — its bytes survive only as ordinary text` +\n `${changedInside.length > 1 ? ` (and ${changedInside.length - 1} more)` : \"\"}; islands change only through islandEdit()`,\n );\n }\n\n const integrity: SpliceIntegrity = {\n ok: bytesOutsideEditsIdentical && disturbed.length === 0,\n bytesOutsideEditsIdentical,\n disturbed,\n };\n if ((options.requireIntegrity ?? true) && !integrity.ok) {\n const named = disturbed\n .slice(0, 5)\n .map((island) => `${island.islandType}@${island.start}`)\n .join(\", \");\n throw new SourceSpliceError(\n \"integrity\",\n `integrity: the save disturbed ${disturbed.length} protected island(s) it did not replace` +\n `${named ? ` (${named}${disturbed.length > 5 ? \", …\" : \"\"})` : \"\"}` +\n `${bytesOutsideEditsIdentical ? \"\" : \"; bytes outside the edits changed\"}`,\n );\n }\n return { text, changed: true, changes, integrity, blocks: newBlocks };\n}\n\nexport interface MapOptions {\n /** -1 keeps a position at an insertion point before the inserted text; 1 (default) moves it after. */\n readonly assoc?: -1 | 1;\n /** Offset unit of `pos` and of the result. Default `utf16`. */\n readonly unit?: \"utf16\" | \"codepoint\";\n}\n\nexport interface MappedPosition {\n readonly pos: number;\n /** True when the position sat strictly inside replaced text. */\n readonly deleted: boolean;\n}\n\n/**\n * Carry a position in the old text through a change set (ProseMirror StepMap\n * semantics): positions before a change stay, positions after shift by the\n * size difference, a position strictly inside replaced text is `deleted` and\n * lands on the replacement's edge chosen by `assoc`.\n */\nexport function mapPosition(\n changes: readonly SourceChange[],\n pos: number,\n options: MapOptions = {},\n): MappedPosition {\n const assoc = options.assoc ?? 1;\n const cp = options.unit === \"codepoint\";\n let delta = 0;\n for (const change of changes) {\n const oldStart = cp ? change.oldStartCp : change.oldStart;\n const oldEnd = cp ? change.oldEndCp : change.oldEnd;\n const newStart = cp ? change.newStartCp : change.newStart;\n const newEnd = cp ? change.newEndCp : change.newEnd;\n if (pos < oldStart) break;\n if (pos > oldEnd) {\n delta = newEnd - oldEnd;\n continue;\n }\n if (oldStart === oldEnd) {\n // Pure insertion at `pos`.\n return { pos: assoc < 0 ? newStart : newEnd, deleted: false };\n }\n if (pos === oldStart) return { pos: newStart, deleted: false };\n if (pos === oldEnd) return { pos: newEnd, deleted: false };\n return { pos: assoc < 0 ? newStart : newEnd, deleted: true };\n }\n return { pos: pos + delta, deleted: false };\n}\n\nexport interface MappedRange {\n readonly start: number;\n readonly end: number;\n /** True when a change overlapped the range's interior. */\n readonly touched: boolean;\n /** True when the whole range was replaced away. */\n readonly collapsed: boolean;\n}\n\n/** Carry an anchor range through a change set; it stays inside its text when edits happen around it. */\nexport function mapRange(\n changes: readonly SourceChange[],\n start: number,\n end: number,\n unit: \"utf16\" | \"codepoint\" = \"utf16\",\n): MappedRange {\n const cp = unit === \"codepoint\";\n const mappedStart = mapPosition(changes, start, { assoc: 1, unit });\n const mappedEnd = mapPosition(changes, end, { assoc: -1, unit });\n const touched = changes.some((change) => {\n const oldStart = cp ? change.oldStartCp : change.oldStart;\n const oldEnd = cp ? change.oldEndCp : change.oldEnd;\n return oldStart < end && oldEnd > start;\n });\n const newStart = mappedStart.pos;\n const newEnd = Math.max(newStart, mappedEnd.pos);\n return { start: newStart, end: newEnd, touched, collapsed: newEnd === newStart && end > start };\n}\n"]}
1
+ {"version":3,"sources":["../source/offsets.ts","../source/constants.ts","../source/fence-nesting.ts","../source/code-ranges.ts","../source/math-pairs.ts","../source/math.ts","../source/xml-tag.ts","../source/tokenize.ts","../source/splice.ts"],"names":["scan","oldCursor","newCursor"],"mappings":"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","file":"source.js","sourcesContent":["/**\n * UTF-16 ⇄ code-point offset conversion.\n *\n * JavaScript strings are indexed in UTF-16 code units; Postgres `position()`,\n * `substring()` and `length()` count code points. Every offset this module\n * emits is given in BOTH units so an anchor captured on either side of the\n * wire can be mapped without re-deriving the text.\n */\n\n/** Indexes the surrogate pairs of one text so conversion is O(log pairs). */\nexport interface CodePointIndex {\n /** Code-point offset of a UTF-16 offset. */\n toCodePoint(utf16: number): number;\n /** UTF-16 offset of a code-point offset. */\n toUtf16(codePoint: number): number;\n /** Code-point length of the text. */\n readonly lengthCp: number;\n}\n\nfunction isHigh(code: number): boolean {\n return code >= 0xd800 && code <= 0xdbff;\n}\nfunction isLow(code: number): boolean {\n return code >= 0xdc00 && code <= 0xdfff;\n}\n\n/** True when `offset` sits between the two halves of a surrogate pair. */\nexport function splitsSurrogatePair(text: string, offset: number): boolean {\n if (offset <= 0 || offset >= text.length) return false;\n return isHigh(text.charCodeAt(offset - 1)) && isLow(text.charCodeAt(offset));\n}\n\nexport function buildCodePointIndex(text: string): CodePointIndex {\n // UTF-16 offsets of every high surrogate that starts a valid pair.\n const pairStarts: number[] = [];\n for (let i = 0; i < text.length - 1; i++) {\n if (isHigh(text.charCodeAt(i)) && isLow(text.charCodeAt(i + 1))) {\n pairStarts.push(i);\n i++;\n }\n }\n\n /** Number of pair starts strictly less than `limit`. */\n const countBelow = (limit: number): number => {\n let lo = 0;\n let hi = pairStarts.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if ((pairStarts[mid] as number) < limit) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n };\n\n const toCodePoint = (utf16: number): number => {\n // Every pair fully before `utf16` counts one code unit too many; a pair\n // whose low half sits exactly at `utf16 - 1` is also fully before it.\n return utf16 - countBelow(utf16 - 1);\n };\n\n const toUtf16 = (codePoint: number): number => {\n // Smallest u with toCodePoint(u) >= codePoint, walked by pair count.\n let lo = 0;\n let hi = pairStarts.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n // Code point of the pair start `pairStarts[mid]`.\n const start = pairStarts[mid] as number;\n if (start - mid < codePoint) lo = mid + 1;\n else hi = mid;\n }\n return codePoint + lo;\n };\n\n return {\n toCodePoint,\n toUtf16,\n lengthCp: text.length - pairStarts.length,\n };\n}\n\n/** One-shot conversion; build an index when converting many offsets. */\nexport function toCodePointOffset(text: string, utf16: number): number {\n return buildCodePointIndex(text).toCodePoint(utf16);\n}\n\n/** One-shot conversion; build an index when converting many offsets. */\nexport function toUtf16Offset(text: string, codePoint: number): number {\n return buildCodePointIndex(text).toUtf16(codePoint);\n}\n","/**\n * The protected-construct vocabulary the source tokenizer recognises.\n *\n * Each list mirrors a live list in matrx-frontend's renderer splitter\n * (`content-splitter-v2.ts`) or its raw-HTML sanitizer (`rehypeSafeRawHtml.ts`);\n * the source is named on every constant. Inventory:\n * common-docs `projects/rich-content-unification/evidence/r2-protected-syntax.md`.\n */\n\n/** `XML_TAG_BLOCKS` — line-leading, attribute-less XML regions. */\nexport const XML_TAG_BLOCK_NAMES: readonly string[] = [\n \"thinking\",\n \"think\",\n \"reasoning\",\n \"info\",\n \"task\",\n \"database\",\n \"private\",\n \"plan\",\n \"event\",\n \"tool\",\n \"questionnaire\",\n \"flashcards\",\n \"cooking_recipe\",\n \"timeline\",\n \"progress_tracker\",\n \"troubleshooting\",\n \"resources\",\n \"research\",\n];\n\n/** The thinking family — the only XML regions recognised mid-line and as orphan closers. */\nexport const THINKING_FAMILY: readonly string[] = [\"thinking\", \"think\", \"reasoning\"];\n\n/** `ATTRIBUTE_XML_BLOCKS` — attribute-bearing XML, also detected mid-line. */\nexport const ATTRIBUTE_XML_NAMES: readonly string[] = [\n \"decision\",\n \"artifact\",\n \"editor_error\",\n \"editor_code_snippet\",\n \"audiocite\",\n];\n\nexport const KNOWN_XML_TAG_NAMES: ReadonlySet<string> = new Set([\n ...XML_TAG_BLOCK_NAMES,\n ...ATTRIBUTE_XML_NAMES,\n]);\n\n/** `ALLOWED_RAW_HTML_TAGS` (rehypeSafeRawHtml.ts) — raw HTML the renderer honours. */\nexport const ALLOWED_RAW_HTML_TAGS: ReadonlySet<string> = new Set([\n \"img\", \"a\", \"br\", \"hr\", \"span\", \"p\", \"strong\", \"b\", \"em\", \"i\", \"u\", \"s\",\n \"del\", \"ins\", \"sup\", \"sub\", \"mark\", \"kbd\", \"abbr\", \"small\", \"code\", \"pre\",\n \"ul\", \"ol\", \"li\", \"blockquote\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\",\n \"table\", \"thead\", \"tbody\", \"tfoot\", \"tr\", \"th\", \"td\", \"caption\",\n \"colgroup\", \"col\", \"figure\", \"figcaption\",\n]);\n\n/**\n * CommonMark HTML-block type 6 names within the allow-list: a line opening\n * with one of these starts an HTML block that runs to the next blank line.\n */\nexport const HTML_BLOCK_LEVEL_TAGS: ReadonlySet<string> = new Set([\n \"p\", \"hr\", \"ul\", \"ol\", \"li\", \"blockquote\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\",\n \"h6\", \"table\", \"thead\", \"tbody\", \"tfoot\", \"tr\", \"th\", \"td\", \"caption\",\n \"colgroup\", \"col\", \"figure\", \"figcaption\",\n]);\n\n/** `SPECIAL_CODE_LANGUAGES` — fence languages the renderer promotes to kinds. */\nexport const SPECIAL_CODE_LANGUAGES: ReadonlySet<string> = new Set([\n \"transcript\", \"tasks\", \"structured_info\", \"questionnaire\", \"flashcards\",\n \"cooking_recipe\", \"mermaid\", \"svg\", \"chart\", \"map\", \"stats\", \"diff\",\n \"html\", \"react\", \"matrx\",\n]);\n\n/** `CODE_LANGUAGE_ALIASES`. */\nexport const CODE_LANGUAGE_ALIASES: Readonly<Record<string, string>> = {\n mmd: \"mermaid\",\n jsx: \"react\",\n tsx: \"react\",\n};\n\n/** `JSON_BLOCK_PATTERNS` root keys → typed JSON block type. */\nexport const TYPED_JSON_ROOT_KEYS: Readonly<Record<string, string>> = {\n quiz_title: \"quiz\",\n presentation: \"presentation\",\n decision_tree: \"decision_tree\",\n comparison: \"comparison_table\",\n diagram: \"diagram\",\n math_problem: \"math_problem\",\n item_presentation: \"item_presentation\",\n name: \"schema_proposal\",\n};\n\n/** Box-drawing glyphs that mark a tree diagram (`TREE_CHARS`). */\nexport const TREE_GLYPHS = /[├└│┌┐┘┬┴┤┼─]/;\n\n/** A pinned annotation anchor (STORE-DESIGN §3.19): `<!--@a:k3f9-->`. */\nexport const PINNED_ANCHOR_RE = /^<!--@a:([A-Za-z0-9_-]+)-->$/;\n\n/** remarkMatrxVariable's strict variable token. */\nexport const STRICT_VARIABLE_RE = /^\\{\\{([a-zA-Z_][a-zA-Z0-9_.]*)\\}\\}$/;\n\n/** remarkMatrxCite's citation marker, anchored at the cursor. */\nexport const CITE_RE = /^<matrxcite\\s+n=\"(\\d+)\"\\s*\\/>/;\n\nexport function normalizeFenceLanguage(language: string): string {\n const lower = language.toLowerCase();\n return CODE_LANGUAGE_ALIASES[lower] ?? lower;\n}\n","// ─────────────────────────────────────────────────────────────────────────\n// THE ONE NESTED-FENCE RULE for a ```markdown / ```md / ```mdx fence.\n//\n// Source of truth (moved here from matrx-frontend\n// components/markdown-core/fence-nesting.ts, 2026-09-25). Consumers: the\n// source tokenizer (source/tokenize.ts), matrx-frontend's static splitter and\n// live StreamBlockAccumulator, and — by conformance, since Python cannot\n// import this — aidream matrx-ai `processing/blocks/fence_nesting.py`, which\n// runs the SAME generated vectors (`__tests__/fence-nesting-vectors.json`,\n// byte-identical copy at packages/matrx-ai/tests/fixtures/).\n//\n// Models write a markdown document inside a ```markdown fence and put their\n// own ```python … ``` blocks inside it with the SAME three backticks. Under\n// strict CommonMark the first inner bare ``` closes the outer fence: the\n// document ends mid-way, the rest leaks out as prose, and the outer closing\n// ``` opens a phantom code block that swallows everything after it.\n//\n// The rule, for MARKDOWN-language fences only (every other language keeps\n// strict CommonMark — a ```bash heredoc is code, not a document):\n// - a fence line WITH an info string (```python) opens a nested fence;\n// - a bare fence line (``` with at least the opener's tick count) closes\n// the innermost nested fence while one is open, and closes the outer\n// fence only when none is;\n// - a longer outer fence (````markdown) keeps working exactly as before —\n// an inner ``` is shorter than the opener, so it is plain content;\n// - if the text ENDS with a nested fence still open, the extraction is\n// redone under strict CommonMark (an unclosed inner fence must not eat\n// the outer closer and the rest of the message).\n// ─────────────────────────────────────────────────────────────────────────\n\n/** Fence languages whose body is itself a markdown document. */\nexport const NESTING_FENCE_LANGUAGES: ReadonlySet<string> = new Set([\n \"markdown\",\n \"md\",\n \"mdx\",\n]);\n\n/** True when a fence opened with this info-string language nests inner fences. */\nexport function fenceNestsInnerFences(language: string | undefined | null): boolean {\n return !!language && NESTING_FENCE_LANGUAGES.has(language.toLowerCase());\n}\n\nexport type InnerFenceLine =\n /** Not a fence line — ordinary content of the outer fence. */\n | \"content\"\n /** ```lang inside a markdown fence — content, and one level deeper. */\n | \"open-nested\"\n /** Bare ``` that closes the innermost nested fence — content, one level up. */\n | \"close-nested\"\n /** Bare ``` that closes the OUTER fence. */\n | \"close-outer\";\n\n/**\n * Classify one line inside an open backtick fence, already trimmed with\n * {@link trimFenceLine} (never a language's own `trim()`).\n *\n * @param trimmed the line with surrounding whitespace removed\n * @param openTicks backtick count of the outer fence's opener\n * @param nests whether the outer fence follows the nesting rule\n * @param nestedDepth how many nested fences are open right now\n */\n/**\n * The whitespace a fence line may carry around its backticks and info string:\n * CommonMark's ASCII whitespace — space, tab, LF, CR, form feed, vertical tab.\n * Defined HERE, not by a language's `trim()`: JavaScript's `trim()` also strips\n * U+FEFF, U+00A0 and the Unicode spaces, while Python's `strip()` also strips\n * U+0085 and U+001C–U+001F — which made the two twins disagree on lines such\n * as ```` ```\\uFEFF ```` (verify-RC-B3 residual R4). Every caller trims a line\n * with `trimFenceLine` before classifying it; the Python twin mirrors both.\n */\nexport const FENCE_WHITESPACE = \" \\t\\n\\r\\f\\v\";\n\nfunction isFenceWhitespace(ch: string | undefined): boolean {\n return ch !== undefined && ch !== \"\" && FENCE_WHITESPACE.includes(ch);\n}\n\n/** Strip {@link FENCE_WHITESPACE} (and nothing else) from both ends of a line. */\nexport function trimFenceLine(line: string): string {\n let start = 0;\n let end = line.length;\n while (start < end && isFenceWhitespace(line[start])) start++;\n while (end > start && isFenceWhitespace(line[end - 1])) end--;\n return start === 0 && end === line.length ? line : line.slice(start, end);\n}\n\n/**\n * The whitespace around a fence OPENER and inside its info string. The\n * renderer finds openers with JavaScript's `String#trim()` and splits the info\n * string on `/\\s/`; this set IS that definition, written out so the Python\n * twin can match it exactly — ECMAScript WhiteSpace + LineTerminator. It\n * differs from Python's `str.split()` on U+0085 and U+001C–U+001F (not JS\n * whitespace) and U+FEFF (JS whitespace) — verify-RC-B3 residual R4′.\n */\nexport const FENCE_OPENER_WHITESPACE =\n \"\\t\\n\\v\\f\\r \\u00a0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff\";\n\nfunction isOpenerWhitespace(ch: string | undefined): boolean {\n return ch !== undefined && ch !== \"\" && FENCE_OPENER_WHITESPACE.includes(ch);\n}\n\n/**\n * Parse a backtick fence OPENER line the way the renderer does: trim the line,\n * count the backtick run (3+), trim the rest, and take the first\n * whitespace-separated word as the language. null when the line opens nothing.\n */\nexport function parseFenceOpener(line: string): { ticks: number; lang: string } | null {\n let start = 0;\n let end = line.length;\n while (start < end && isOpenerWhitespace(line[start])) start++;\n while (end > start && isOpenerWhitespace(line[end - 1])) end--;\n let ticks = 0;\n while (start + ticks < end && line[start + ticks] === \"`\") ticks++;\n if (ticks < 3) return null;\n let infoStart = start + ticks;\n while (infoStart < end && isOpenerWhitespace(line[infoStart])) infoStart++;\n let langEnd = infoStart;\n while (langEnd < end && !isOpenerWhitespace(line[langEnd])) langEnd++;\n return { ticks, lang: line.slice(infoStart, langEnd) };\n}\n\nexport function classifyInnerFenceLine(\n trimmed: string,\n openTicks: number,\n nests: boolean,\n nestedDepth: number,\n): InnerFenceLine {\n let ticks = 0;\n while (ticks < trimmed.length && trimmed[ticks] === \"`\") ticks++;\n if (ticks < 3) return \"content\";\n const info = trimFenceLine(trimmed.slice(ticks));\n if (info === \"\") {\n if (ticks < openTicks) return \"content\";\n if (nests && nestedDepth > 0) return \"close-nested\";\n return \"close-outer\";\n }\n // A fence line with an info string never closes anything (CommonMark).\n // Inside a markdown fence it opens a nested one — unless the outer opener is\n // LONGER, in which case CommonMark already treats the inner fence as content\n // and its bare closer can never reach the outer fence.\n if (nests && ticks >= openTicks && !info.includes(\"`\")) return \"open-nested\";\n return \"content\";\n}\n","/**\n * THE ONE CODE-RANGE RULE — where code is in markdown source, for every surface.\n *\n * Ruling (RC-B10, 2026-09-25, REGISTER rulings ledger): the rule is the\n * RENDERER's rule — what the chat renderer's splitter, the source tokenizer\n * and the Python block detector already agree on — made container-aware only\n * where the renderer hands a block to remark:\n * - a BACKTICK fence opens on a line whose whitespace-trimmed text starts\n * with ``` at ANY indent (so a fence inside a list item opens at any\n * depth), after stripping blockquote `>` prefixes;\n * - a TILDE fence opens at ≤ 3 spaces relative to its container (a list\n * item's content column, inside any `>` prefixes);\n * - a backtick fence closes by THE nested-fence rule (`fence-nesting.ts`,\n * with the strict-CommonMark retry when a nested fence is left open) or by\n * the renderer's line-end closer (`code```` with nothing after it); inside\n * a ```json fence a backtick run inside a JSON string is text;\n * - a fence inside a blockquote ends where the blockquote ends;\n * - strict CommonMark's \"4+ spaces is not a fence\" is rejected on purpose:\n * users see what the renderer's splitter draws.\n * Inline code spans pair equal-length backtick runs inside one paragraph.\n *\n * Order is the renderer's: phase 1 is the splitter — every raw line whose\n * trimmed text starts with ``` opens a block, before remark sees anything\n * (so `- ```` can never close on a later raw ``` line; that line opens a\n * splitter block instead). Phase 2 is remark inside each prose segment the\n * splitter left: blockquote fences, fences on a list-marker line, tilde\n * fences, and code spans — none can run past its segment. A ``` line inside a\n * tilde fence is therefore drawn as code up to ITS closer (the splitter does\n * not know ~~~), exactly the tokenizer's `rendererOverflow`.\n *\n * Consumers: `findCodeRanges` (math pairing, kit's delimiter guard, chat's\n * speakable text, print, every matrx-frontend walker), and the line-level\n * primitives `fenceOpenerOf` / `closeFence`, which the tokenizer and the\n * renderer's splitters drive line by line. A private copy of fence or\n * code-span detection anywhere fails `__tests__/one-code-range-rule.test.ts`.\n */\nimport { classifyInnerFenceLine, fenceNestsInnerFences, parseFenceOpener, trimFenceLine } from \"./fence-nesting\";\n\nexport interface CodeRange {\n /** UTF-16 offset of the first character (the fence line start, or the opening backtick run). */\n start: number;\n /** Offset just past the closing fence line's content / closing backtick run (the fence's last line when unclosed). */\n end: number;\n kind: \"fence\" | \"span\";\n}\n\nexport interface FenceOpener {\n char: \"`\" | \"~\";\n /** Length of the opening run. */\n ticks: number;\n /** The info string's first word (\"\" when none). */\n lang: string;\n}\n\n/**\n * THE opener rule for one line's content (container prefixes already\n * removed; for a tilde fence, `content` starts at the container's column).\n */\nexport function fenceOpenerOf(content: string): FenceOpener | null {\n const t = content.trimStart();\n if (t.startsWith(\"```\")) {\n let ticks = 0;\n while (ticks < t.length && t[ticks] === \"`\") ticks++;\n return { char: \"`\", ticks, lang: parseFenceOpener(t)?.lang ?? \"\" };\n }\n if (content.length - t.length <= 3 && t.startsWith(\"~~~\")) {\n const open = /^(~{3,})(.*)$/.exec(t);\n if (!open) return null;\n return { char: \"~\", ticks: (open[1] as string).length, lang: (open[2] as string).trim().split(/\\s/)[0] ?? \"\" };\n }\n return null;\n}\n\n/** The lines a fence is read from. */\nexport interface FenceLines {\n count: number;\n /** Line `k`'s content (no terminator), or null when the fence's container has ended before it. */\n line(k: number): string | null;\n /** Streaming: line `k` has not ended yet, so it closes nothing. */\n openTail?(k: number): boolean;\n}\n\nexport interface FenceEnd {\n /** The closing line when `closed`; otherwise the fence's last line (text end, or the line before its container ended). */\n line: number;\n closed: boolean;\n}\n\n/**\n * THE closer rule, read line by line — the one implementation behind\n * `closeFence` and every streaming walker. Feed each following line\n * (container prefixes removed); `feed` returns true on the line that closes\n * the fence. A backtick fence closes by the nested-fence rule or the\n * renderer's line-end closer (`code````), and inside ```json a backtick run in\n * a JSON string is text; a tilde fence closes on `~~~` (≥ its length, ≤ 3\n * spaces). `nesting: false` forces strict CommonMark (the retry `closeFence`\n * makes when a nested fence is left open at the end; a streaming reader\n * cannot look ahead, so it reads with nesting and never retries).\n */\nexport class FenceReader {\n private state = { inString: false, escaped: false };\n private depth = 0;\n /** A nested fence was opened at some point. */\n sawNested = false;\n private readonly isJson: boolean;\n private readonly nesting: boolean;\n private readonly tildeCloser: RegExp | null;\n\n constructor(\n readonly opener: FenceOpener,\n options: { nesting?: boolean } = {},\n ) {\n this.isJson = opener.char === \"`\" && opener.lang === \"json\";\n this.nesting = opener.char === \"`\" && (options.nesting ?? fenceNestsInnerFences(opener.lang));\n this.tildeCloser = opener.char === \"~\" ? new RegExp(`^ {0,3}~{${opener.ticks},}[ \\\\t]*$`) : null;\n }\n\n /** How many nested fences are open right now. */\n get nestedDepth(): number {\n return this.depth;\n }\n\n feed(line: string): boolean {\n if (this.tildeCloser) return this.tildeCloser.test(line);\n const trimmedLine = trimFenceLine(line);\n const at = line.indexOf(\"```\");\n if (at === -1) {\n if (this.isJson) this.state = jsonStringState(line, 0, line.length, this.state);\n return false;\n }\n if (this.isJson) {\n const probe = jsonStringState(line, 0, at, this.state);\n if (probe.inString) {\n this.state = jsonStringState(line, at, line.length, probe);\n return false;\n }\n }\n if (trimmedLine.startsWith(\"```\")) {\n const kind = classifyInnerFenceLine(trimmedLine, this.opener.ticks, this.nesting, this.depth);\n if (kind === \"close-outer\") return true;\n if (kind === \"open-nested\") {\n this.depth++;\n this.sawNested = true;\n }\n if (kind === \"close-nested\") this.depth--;\n } else {\n // The renderer's line-end closer: `code```` with nothing after the run.\n const closeTicks = backtickRunLength(line, at);\n const after = trimFenceLine(line.slice(at + closeTicks));\n if (closeTicks >= this.opener.ticks && after === \"\" && this.depth === 0) return true;\n }\n if (this.isJson) this.state = jsonStringState(line, 0, line.length, this.state);\n return false;\n }\n}\n\n/** Where the fence opened on line `open` ends. */\nexport function closeFence(src: FenceLines, open: number, opener: FenceOpener): FenceEnd {\n const first = readFence(src, open, new FenceReader(opener));\n if (first.closed || !first.reader.sawNested || first.reader.nestedDepth <= 0) return { line: first.line, closed: first.closed };\n const strict = readFence(src, open, new FenceReader(opener, { nesting: false }));\n return { line: strict.line, closed: strict.closed };\n}\n\nfunction readFence(src: FenceLines, open: number, reader: FenceReader): FenceEnd & { reader: FenceReader } {\n for (let k = open + 1; k < src.count; k++) {\n // Streaming: a bare ``` on the unfinished last line may still grow into ```bash.\n if (src.openTail?.(k)) continue;\n const line = src.line(k);\n if (line === null) return { line: k - 1, closed: false, reader };\n if (reader.feed(line)) return { line: k, closed: true, reader };\n }\n return { line: src.count - 1, closed: false, reader };\n}\n\n/** JSON-string state after scanning `line[from, upTo)` from the given state. */\nexport function jsonStringState(\n line: string,\n from: number,\n upTo: number,\n state: { inString: boolean; escaped: boolean },\n): { inString: boolean; escaped: boolean } {\n let { inString, escaped } = state;\n for (let idx = from; idx < upTo; idx++) {\n const ch = line[idx];\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === \"\\\\\" && inString) {\n escaped = true;\n continue;\n }\n if (ch === '\"') inString = !inString;\n }\n return { inString, escaped };\n}\n\nexport function backtickRunLength(str: string, pos: number): number {\n let n = 0;\n while (pos + n < str.length && str[pos + n] === \"`\") n++;\n return n;\n}\n\n// ── the whole-text scan ────────────────────────────────────────────────────\n\n/** Blockquote prefix: how many `>` markers open the line, and where its content starts. */\nfunction quotePrefix(line: string): { depth: number; offset: number } {\n let depth = 0;\n let offset = 0;\n for (;;) {\n const m = /^ {0,3}> ?/.exec(line.slice(offset));\n if (!m) return { depth, offset };\n depth++;\n offset += m[0].length;\n }\n}\n\n/** Strip exactly `depth` blockquote markers; null when the line has fewer (the blockquote ended). */\nfunction stripQuotes(line: string, depth: number): string | null {\n let offset = 0;\n for (let d = 0; d < depth; d++) {\n const m = /^ {0,3}> ?/.exec(line.slice(offset));\n if (!m) return null;\n offset += m[0].length;\n }\n return line.slice(offset);\n}\n\nconst LIST_ITEM = /^( *)([-*+]|\\d{1,9}[.)])( +|\\t|$)/;\n\nfunction leadingSpaces(s: string): number {\n let i = 0;\n while (i < s.length && s[i] === \" \") i++;\n return i;\n}\n\ninterface Scan {\n ranges: CodeRange[];\n /** Every fence as lines: [opener line, last line, closed]. */\n fences: Array<[number, number, boolean]>;\n /** Paragraph runs outside fences, [start, end), for code-span pairing. */\n paragraphs: Array<[number, number]>;\n /** Text ends inside an open fence. */\n endsInFence: boolean;\n /** Start of the final, still-growing paragraph (streaming rule), -1 if none. */\n pendingPara: number;\n}\n\nfunction scan(text: string): Scan {\n const starts: number[] = [];\n const ends: number[] = [];\n for (let pos = 0; ; ) {\n const nl = text.indexOf(\"\\n\", pos);\n const lineEnd = nl === -1 ? text.length : nl;\n starts.push(pos);\n ends.push(lineEnd > pos && text.charCodeAt(lineEnd - 1) === 13 ? lineEnd - 1 : lineEnd);\n if (nl === -1) break;\n pos = nl + 1;\n }\n const count = starts.length;\n const raw = (k: number) => text.slice(starts[k] as number, ends[k] as number);\n const out: Scan = { ranges: [], fences: [], paragraphs: [], endsInFence: false, pendingPara: -1 };\n\n // Phase 1 — the renderer's splitter: every line whose trimmed text starts\n // with ``` opens a code block at ANY indent, before remark sees anything.\n const rawLines: FenceLines = { count, line: raw };\n let segment = 0;\n for (let k = 0; k < count; k++) {\n const opener = fenceOpenerOf(raw(k));\n if (!opener || opener.char !== \"`\") continue;\n prose(text, starts, ends, raw, segment, k, out);\n const end = closeFence(rawLines, k, opener);\n out.ranges.push({ start: starts[k] as number, end: ends[end.line] as number, kind: \"fence\" });\n out.fences.push([k, end.line, end.closed]);\n out.pendingPara = -1;\n if (!end.closed && end.line === count - 1) out.endsInFence = true;\n k = end.line;\n segment = k + 1;\n }\n prose(text, starts, ends, raw, segment, count, out);\n return out;\n}\n\n/**\n * Phase 2 — remark, inside one prose segment [from, to) the splitter left:\n * fences in blockquotes, on a list-marker line, and tilde fences (relative to\n * their container), plus the paragraphs whose backtick runs pair as spans. A\n * fence here can never run past its segment: the splitter's block begins there.\n */\nfunction prose(\n text: string,\n starts: number[],\n ends: number[],\n raw: (k: number) => string,\n from: number,\n to: number,\n out: Scan,\n): void {\n let para = -1;\n let quoteDepth = 0;\n let lists: number[] = []; // content columns of the open list items (inside the quote prefix)\n const closePara = (at: number) => {\n if (para !== -1) out.paragraphs.push([para, at]);\n para = -1;\n };\n for (let k = from; k < to; k++) {\n const line = raw(k);\n const { depth, offset } = quotePrefix(line);\n if (depth !== quoteDepth) {\n quoteDepth = depth;\n lists = [];\n }\n let content = line.slice(offset);\n if (content.trim() === \"\") {\n closePara(starts[k] as number);\n // The empty \"line\" after a final newline is not a blank line: the next\n // line may still join this paragraph.\n if (!(k === starts.length - 1 && line === \"\")) out.pendingPara = -1;\n continue;\n }\n const indent = leadingSpaces(content);\n while (lists.length && indent < (lists[lists.length - 1] as number)) lists.pop();\n const item = LIST_ITEM.exec(content);\n let column = lists.length ? (lists[lists.length - 1] as number) : 0;\n if (item) {\n const gap = (item[3] as string).length;\n column = (item[1] as string).length + (item[2] as string).length + (gap >= 1 && gap <= 4 ? gap : 1);\n lists.push(column);\n content = content.slice(Math.min(column, content.length));\n } else {\n content = content.slice(Math.min(indent, column));\n }\n const opener = fenceOpenerOf(content);\n if (!opener) {\n if (para === -1) para = starts[k] as number;\n if (out.pendingPara === -1) out.pendingPara = starts[k] as number;\n continue;\n }\n closePara(starts[k] as number);\n out.pendingPara = -1;\n const col = column;\n const src: FenceLines = {\n count: to,\n line: (j) => {\n const inner = stripQuotes(raw(j), depth);\n if (inner === null) return null;\n if (opener.char === \"~\" && col > 0) {\n const ind = leadingSpaces(inner);\n if (inner.trim() !== \"\" && ind < col) return null; // the list item ended\n return inner.slice(Math.min(ind, col));\n }\n return inner;\n },\n };\n const end = closeFence(src, k, opener);\n out.ranges.push({ start: starts[k] as number, end: ends[end.line] as number, kind: \"fence\" });\n out.fences.push([k, end.line, end.closed]);\n if (!end.closed && end.line === starts.length - 1) out.endsInFence = true;\n k = end.line;\n }\n closePara(to < starts.length ? (starts[to] as number) : text.length);\n}\n\n/**\n * THE code-span pairing table for one paragraph, text[from, to): a backtick\n * run closes at the first LATER run of exactly its length; a run with none is\n * literal text. `findCodeRanges` pairs runs in order; the tokenizer's inline\n * scanner asks `next` in the renderer's leftmost-first inline order.\n */\nexport class BacktickRuns {\n /** Every run, in order: [start, length]. */\n readonly all: Array<[number, number]> = [];\n private readonly byLength = new Map<number, number[]>();\n private readonly indexOf = new Map<number, number>();\n\n constructor(text: string, from: number, to: number) {\n for (let k = from; k < to; ) {\n if (text.charCodeAt(k) !== 96) {\n k++;\n continue;\n }\n let len = 1;\n while (k + len < to && text.charCodeAt(k + len) === 96) len++;\n this.indexOf.set(k, this.all.length);\n this.all.push([k, len]);\n const list = this.byLength.get(len);\n if (list) list.push(k);\n else this.byLength.set(len, [k]);\n k += len;\n }\n }\n\n /** Start of the first run of exactly `n` backticks at or after `after`, or -1. */\n next(n: number, after: number): number {\n const list = this.byLength.get(n);\n if (!list) return -1;\n let lo = 0;\n let hi = list.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if ((list[mid] as number) < after) lo = mid + 1;\n else hi = mid;\n }\n return list[lo] ?? -1;\n }\n\n /** Index of the run starting at `start` in `all`. */\n index(start: number): number {\n return this.indexOf.get(start) ?? -1;\n }\n}\n\nfunction codeSpans(text: string, from: number, to: number, out: CodeRange[]): void {\n // Left to right, exactly as the renderer (remark) and the tokenizer's inline\n // scanner read: a backslash escapes the next character, so an escaped\n // backtick opens nothing; a run closes at the first LATER run of exactly its\n // length (inside code a backslash is literal, so a closer may follow one).\n let runs: BacktickRuns | null = null;\n for (let i = from; i < to; ) {\n const ch = text.charCodeAt(i);\n if (ch === 92) {\n i += 2;\n continue;\n }\n if (ch !== 96) {\n i++;\n continue;\n }\n const n = backtickRunLength(text, i);\n const len = Math.min(n, to - i);\n runs ??= new BacktickRuns(text, from, to);\n const close = runs.next(len, i + len);\n if (close === -1) {\n i += len;\n continue;\n }\n out.push({ start: i, end: close + len, kind: \"span\" });\n i = close + len;\n }\n}\n\n/**\n * Every code range in the text — fences (by the renderer's rule above) and\n * inline code spans — sorted by start. Linear: one pass over lines, one over\n * each paragraph's backtick runs.\n */\nexport function findCodeRanges(text: string): CodeRange[] {\n const s = scan(text);\n const ranges = [...s.ranges];\n for (const [from, to] of s.paragraphs) codeSpans(text, from, to, ranges);\n return ranges.sort((a, b) => a.start - b.start);\n}\n\n/**\n * Rewrite every code range (fences and spans, by THE rule) through `fn`; text\n * outside code is kept byte for byte. The one way to strip, replace or\n * placeholder code in markdown — never a private /```…```/ regex.\n */\nexport function mapCodeRanges(text: string, fn: (range: CodeRange, raw: string) => string): string {\n let out = \"\";\n let at = 0;\n for (const r of findCodeRanges(text)) {\n if (r.start < at) continue;\n out += text.slice(at, r.start) + fn(r, text.slice(r.start, r.end));\n at = r.end;\n }\n return out + text.slice(at);\n}\n\n/** A code span's text (CommonMark): the backtick runs off, then one padding space each side when both are there and the content is not all spaces. */\nexport function codeSpanText(raw: string): string {\n const ticks = backtickRunLength(raw, 0);\n const inner = raw.slice(ticks, raw.length - ticks);\n return inner.length >= 2 && inner.startsWith(\" \") && inner.endsWith(\" \") && inner.trim() !== \"\" ? inner.slice(1, -1) : inner;\n}\n\n/**\n * A fence range's parts: its opener, its body (the lines between the opener\n * and the closer, blockquote prefixes kept), and whether it closed. Reads\n * `raw` exactly as `findCodeRanges` returned it.\n */\nexport function fenceParts(raw: string): { opener: FenceOpener; body: string; closed: boolean } | null {\n const lines = raw.split(\"\\n\").map((l) => (l.endsWith(\"\\r\") ? l.slice(0, -1) : l));\n const { offset } = quotePrefix(lines[0] ?? \"\");\n const opener = fenceOpenerOf((lines[0] ?? \"\").slice(offset).replace(/^ *(?:[-*+]|\\d{1,9}[.)])(?= |\\t|$) ?/, \"\"));\n if (!opener) return null;\n const rest = lines.slice(1);\n const closed = rest.length > 0 && new FenceReader(opener, { nesting: false }).feed(rest[rest.length - 1] as string);\n if (!closed) return { opener, body: rest.join(\"\\n\"), closed };\n const last = rest[rest.length - 1] as string;\n // The renderer's line-end closer (`code````): the text before the run is code.\n const before = trimFenceLine(last).startsWith(\"```\") ? \"\" : last.slice(0, last.indexOf(\"```\"));\n return { opener, body: [...rest.slice(0, -1), ...(before.trim() ? [before] : [])].join(\"\\n\"), closed };\n}\n\nexport type FenceLineKind = \"prose\" | \"open\" | \"body\" | \"close\";\n\n/**\n * Where each line (the text split on \"\\n\") sits relative to the fences\n * `findCodeRanges` finds: its opener, its body, its closer, or prose. For a\n * line walker that must skip code — one rule, never a private `inFence` toggle.\n */\nexport function fenceLineKinds(text: string): FenceLineKind[] {\n const s = scan(text);\n let count = 1;\n for (let i = text.indexOf(\"\\n\"); i !== -1; i = text.indexOf(\"\\n\", i + 1)) count++;\n const kinds = new Array<FenceLineKind>(count).fill(\"prose\");\n for (const [open, last, closed] of s.fences) {\n kinds[open] = \"open\";\n for (let k = open + 1; k <= last; k++) kinds[k] = \"body\";\n if (closed && last > open) kinds[last] = \"close\";\n }\n return kinds;\n}\n\n/**\n * STREAMING: where the last, still-growing paragraph (no blank line or fence\n * after it) holds a backtick run that a later run could still close — a run\n * with no later run of its length, or the run touching the end of the text\n * (it may still lengthen). Such a code span can yet swallow any `$$` after it,\n * so a streaming tokenizer treats text from there as provisional. -1 if none.\n */\nexport function pendingCodeSpanStart(text: string): number {\n const n = text.length;\n if (n === 0 || /\\n[ \\t]*\\n[ \\t]*$/.test(text)) return -1;\n const s = scan(text);\n const para = s.pendingPara;\n if (s.endsInFence || para === -1) return -1;\n const runs: Array<[number, number]> = [];\n for (let k = para; k < n; ) {\n if (text.charCodeAt(k) !== 96) {\n k++;\n continue;\n }\n let len = 1;\n while (k + len < n && text.charCodeAt(k + len) === 96) len++;\n runs.push([k, len]);\n k += len;\n }\n // Pair runs the way findCodeRanges does, treating a run that touches the end\n // as still growing (it matches nothing yet); the first run left open is pending.\n const growing = (r: number) => {\n const [start, len] = runs[r] as [number, number];\n return start + len === n;\n };\n for (let r = 0; r < runs.length; ) {\n if (growing(r)) return (runs[r] as [number, number])[0];\n const len = (runs[r] as [number, number])[1];\n let j = r + 1;\n while (j < runs.length && ((runs[j] as [number, number])[1] !== len || growing(j))) j++;\n if (j >= runs.length) return (runs[r] as [number, number])[0];\n r = j + 1;\n }\n return -1;\n}\n","import { findCodeRanges } from \"./code-ranges\";\n\n/**\n * `$$` pairing — the core's rule for which `$$` delimiters are real math.\n *\n * Ported from `@ai-matrx/kit/delimiter-guard` (`guardMathDelimiters`), which\n * every math-capable renderer runs before remark-math. Its decisions:\n * - `$$` tokens outside code (``` / ~~~ fences, `inline code`) pair in\n * document order, open → close;\n * - a pair whose inside reads as prose or carries markdown structure is NOT\n * math: the renderer neutralizes its opener and the closer is retried as\n * the next opener;\n * - an unpaired `$$` is inert — it renders as literal text.\n * So the tokenizer protects exactly the pairs the renderer shows as math, and\n * a lone `$$` (a stray closer, or an opener that never closed) never locks\n * anything. Linear time: one regex pass per code shape, one sweep.\n */\n\nconst MAX_MATH_SPAN = 600;\nconst STRUCTURAL_MARKDOWN =\n /\\]\\(|https?:\\/\\/|\\*\\*|(?:^|\\n)[ \\t]{0,3}#{1,6}[ \\t]|(?:^|\\n)[ \\t]*[-*+][ \\t]+|(?:^|\\n)[ \\t]*\\d+[.)][ \\t]/;\nconst LATEX_COMMAND = /\\\\[a-zA-Z]/;\nconst PROSE_WORD = /[A-Za-z]{3,}/g;\nconst PROSE_WORD_LIMIT = 6;\n\n/**\n * `$$...$$`, `$$…$$`, `$$ · $$`: a PLACEHOLDER — prose describing the syntax,\n * never a formula. The pair is consumed whole as literal text (neither `$$`\n * may open the next span).\n */\nexport function isMathPlaceholder(inner: string): boolean {\n return /^[\\s.…·⋯_-]*$/.test(inner) && /[.…·⋯]/.test(inner);\n}\n\n/** A `$$` alone on its line opens a flow block (like a fence). */\nfunction opensFlowBlock(text: string, open: number): boolean {\n // Only whitespace between the line start and the opener, and after it to\n // the line end. Scans just that whitespace, so a line full of `$$` stays linear.\n for (let k = open - 1; k >= 0 && text[k] !== \"\\n\"; k--) if (text[k] !== \" \" && text[k] !== \"\\t\") return false;\n for (let k = open + 2; k < text.length && text[k] !== \"\\n\"; k++) if (text[k] !== \" \" && text[k] !== \"\\t\" && text[k] !== \"\\r\") return false;\n return true;\n}\n\n/**\n * The guard's `looksLikeMath`. `flow` = the opener is alone on its line: a\n * flow block may span blank lines (like a fence); a `$$` with text beside it\n * never crosses one — TeX's rule, and what keeps a stray prose `$$` from\n * pairing with the next paragraph's formula.\n */\nexport function looksLikeDisplayMath(inner: string, flow = false): boolean {\n const s = inner.trim();\n if (!s) return false;\n if (STRUCTURAL_MARKDOWN.test(s)) return false;\n if (s.length > MAX_MATH_SPAN) return false;\n // TeX's rule: display math never contains a blank line — a stray prose `$$`\n // never pairs with the next paragraph's formula, LaTeX in between or not.\n // On the UNtrimmed span: the blank line is often right before the closer.\n if (!flow && /\\n[ \\t]*\\n/.test(inner)) return false;\n if (LATEX_COMMAND.test(s)) {\n return (s.match(PROSE_WORD) ?? []).length < PROSE_WORD_LIMIT * 3;\n }\n return (s.match(PROSE_WORD) ?? []).length < PROSE_WORD_LIMIT;\n}\n\n/** Code ranges as `[start, end)` tuples — the ONE CommonMark rule (`./code-ranges`). */\nfunction codeRanges(text: string): Array<[number, number]> {\n return findCodeRanges(text).map((r) => [r.start, r.end]);\n}\n\nexport { pendingCodeSpanStart } from \"./code-ranges\";\n\n/**\n * STREAMING: the last `$$` token that is still unpaired AND could still pair\n * with a `$$` not yet arrived — its span so far is short enough, carries no\n * markdown structure, not too many prose words, and (unless it opens a flow\n * block) no blank line. Everything after it may yet become math, so a\n * streaming tokenizer treats it as provisional. -1 when there is none.\n */\nexport function pendingDisplayMathOpener(text: string): number {\n if (!text.includes(\"$$\")) return -1;\n const ranges = codeRanges(text);\n const tokens: number[] = [];\n let r = 0;\n let maxEnd = -1;\n for (let i = text.indexOf(\"$$\"); i !== -1 && i < text.length - 1; i = text.indexOf(\"$$\", i)) {\n while (r < ranges.length && (ranges[r] as [number, number])[0] <= i) {\n maxEnd = Math.max(maxEnd, (ranges[r] as [number, number])[1]);\n r++;\n }\n if (maxEnd <= i) tokens.push(i);\n i += 2;\n }\n const paired = new Set<number>();\n let j = 0;\n while (j < tokens.length) {\n const open = tokens[j] as number;\n const close = tokens[j + 1];\n if (close === undefined) break;\n if (isMathPlaceholder(text.slice(open + 2, close))) {\n j += 2;\n continue;\n }\n if (looksLikeDisplayMath(text.slice(open + 2, close), opensFlowBlock(text, open))) {\n paired.add(open);\n paired.add(close);\n j += 2;\n continue;\n }\n j += 1;\n }\n // The EARLIEST unpaired token that could still pair: a later token can yet\n // vanish into an inline code span whose closer has not arrived, which would\n // hand an earlier token a new partner.\n // Trailing whitespace is trimmed from every candidate's span; measure it once.\n let trail = 0;\n while (trail < text.length && /\\s/.test(text[text.length - 1 - trail] as string)) trail++;\n for (const token of tokens) {\n if (paired.has(token)) continue;\n // Cheap bound first (keeps this linear): a span to the end longer than the\n // math limit plus its surrounding whitespace can never pair.\n let lead = 0;\n while (lead <= MAX_MATH_SPAN && /\\s/.test(text[token + 2 + lead] ?? \"x\")) lead++;\n if (text.length - (token + 2) - lead - trail > MAX_MATH_SPAN) continue;\n const inner = text.slice(token + 2);\n const s = inner.trim();\n if (STRUCTURAL_MARKDOWN.test(s) || s.length > MAX_MATH_SPAN) continue;\n if (!opensFlowBlock(text, token) && /\\n[ \\t]*\\n/.test(inner)) continue;\n if ((s.match(PROSE_WORD) ?? []).length >= PROSE_WORD_LIMIT * 3) continue;\n return token;\n }\n return -1;\n}\n\n/** Map of `$$` opener offset → closer offset for every pair the renderer shows as math. */\nexport function pairDisplayMath(text: string): Map<number, number> {\n const pairs = new Map<number, number>();\n if (!text.includes(\"$$\")) return pairs;\n const ranges = codeRanges(text);\n const tokens: number[] = [];\n let r = 0;\n let maxEnd = -1;\n for (let i = text.indexOf(\"$$\"); i !== -1 && i < text.length - 1; i = text.indexOf(\"$$\", i)) {\n while (r < ranges.length && (ranges[r] as [number, number])[0] <= i) {\n maxEnd = Math.max(maxEnd, (ranges[r] as [number, number])[1]);\n r++;\n }\n if (maxEnd <= i) tokens.push(i);\n i += 2; // never treat the second `$` of a pair as a new opener\n }\n let j = 0;\n while (j < tokens.length) {\n const open = tokens[j] as number;\n const close = tokens[j + 1];\n if (close === undefined) break;\n if (isMathPlaceholder(text.slice(open + 2, close))) {\n j += 2;\n continue;\n }\n if (looksLikeDisplayMath(text.slice(open + 2, close), opensFlowBlock(text, open))) {\n pairs.set(open, close);\n j += 2;\n continue;\n }\n j += 1;\n }\n return pairs;\n}\n","import { isMathPlaceholder } from \"./math-pairs\";\n\nconst TEX_SIGNAL = /\\\\[A-Za-z]+|[\\\\^_{}=<>+]/;\nconst LONE_VARIABLE = /^[A-Za-z](?:'|[0-9])?$/;\nconst MATH_SHAPE_CHARS = /^[A-Za-z0-9'\\s(),.*\\/-]+$/;\n\n/**\n * THE single-dollar math rule — the one predicate that decides whether a\n * CLOSED `$…$` is inline math or currency, on screen, in every export and in\n * the editor's islands (the renderer's normalizer, the source tokenizer and\n * print all ask it).\n *\n * Pandoc's `tex_math_dollars` delimiters (what remark-math approximates, and\n * how ChatGPT and Claude render): the opening `$` is followed by a\n * non-space, the closing `$` is preceded by a non-space and not followed by a\n * digit — so `$5 and $10`, `$5-$10`, `$5/$10` stay currency while `$FC$`,\n * `$AB$`, `$5$` and `$(0, 0)$` are math. On top of that, content that reads as\n * something other than a formula is refused — each guard is a false positive\n * measured in stored answers (matrx-frontend\n * `scripts/measure-single-dollar-rule.ts`, 2026-09-25: over 85k assistant\n * messages and 4k notes the widening adds 128 spans, every one a formula\n * (`$FC$`, `$(0, 0)$`, `$3x + 6 = 15$`), and drops 22 the old rule drew as\n * math that were code, template literals, a printf or broken TeX):\n * - an unescaped `%` — TeX's comment character, and a percentage\n * (`$\\ge$20% owners**…**$`, a printf `%1$s`);\n * - a closing bracket or `/` first, or an opening bracket last\n * (`[$X] plus [$Y]`, `($/SF/Yr) | High-Cost Market ($`, a regex\n * `/…/, '').replace(/…$`), or a straight quote at either end (`[\"$\", \"$\"]`\n * in data);\n * - `:` `;` `,` `/` last — a separator between two `$` words\n * (`$HOME/.local/bin:$PATH`, `$AAPL/$TSLA`);\n * - a number glued to a following letter (`$10$N9qo…`, a bcrypt cost);\n * - a placeholder (`$...$`);\n * - prose, unless a TeX command or operator says otherwise: two plain\n * words (`$Tipping (fee)$`), a contraction (`$I'm$`, never `$X'Y$`), an\n * abbreviation (`$e.g. (x)$`).\n */\nexport function isSingleDollarMath(\n content: string,\n after: string | undefined,\n): boolean {\n if (!content || content.length > 400) return false;\n if (/^\\s/.test(content) || /\\s$/.test(content)) return false;\n if (after !== undefined && /[0-9]/.test(after)) return false;\n if (/(?:^|[^\\\\])%/.test(content)) return false;\n if (/^[)\\]}\"/]/.test(content) || /[(\\[{\":;,/]$/.test(content)) return false;\n if (/^[0-9]/.test(content) && after !== undefined && /[A-Za-z]/.test(after)) return false;\n if (isMathPlaceholder(content)) return false;\n return TEX_SIGNAL.test(content) || !readsAsProse(content);\n}\n\nconst FUNCTION_NAMES = new Set([\n \"sin\", \"cos\", \"tan\", \"sec\", \"csc\", \"cot\", \"log\", \"ln\", \"exp\",\n \"lim\", \"max\", \"min\", \"det\", \"gcd\", \"mod\", \"arg\", \"sinh\", \"cosh\", \"tanh\",\n]);\n\n/**\n * Words, not symbols: two plain words of three or more letters (standard\n * function names aside) with a space between them, a contraction (`I'm` — a\n * prime is never followed by a lowercase letter; `X'Y` is Boolean algebra), or an abbreviation (`e.g.` — a letter\n * is never followed by a period; `x.y` inside parentheses is fine).\n */\nfunction readsAsProse(content: string): boolean {\n if (/[A-Za-z]'[a-z]/.test(content)) return true;\n if (/(?:^|[\\s(,])[A-Za-z]\\.(?:[A-Za-z]\\.|\\s|$)/.test(content)) return true;\n if (!/\\s/.test(content)) return false;\n const words = (content.match(/[A-Za-z]{3,}/g) ?? []).filter((w) => !FUNCTION_NAMES.has(w.toLowerCase()));\n return words.length >= 2;\n}\n\n/**\n * Whether an UNCLOSED `$…` already reads as a formula — for a stream that\n * must decide before the closing `$` arrives (matrx-frontend `stream-heal`\n * holds such a tail back instead of printing raw TeX). Stricter than\n * {@link isSingleDollarMath} on purpose: with no closer there are no Pandoc\n * delimiter facts yet, so it needs a math SIGNAL — a TeX command or operator\n * (`\\alpha`, `^`, `_`, `{`, `=`, …), a lone variable (`x`, `x'`), or a\n * single-letter math shape (`f(g(x))`, `u v`). Content that opens with a digit\n * needs a real TeX command, so `$35 per stop` keeps showing while it streams.\n */\nexport function looksLikeOpenInlineMath(partial: string): boolean {\n if (!partial || partial.length > 400) return false;\n if (/^\\s/.test(partial) || /\\s$/.test(partial)) return false;\n if (LONE_VARIABLE.test(partial)) return true;\n if (/^[0-9]/.test(partial)) return /\\\\[A-Za-z]+|[\\\\^_{}]/.test(partial);\n return TEX_SIGNAL.test(partial) || isMathShape(partial);\n}\n\n/**\n * A math SHAPE with no TeX command or operator: single-letter identifiers\n * (optionally primed, optionally a standard function name) applied,\n * juxtaposed or listed — `f(g(x))`, `u v`, `f'(x)`, `(x, y)`, `ln(x)`.\n */\nfunction isMathShape(content: string): boolean {\n if (!MATH_SHAPE_CHARS.test(content)) return false;\n const words = content.match(/[A-Za-z]+/g);\n if (!words) return false;\n if (!words.every((w) => w.length === 1 || FUNCTION_NAMES.has(w))) return false;\n if (/[A-Za-z]'+[A-Za-z]/.test(content) || /(?:^|[\\s(,])[A-Za-z]\\.(?:[A-Za-z]\\.|\\s|$)/.test(content)) return false;\n return /[A-Za-z]'*\\(|[A-Za-z]'|\\b[A-Za-z]\\s+[A-Za-z]\\b|\\([^)]*[A-Za-z][^)]*\\)/.test(content);\n}\n\n/**\n * Where a single-dollar math span opened at `open` (a lone `$`) closes, or -1.\n * Same scan the normalizer uses: same line, backslash-escapes skipped, the\n * closer is a `$` not followed by another `$`, and the content passes\n * {@link isSingleDollarMath}. Returns the offset just past the closing `$`.\n */\nexport function singleDollarMathEnd(text: string, open: number, limit = text.length): number {\n // Content over 400 characters is never math, so the scan never needs to go\n // further — this keeps a line full of `$` linear.\n const bound = Math.min(limit, open + 403);\n let close = -1;\n for (let k = open + 1; k < bound; k += 1) {\n const c = text[k];\n if (c === \"\\n\") break;\n if (c === \"\\\\\") {\n k += 1;\n continue;\n }\n if (c === \"$\") {\n close = k;\n break;\n }\n }\n if (close === -1 || text[close + 1] === \"$\") return -1;\n const content = text.slice(open + 1, close);\n return isSingleDollarMath(content, text[close + 1]) ? close + 1 : -1;\n}\n\n/** TeX that no prose carries: a command, a superscript, a brace, a relation or `+`, a subscript on a letter. */\nconst BRACKET_TEX_SIGNAL = /\\\\[A-Za-z]+|[\\^{}=<>+]|_\\{|(?:^|[^A-Za-z0-9])[A-Za-z]_[A-Za-z0-9](?![A-Za-z0-9])/;\n\n/**\n * THE escaped-bracket rule — whether a closed `\\[ … \\]` is display math or\n * CommonMark's escaped brackets (literal `[ … ]`). The tokenizer, the\n * renderer's normalizer and the editor all ask it.\n *\n * Math only when the content is real TeX (BRACKET_TEX_SIGNAL) and the `\\[`\n * is not an index on an identifier (`arr\\[i+1\\]`, `f(x)\\[k\\]`).\n * Everything a person writes with escaped brackets stays text: citations\n * `\\[1\\]`, dates `\\[2026-09-25\\]`, task boxes `- \\[x\\]`, editorial\n * insertions `\\[was\\]`, placeholders `\\[site name\\]` (verify-RC-B4 R3-2).\n * `before` is the character just before the `\\[` (undefined at the start).\n */\nexport function isEscapedBracketMath(content: string, before: string | undefined): boolean {\n if (!content.trim()) return false;\n if (before !== undefined && /[A-Za-z0-9_)\\]]/.test(before)) return false;\n return BRACKET_TEX_SIGNAL.test(content);\n}\n","/**\n * XML tag reading + the generic-container balance scanner.\n *\n * Ported VERBATIM (behaviour) from matrx-frontend\n * `components/mardown-display/blocks/xml/readXmlTag.ts` and the\n * `XmlContainerTracker` in\n * `components/mardown-display/markdown-classification/processors/utils/content-splitter-v2.ts`\n * so the source tokenizer ends a generic XML section exactly where the\n * renderer does. Fences inside the section are found by THE one code-range\n * rule (source/code-ranges.ts `fenceOpenerOf` + `FenceReader`), which the\n * renderer's splitter imports too (RC-B10).\n */\nimport { FenceReader, fenceOpenerOf } from \"./code-ranges\";\n\nexport interface ReadXmlTag {\n tagName: string;\n raw: string;\n isClosing: boolean;\n isSelfClosing: boolean;\n attributes: Array<{ name: string; value: string }>;\n}\n\nconst XML_NAME_START = /[A-Za-z_]/;\nconst XML_NAME_CHARACTER = /[\\w.:-]/;\nconst WHITESPACE = /\\s/;\n\n/**\n * `find(needle, from)` must behave like `content.indexOf(needle, from)`; the\n * tokenizer passes a cached occurrence index so a text full of unclosed\n * attribute quotes stays linear. Behaviour is identical either way.\n */\nexport function readXmlTag(\n content: string,\n start: number,\n find: (needle: string, from: number) => number = (needle, from) => content.indexOf(needle, from),\n): ReadXmlTag | null {\n let cursor = start + 1;\n const isClosing = content[cursor] === \"/\";\n if (isClosing) cursor++;\n if (!XML_NAME_START.test(content[cursor] ?? \"\")) return null;\n const nameStart = cursor;\n while (XML_NAME_CHARACTER.test(content[cursor] ?? \"\")) cursor++;\n const tagName = content.slice(nameStart, cursor);\n const attributes: Array<{ name: string; value: string }> = [];\n if (isClosing) {\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n if (content[cursor] !== \">\") return null;\n return {\n tagName,\n raw: content.slice(start, cursor + 1),\n isClosing,\n isSelfClosing: false,\n attributes,\n };\n }\n while (cursor < content.length) {\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n if (content[cursor] === \">\")\n return {\n tagName,\n raw: content.slice(start, cursor + 1),\n isClosing,\n isSelfClosing: false,\n attributes,\n };\n if (content[cursor] === \"/\") {\n cursor++;\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n if (content[cursor] !== \">\") return null;\n return {\n tagName,\n raw: content.slice(start, cursor + 1),\n isClosing,\n isSelfClosing: true,\n attributes,\n };\n }\n if (!XML_NAME_START.test(content[cursor] ?? \"\")) return null;\n const attributeStart = cursor;\n while (XML_NAME_CHARACTER.test(content[cursor] ?? \"\")) cursor++;\n const name = content.slice(attributeStart, cursor);\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n if (content[cursor] !== \"=\") return null;\n cursor++;\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n const quote = content[cursor];\n if (quote !== '\"' && quote !== \"'\") return null;\n const valueStart = ++cursor;\n const valueEnd = find(quote, valueStart);\n if (valueEnd === -1) return null;\n cursor = valueEnd;\n attributes.push({ name, value: content.slice(valueStart, cursor) });\n cursor++;\n }\n return null;\n}\n\nfunction isEscapedBacktick(line: string, offset: number): boolean {\n let slashes = 0;\n for (let i = offset - 1; line[i] === \"\\\\\"; i--) slashes++;\n return slashes % 2 === 1;\n}\n\n/**\n * Balances ONE unknown root tag line by line, ignoring lookalike tags inside\n * fenced code, inline code spans, comments and CDATA. `consumeLine` returns\n * the offset (within that line) just past the root's closing tag, or null.\n */\nexport class XmlContainerTracker {\n private depth = 0;\n private inComment = false;\n private inCdata = false;\n private inlineTicks = 0;\n /** The open fence, read by THE one closer (source/code-ranges.ts). */\n private fence: FenceReader | null = null;\n\n constructor(readonly rootTag: string) {}\n\n consumeLine(line: string, startOffset = 0): number | null {\n if (this.fence) {\n if (this.fence.feed(line)) this.fence = null;\n return null;\n }\n if (!this.inComment && !this.inCdata && this.inlineTicks === 0) {\n const opener = fenceOpenerOf(line);\n if (opener) {\n this.fence = new FenceReader(opener);\n return null;\n }\n }\n\n for (let i = startOffset; i < line.length; i++) {\n if (this.inlineTicks > 0) {\n if (line[i] === \"`\") {\n let end = i;\n while (line[end] === \"`\") end++;\n if (end - i === this.inlineTicks) this.inlineTicks = 0;\n i = end - 1;\n }\n continue;\n }\n if (this.inComment) {\n const end = line.indexOf(\"-->\", i);\n if (end === -1) return null;\n this.inComment = false;\n i = end + 2;\n continue;\n }\n if (this.inCdata) {\n const end = line.indexOf(\"]]>\", i);\n if (end === -1) return null;\n this.inCdata = false;\n i = end + 2;\n continue;\n }\n if (line.startsWith(\"<!--\", i)) {\n this.inComment = true;\n i += 3;\n continue;\n }\n if (line.startsWith(\"<![CDATA[\", i)) {\n this.inCdata = true;\n i += 8;\n continue;\n }\n if (line[i] === \"`\" && !isEscapedBacktick(line, i)) {\n let end = i;\n while (line[end] === \"`\") end++;\n this.inlineTicks = end - i;\n i = end - 1;\n continue;\n }\n if (line[i] !== \"<\") continue;\n const tag = readXmlTag(line, i);\n if (!tag) continue;\n const tagEnd = i + tag.raw.length;\n if (tag.tagName === this.rootTag) {\n if (tag.isClosing) this.depth--;\n else if (!tag.isSelfClosing) this.depth++;\n if (this.depth === 0) return tagEnd;\n }\n i = tagEnd - 1;\n }\n return null;\n }\n}\n","/**\n * THE OFFSET-PRESERVING SOURCE TOKENIZER (rich-content PLAN decision 6).\n *\n * Cuts stored markdown into blocks that cover the text EXACTLY: the\n * concatenation of every block's `raw` is the input, always, byte for byte.\n * Nothing is trimmed, normalized, or re-serialized here — the tokenizer only\n * draws boundaries. Every custom construct the platform stores (kinds and\n * `__kind` JSON, typed JSON blocks, special fences, XML sections including\n * attribute-bearing, mid-line and unknown containers, `{{variables}}`,\n * `<matrxcite/>`, math, raw HTML, code fences, HTML comments and pinned\n * anchors `<!--@a:…-->`) is an ISLAND: an atomic span no editor may parse\n * into its own model. Islands that sit inside running prose (a variable, a\n * citation, inline math) stay inside their paragraph as `inlines`, so a\n * visual editor keeps the paragraph whole and holds the island as an atom.\n *\n * Block kinds:\n * - `prose` — a markdown paragraph run (headings, lists, tables…): the only\n * thing a visual editor may re-serialize, and only when edited.\n * - `island` — a protected construct; `islandType` says which.\n * - `gap` — the line terminator(s) and blank lines between blocks. Never\n * edited; they keep the document's exact spacing.\n *\n * Streaming-tolerant: never throws on partial input. A construct whose\n * closer has not arrived yet becomes an island running to the end of the text\n * with `complete: false` — the same ownership rule the renderer's splitter\n * applies, so a half-streamed fence or XML section is never reflowed.\n *\n * Boundaries follow matrx-frontend's renderer splitter (`content-splitter-v2.ts`)\n * wherever it decides where a construct ends, so the editor and the renderer\n * agree on what is locked. Offsets are UTF-16 (`start`/`end`) and code points\n * (`startCp`/`endCp`).\n */\n\nimport { buildCodePointIndex } from \"./offsets\";\nimport {\n ALLOWED_RAW_HTML_TAGS,\n ATTRIBUTE_XML_NAMES,\n CITE_RE,\n HTML_BLOCK_LEVEL_TAGS,\n KNOWN_XML_TAG_NAMES,\n PINNED_ANCHOR_RE,\n SPECIAL_CODE_LANGUAGES,\n STRICT_VARIABLE_RE,\n THINKING_FAMILY,\n TREE_GLYPHS,\n TYPED_JSON_ROOT_KEYS,\n XML_TAG_BLOCK_NAMES,\n normalizeFenceLanguage,\n} from \"./constants\";\nimport { BacktickRuns, backtickRunLength, closeFence, fenceOpenerOf, type FenceLines, type FenceOpener } from \"./code-ranges\";\nimport { isEscapedBracketMath, singleDollarMathEnd } from \"./math\";\nimport { pairDisplayMath, pendingCodeSpanStart, pendingDisplayMathOpener } from \"./math-pairs\";\nimport { XmlContainerTracker, readXmlTag } from \"./xml-tag\";\n\nexport type SourceBlockKind = \"prose\" | \"island\" | \"gap\";\n\n/** Island types that own whole blocks. */\nexport type BlockIslandType =\n /** ``` / ~~~ fenced code of any language (meta.lang, meta.special). */\n | \"fence\"\n /** A bare JSON object block — typed JSON, `__kind` instances, directives. */\n | \"json\"\n /** A known attribute-less XML region (`<thinking>`, `<flashcards>`, …). */\n | \"xml_region\"\n /** An attribute-bearing XML element (`<artifact …>`, `<decision …>`, …). */\n | \"xml_attr\"\n /** Any other line-leading, balanced XML element. */\n | \"xml_container\"\n /** Allow-listed raw HTML block. */\n | \"html_block\"\n /** `<!-- … -->` comment. */\n | \"html_comment\"\n /** A pinned annotation anchor `<!--@a:id-->`. */\n | \"anchor\"\n /** `$$ … $$` display math on its own lines. */\n | \"math_block\"\n /** YAML (`---`) or TOML (`+++`) front matter at the start of the text (meta.format). */\n | \"front_matter\"\n /** A box-drawing tree diagram. */\n | \"tree\"\n /**\n * A generic-directive container `:::name[label]{attrs}` … `:::` (tabs,\n * columns, details, figures, callouts, TOC — meta.name), a leaf directive\n * `::name` on its own line (meta.leaf), or a MkDocs admonition\n * `!!! type \"Title\"` / `??? type` with its indented body (meta.syntax \"mkdocs\").\n */\n | \"directive\"\n /** A GitHub alert / Obsidian callout: a blockquote opening `> [!TYPE]` (meta.name). */\n | \"callout\"\n /** A footnote definition `[^id]: …` with its indented continuation lines (meta.id). */\n | \"footnote_def\";\n\n/** Island types that live inside a prose block. */\nexport type InlineIslandType =\n | \"variable\"\n | \"cite\"\n | \"math_inline\"\n | \"html_tag\"\n | \"xml_tag\"\n | \"xml_inline\"\n | \"html_comment\"\n | \"anchor\"\n | \"kind_json\"\n | \"media_ref\"\n /** `[[Page]]`, `[[Page|alias]]` (meta.target) — or `![[Page]]` (meta.embed). */\n | \"wikilink\";\n\nexport type IslandType = BlockIslandType | InlineIslandType;\n\nexport type IslandMeta = Readonly<Record<string, string | number | boolean>>;\n\nexport interface SourceSpan {\n /** UTF-16 offset of the first code unit. */\n readonly start: number;\n /** UTF-16 offset just past the last code unit. */\n readonly end: number;\n /** Code-point offset of `start`. */\n readonly startCp: number;\n /** Code-point offset of `end`. */\n readonly endCp: number;\n /** Exactly `text.slice(start, end)`. */\n readonly raw: string;\n}\n\nexport interface SourceIsland extends SourceSpan {\n readonly islandType: IslandType;\n /** True when the island sits inside a prose block. */\n readonly inline: boolean;\n /** False when the construct's closer never arrived (streaming / malformed). */\n readonly complete: boolean;\n readonly meta: IslandMeta;\n}\n\nexport interface SourceBlock extends SourceSpan {\n readonly kind: SourceBlockKind;\n /** Set only on `island` blocks. */\n readonly islandType: BlockIslandType | null;\n readonly complete: boolean;\n readonly meta: IslandMeta;\n /** Inline islands of a `prose` block, in document order. Empty otherwise. */\n readonly inlines: readonly SourceIsland[];\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// helpers\n// ─────────────────────────────────────────────────────────────────────────\n\ninterface RawIsland {\n type: IslandType;\n start: number;\n end: number;\n complete: boolean;\n meta: Record<string, string | number | boolean>;\n}\n\ninterface RawBlock {\n kind: SourceBlockKind;\n start: number;\n end: number;\n island: RawIsland | null;\n inlines: RawIsland[];\n}\n\nconst NOT_WHITESPACE = /\\S/;\n/** `:::name`, `::name` (leaf) — a name right after the colons. */\nconst DIRECTIVE_OPEN = /^(:{2,})([A-Za-z][\\w-]*)/;\nconst MKDOCS_OPEN = /^(!!!|\\?\\?\\?\\+?)[ \\t]+([A-Za-z][\\w-]*)/;\nconst CALLOUT_OPEN = /^>[ \\t]*\\[!([A-Za-z][\\w-]*)\\]([+-])?/;\n/**\n * Every callout spelling the renderer resolves (matrx-frontend\n * components/markdown-core/syntax/callout-types.ts ALIASES — keep in step).\n */\nexport const CALLOUT_NAMES: ReadonlySet<string> = new Set([\n \"note\", \"seealso\", \"example\", \"tip\", \"hint\", \"important\", \"warning\", \"warn\", \"attention\",\n \"caution\", \"danger\", \"error\", \"failure\", \"fail\", \"missing\", \"bug\", \"info\", \"abstract\",\n \"summary\", \"tldr\", \"todo\", \"success\", \"check\", \"done\", \"question\", \"help\", \"faq\", \"quote\", \"cite\",\n]);\nconst FOOTNOTE_DEF = /^\\[\\^([^\\]\\s]+)\\]:/;\n\nfunction countStructuralBraces(source: string): { opens: number; closes: number } {\n let opens = 0;\n let closes = 0;\n let inString = false;\n let escaped = false;\n for (let i = 0; i < source.length; i++) {\n const char = source[i];\n if (inString) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === '\"') inString = false;\n continue;\n }\n if (char === '\"') inString = true;\n else if (char === \"{\") opens++;\n else if (char === \"}\") closes++;\n }\n return { opens, closes };\n}\n\nfunction firstJsonKey(content: string): string | null {\n const match = /^\\{\\s*\"([^\"]+)\"/.exec(content.trimStart());\n return match ? (match[1] as string) : null;\n}\n\n/** Describe a JSON object's platform identity for island meta. */\nfunction jsonMeta(content: string): Record<string, string | number | boolean> {\n const meta: Record<string, string | number | boolean> = {};\n const key = firstJsonKey(content);\n if (key) meta.firstKey = key;\n try {\n const parsed: unknown = JSON.parse(content.trim());\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n const kind = (parsed as Record<string, unknown>).__kind;\n if (typeof kind === \"string\" && kind.trim()) meta.kind = kind;\n }\n } catch {\n // partial or malformed — identity from the head only\n const head = /^\\{\\s*\"__kind\"\\s*:\\s*\"([^\"]*)\"/.exec(content.trimStart());\n if (head) meta.kind = head[1] as string;\n }\n if (typeof meta.kind === \"string\" && meta.kind.startsWith(\"directive_v\")) {\n meta.directive = true;\n }\n if (key === \"matrx_version\") meta.directive = true;\n if (key && TYPED_JSON_ROOT_KEYS[key]) meta.typed = TYPED_JSON_ROOT_KEYS[key] as string;\n return meta;\n}\n\n/** A JSON object head the renderer already treats as a typed/kind block mid-stream. */\nfunction isRecognizedJsonHead(content: string): boolean {\n const key = firstJsonKey(content);\n if (!key) return false;\n return key === \"__kind\" || key === \"matrx_version\" || key in TYPED_JSON_ROOT_KEYS;\n}\n\nfunction matchingJsonObjectEnd(source: string, start: number, limit: number): number | null {\n if (source[start] !== \"{\") return null;\n const stack: string[] = [\"{\"];\n let inString = false;\n let escaped = false;\n for (let index = start + 1; index < limit; index++) {\n const char = source[index];\n if (inString) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === '\"') inString = false;\n continue;\n }\n if (char === '\"') {\n inString = true;\n continue;\n }\n if (char === \"{\" || char === \"[\") {\n stack.push(char);\n continue;\n }\n if (char !== \"}\" && char !== \"]\") continue;\n const opening = stack.pop();\n if ((char === \"}\" && opening !== \"{\") || (char === \"]\" && opening !== \"[\")) return null;\n if (stack.length === 0) return index + 1;\n }\n return null;\n}\n\nfunction declaredKind(candidate: string): string | null {\n try {\n const parsed: unknown = JSON.parse(candidate);\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) return null;\n const kind = (parsed as Record<string, unknown>).__kind;\n return typeof kind === \"string\" && kind.trim() ? kind : null;\n } catch {\n return null;\n }\n}\n\n/** Splitter's `isUnclosedGenericXmlOpening`: an unknown opening tag still arriving. */\nfunction isUnclosedGenericXmlOpening(source: string): boolean {\n const text = source.trimStart();\n const prefix = /^<([A-Za-z_][\\w.:-]*)(?=\\s|\\/|$)/.exec(text);\n if (\n !prefix ||\n KNOWN_XML_TAG_NAMES.has(prefix[1] as string) ||\n ALLOWED_RAW_HTML_TAGS.has((prefix[1] as string).toLowerCase())\n )\n return false;\n let quote: string | null = null;\n for (let i = prefix[0].length; i < text.length; i++) {\n if (quote) {\n if (text[i] === quote) quote = null;\n } else if (text[i] === \"'\" || text[i] === '\"') quote = text[i] as string;\n else if (text[i] === \">\") return false;\n }\n return true;\n}\n\n/** The renderer splitter's `isTreeLine` (box glyphs OR ASCII connectors) — used only to stop a root walk-back. */\nfunction isSplitterTreeLine(line: string): boolean {\n return TREE_GLYPHS.test(line) || /^[\\s│|]*[├└+|][\\s─\\-]+/.test(line);\n}\n\nconst MEDIA_REF_PREFIXES = [\"[Image URL:\", \"[Video URL:\", \"[Audio URL:\"] as const;\n\n// ─────────────────────────────────────────────────────────────────────────\n// the tokenizer\n// ─────────────────────────────────────────────────────────────────────────\n\nclass Tokenizer {\n private readonly n: number;\n private readonly lineStarts: number[] = [];\n private readonly contentEnds: number[] = [];\n private readonly lineEnds: number[] = [];\n private readonly blocks: RawBlock[] = [];\n private readonly blockCache = new Map<number, RawIsland | null>();\n /** Lazily built: for line i, first line j >= i where brace net from i drops to <= 0. */\n private braceStop: Int32Array | null = null;\n private braceNet: Int32Array | null = null;\n /** Every occurrence offset of each needle searched so far (overlapping, like indexOf). */\n private readonly occurrences = new Map<string, number[]>();\n /** `$$` opener → closer for the pairs the core renders as math. */\n private readonly mathPairs: Map<number, number>;\n private readonly finder = (needle: string, from: number): number => this.next(needle, from);\n\n constructor(\n private readonly text: string,\n private readonly streaming = false,\n private readonly meter: { work: number } | undefined = undefined,\n ) {\n this.n = text.length;\n this.tick(text.length); // the line split below walks the whole text\n this.mathPairs = pairDisplayMath(text);\n // Streaming: a `$$` still waiting for its partner may yet turn what follows\n // into math, so nothing at or after it is an island yet (G5).\n this.provisionalFrom = streaming ? pendingDisplayMathOpener(text) : -1;\n if (this.provisionalFrom === -1) this.provisionalFrom = Number.POSITIVE_INFINITY;\n // Streaming: the pairing rule's code ranges depend on backtick / tilde runs\n // the next bytes can still complete (`` → ```, an inline span's closing `),\n // which can re-pair `$$` tokens already read. Pair the text as if each\n // completion had arrived; any `$$` paired differently is not settled.\n if (streaming && text.includes(\"$$\")) {\n // A code span the final paragraph may still close can swallow any `$$`\n // after its opener (the pairing rule's code spans run across lines).\n // Only `$$` readings can change: the first token after the span's opener,\n // and the opener of any pair whose closer lies after it.\n const span = pendingCodeSpanStart(text);\n if (span !== -1) {\n const firstToken = text.indexOf(\"$$\", span);\n if (firstToken !== -1) this.provisionalFrom = Math.min(this.provisionalFrom, firstToken);\n for (const [open, close] of this.mathPairs) {\n if (close >= span) this.provisionalFrom = Math.min(this.provisionalFrom, open);\n }\n }\n for (const pad of [\"`\", \"``\", \"```\", \"~~~\"]) {\n const alt = pairDisplayMath(text + pad);\n for (const [open, close] of this.mathPairs) {\n if (alt.get(open) !== close) this.provisionalFrom = Math.min(this.provisionalFrom, open);\n }\n for (const [open, close] of alt) {\n if (close < text.length && this.mathPairs.get(open) !== close) {\n this.provisionalFrom = Math.min(this.provisionalFrom, open);\n }\n }\n }\n }\n let start = 0;\n for (let i = 0; i < text.length; i++) {\n if (text.charCodeAt(i) === 10) {\n this.lineStarts.push(start);\n this.contentEnds.push(i > start && text.charCodeAt(i - 1) === 13 ? i - 1 : i);\n this.lineEnds.push(i + 1);\n start = i + 1;\n }\n }\n if (start < text.length || text.length === 0) {\n // Streaming: a final lone CR is the first half of a CRLF still arriving —\n // it is not content (once the LF lands it never is), so a construct\n // ending on this line does not shrink by one when it does (G5).\n this.pendingCR = streaming && text.length > start && text.charCodeAt(text.length - 1) === 13;\n this.lineStarts.push(start);\n this.contentEnds.push(this.pendingCR ? text.length - 1 : text.length);\n this.lineEnds.push(text.length);\n }\n }\n\n /** Streaming: where provisional text starts (a pending `$$`), or +∞. */\n private provisionalFrom = Number.POSITIVE_INFINITY;\n\n /** Streaming: the text ends in a lone CR whose LF has not arrived yet. */\n private pendingCR = false;\n\n /**\n * Streaming: an open last line that begins with `{` is undecided — each new\n * byte can balance or unbalance its braces and flip the whole line between\n * prose and a JSON island — and so is a line that is exactly one allowed\n * HTML tag so far; both are provisional until they end (G5).\n */\n private markOpenJsonTail(): void {\n const last = this.lineStarts.length - 1;\n if (!this.isOpenTail(last)) return;\n const start = this.lineStarts[last] as number;\n const t = this.lineText(last).trim();\n // A line that is (so far) exactly one allowed HTML tag becomes a block when\n // it ends, or stays prose if more arrives — undecided either way.\n const oneTag = t.startsWith(\"<\") ? readXmlTag(t, 0) : null;\n const loneTag = !!oneTag && oneTag.raw === t && ALLOWED_RAW_HTML_TAGS.has(oneTag.tagName.toLowerCase());\n if (t.startsWith(\"{\") || loneTag) {\n this.provisionalFrom = Math.min(this.provisionalFrom, start);\n }\n }\n\n /**\n * `text.indexOf(needle, from)` in O(log k): the first query for a needle\n * indexes all of its occurrences once, so repeated searches for a closer\n * that never comes stay linear over the whole text.\n */\n private next(needle: string, from: number): number {\n let list = this.occurrences.get(needle);\n if (!list) {\n list = [];\n for (let at = this.text.indexOf(needle); at !== -1; at = this.text.indexOf(needle, at + 1)) {\n list.push(at);\n }\n this.occurrences.set(needle, list);\n }\n let lo = 0;\n let hi = list.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if ((list[mid] as number) < from) lo = mid + 1;\n else hi = mid;\n }\n return lo < list.length ? (list[lo] as number) : -1;\n }\n\n /** Charge `n` visited characters to the diagnostic meter (complexity tests). */\n private tick(n: number): void {\n if (this.meter) this.meter.work += n;\n }\n\n /** Streaming only: a paragraph ending at `pe` may still be continued by a line not yet arrived. */\n private paragraphMayGrow(pe: number): boolean {\n if (!this.streaming) return false;\n const rest = this.n - pe;\n if (rest === 0) return true;\n const tail = this.text.slice(pe);\n return tail === \"\\n\" || tail === \"\\r\\n\" || tail === \"\\r\";\n }\n\n /** Streaming only: the final line, still waiting for its terminator. */\n private isOpenTail(k: number): boolean {\n return (\n this.streaming &&\n k === this.lineStarts.length - 1 &&\n (this.lineEnds[k] === this.contentEnds[k] || this.pendingCR)\n );\n }\n\n private get lineCount(): number {\n return this.lineStarts.length;\n }\n\n private lineOf(pos: number): number {\n let lo = 0;\n let hi = this.lineStarts.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >>> 1;\n if ((this.lineStarts[mid] as number) <= pos) lo = mid;\n else hi = mid - 1;\n }\n return lo;\n }\n\n private isBlank(from: number, to: number): boolean {\n return !NOT_WHITESPACE.test(this.text.slice(from, to));\n }\n\n private lineIsBlank(li: number): boolean {\n return this.isBlank(this.lineStarts[li] as number, this.contentEnds[li] as number);\n }\n\n private lineText(li: number): string {\n return this.text.slice(this.lineStarts[li] as number, this.contentEnds[li] as number);\n }\n\n run(): RawBlock[] {\n if (this.streaming) this.markOpenJsonTail();\n let pos = 0;\n while (pos < this.n) {\n const li = this.lineOf(pos);\n const ce = this.contentEnds[li] as number;\n if (this.isBlank(pos, ce)) {\n pos = this.gap(pos, li);\n continue;\n }\n if (pos >= this.provisionalFrom) {\n this.push({ kind: \"prose\", start: pos, end: this.n, island: null, inlines: [] });\n break;\n }\n const island = this.detectBlock(pos, li, true);\n if (island) {\n this.push({ kind: \"island\", start: island.start, end: island.end, island, inlines: [] });\n pos = island.end;\n continue;\n }\n pos = this.paragraph(pos, li);\n }\n return this.blocks;\n }\n\n private push(block: RawBlock): void {\n if (block.end <= block.start) return;\n if (block.kind === \"prose\" && this.isBlank(block.start, block.end)) {\n block = { kind: \"gap\", start: block.start, end: block.end, island: null, inlines: [] };\n }\n const last = this.blocks[this.blocks.length - 1];\n if (block.kind === \"gap\" && last && last.kind === \"gap\" && last.end === block.start) {\n last.end = block.end;\n return;\n }\n this.blocks.push(block);\n }\n\n private gap(pos: number, li: number): number {\n let end = this.lineEnds[li] as number;\n let k = li + 1;\n while (k < this.lineCount && this.lineIsBlank(k)) {\n end = this.lineEnds[k] as number;\n k++;\n }\n this.push({ kind: \"gap\", start: pos, end, island: null, inlines: [] });\n return end;\n }\n\n // ── block detection ────────────────────────────────────────────────────\n\n private detectBlock(p: number, li: number, atParaStart: boolean): RawIsland | null {\n const cacheKey = atParaStart ? -1 - p : p;\n if (this.blockCache.has(cacheKey)) return this.blockCache.get(cacheKey) ?? null;\n const found = this.detectBlockUncached(p, li, atParaStart);\n this.blockCache.set(cacheKey, found);\n return found;\n }\n\n private detectBlockUncached(p: number, li: number, atParaStart: boolean): RawIsland | null {\n const ce = this.contentEnds[li] as number;\n const seg = this.text.slice(p, ce);\n const t = seg.trimStart();\n const indent = seg.length - t.length;\n const tp = p + indent;\n\n if (p === 0) {\n const fm = this.frontMatter(li, t);\n if (fm) return fm;\n }\n // An indented `:::` / `> [!x]` under a list item belongs to that item:\n // the renderer draws it INSIDE the list, so it must stay in the list's\n // prose block — cutting it out would let an editor move it away from its\n // item (verify-RC-B8 round 2, SAFETY).\n const listNested = indent > 0 && this.inListContinuation(li);\n if (indent <= 3 && !listNested && t.startsWith(\"::\")) {\n const directive = this.directive(p, li, t);\n if (directive) return directive;\n }\n if (indent === 0 && (t.startsWith(\"!!!\") || t.startsWith(\"???\"))) {\n const admonition = this.mkdocsAdmonition(p, li, t);\n if (admonition) return admonition;\n }\n if (indent <= 3 && !listNested && t.startsWith(\">\")) {\n const callout = this.callout(p, li, t);\n if (callout) return callout;\n }\n if (atParaStart && indent <= 3 && t.startsWith(\"[^\")) {\n const footnote = this.footnoteDefinition(p, li, t);\n if (footnote) return footnote;\n }\n // THE one fence rule (source/code-ranges.ts): backtick at any indent, tilde at <= 3.\n const fence = fenceOpenerOf(seg);\n if (fence?.char === \"`\") return this.backtickFence(p, li, fence);\n if (fence?.char === \"~\") return this.tildeFence(p, li, fence);\n if (t.startsWith(\"$$\")) {\n const math = this.mathBlock(p, tp);\n if (math) return math;\n }\n if (t.startsWith(\"<\")) {\n const attr = this.attributeXml(p, tp, t);\n if (attr) return attr;\n const region = this.xmlRegion(p, tp, t);\n if (region) return region;\n const container = this.genericXml(p, li, seg, indent);\n if (container) return container;\n if (t.startsWith(\"<!--\")) {\n const comment = this.blockComment(p, tp, li);\n if (comment) return comment;\n }\n const html = this.htmlBlock(p, li, t, tp, atParaStart);\n if (html) return html;\n }\n if (t.startsWith(\"{\")) {\n const json = this.bareJson(p, li, tp);\n if (json) return json;\n }\n if (TREE_GLYPHS.test(t)) {\n const tree = this.tree(p, li);\n if (tree) return tree;\n }\n return null;\n }\n\n /** True when line `li` continues a list item (the nearest non-blank line above is a list item or indented text under one). */\n private inListContinuation(li: number): boolean {\n for (let k = li - 1; k >= 0; k--) {\n const line = this.lineText(k);\n if (!NOT_WHITESPACE.test(line)) continue;\n if (/^[ \\t]*(?:[-*+]|\\d{1,9}[.)])[ \\t]/.test(line)) return true;\n if (/^[ \\t]/.test(line)) continue;\n return false;\n }\n return false;\n }\n\n private island(\n type: IslandType,\n start: number,\n end: number,\n complete: boolean,\n meta: Record<string, string | number | boolean> = {},\n ): RawIsland {\n return { type, start, end, complete, meta };\n }\n\n private frontMatter(li: number, t: string): RawIsland | null {\n const fence = this.lineText(li);\n if ((fence !== \"---\" && fence !== \"+++\") || t !== fence) return null;\n const toml = fence === \"+++\";\n let sawContent = false;\n for (let k = li + 1; k < this.lineCount; k++) {\n const line = this.lineText(k);\n if (line === fence || (!toml && line === \"...\")) {\n return sawContent\n ? this.island(\"front_matter\", 0, this.contentEnds[k] as number, true, { format: toml ? \"toml\" : \"yaml\" })\n : null;\n }\n if (!NOT_WHITESPACE.test(line)) continue;\n const shaped = toml\n ? /^\\s*(?:[A-Za-z0-9_.\"-]+\\s*=|\\[|#)/.test(line)\n : /^(?:[A-Za-z0-9_\"'-][^:]*:(?:\\s|$)|\\s+\\S|-\\s|#)/.test(line);\n if (!shaped) return null;\n sawContent = true;\n }\n return null;\n }\n\n /**\n * `:::name[label]{attrs}` … closing `:::` (a colon run at least as long as\n * the opener's, nesting counted), or a leaf `::name[…]{…}` line. The whole\n * container is ONE island: its grammar (fence lengths, labels, attributes,\n * nested tabs) is exactly what a visual editor would re-serialize wrongly.\n */\n private directive(p: number, li: number, t: string): RawIsland | null {\n const open = DIRECTIVE_OPEN.exec(t);\n if (!open) return null;\n const colons = (open[1] as string).length;\n const name = open[2] as string;\n if (colons === 2) {\n return this.island(\"directive\", p, this.contentEnds[li] as number, true, { name, leaf: true });\n }\n const stack: number[] = [colons];\n for (let k = li + 1; k < this.lineCount; k++) {\n const line = this.lineText(k).trim();\n const inner = DIRECTIVE_OPEN.exec(line);\n if (inner && (inner[1] as string).length >= 3) {\n stack.push((inner[1] as string).length);\n continue;\n }\n const close = /^(:{3,})\\s*$/.exec(line);\n if (close && (close[1] as string).length >= (stack[stack.length - 1] as number)) {\n stack.pop();\n if (stack.length === 0) return this.island(\"directive\", p, this.contentEnds[k] as number, true, { name });\n }\n }\n return this.island(\"directive\", p, this.n, false, { name });\n }\n\n /** MkDocs `!!! type \"Title\"` / `??? type` / `???+ type` and its indented (or blank-separated indented) body. */\n private mkdocsAdmonition(p: number, li: number, t: string): RawIsland | null {\n const open = MKDOCS_OPEN.exec(t);\n if (!open) return null;\n let last = li;\n for (let k = li + 1; k < this.lineCount; k++) {\n const line = this.lineText(k);\n if (/^(?: {4}|\\t)/.test(line) && NOT_WHITESPACE.test(line)) {\n last = k;\n continue;\n }\n if (!NOT_WHITESPACE.test(line)) continue;\n break;\n }\n return this.island(\"directive\", p, this.contentEnds[last] as number, true, {\n name: (open[2] as string).toLowerCase(),\n syntax: \"mkdocs\",\n });\n }\n\n /** A blockquote whose first line is `> [!TYPE]…` — every following `>` line belongs to it. */\n private callout(p: number, li: number, t: string): RawIsland | null {\n const open = CALLOUT_OPEN.exec(t);\n // Only a name the renderer draws as a callout is one; `> [!BOGUS]` is an\n // ordinary quote there, so it stays editable prose here (verify-RC-B8).\n if (!open || !CALLOUT_NAMES.has((open[1] as string).toLowerCase())) return null;\n let last = li;\n for (let k = li + 1; k < this.lineCount; k++) {\n if (!/^ {0,3}>/.test(this.lineText(k))) break;\n last = k;\n }\n return this.island(\"callout\", p, this.contentEnds[last] as number, true, {\n name: (open[1] as string).toLowerCase(),\n ...(open[2] ? { fold: open[2] === \"-\" ? \"closed\" : \"open\" } : {}),\n });\n }\n\n /** `[^id]: text` plus its continuation lines (indented, or lazy text before a blank line). */\n private footnoteDefinition(p: number, li: number, t: string): RawIsland | null {\n const open = FOOTNOTE_DEF.exec(t);\n if (!open) return null;\n let last = li;\n for (let k = li + 1; k < this.lineCount; k++) {\n const line = this.lineText(k);\n if (!NOT_WHITESPACE.test(line)) {\n // A blank line continues the note only when an indented line follows.\n let j = k + 1;\n while (j < this.lineCount && !NOT_WHITESPACE.test(this.lineText(j))) j++;\n if (j < this.lineCount && /^(?: {4}|\\t)/.test(this.lineText(j))) {\n k = j - 1;\n continue;\n }\n break;\n }\n if (/^(?: {4}|\\t)/.test(line)) {\n last = k;\n continue;\n }\n // Streaming: an unterminated last line may still become `[^m]: …` (a new\n // note), a block, or this note's lazy continuation — undecided (G5, H1).\n // Checked BEFORE block detection: what that line is, is not known yet.\n if (this.isOpenTail(k)) return this.heldFootnote(p, open[1] as string);\n if (FOOTNOTE_DEF.test(line.trimStart()) || this.detectBlock(this.lineStarts[k] as number, k, false)) break;\n last = k;\n }\n const end = this.contentEnds[last] as number;\n // Streaming: a note that ends the text (at most one line terminator after\n // it) may still gain a lazy continuation line — held open, never settled,\n // until that is decided (verify-RC-B3 H1).\n if (this.paragraphMayGrow(end)) return this.heldFootnote(p, open[1] as string);\n return this.island(\"footnote_def\", p, end, true, { id: open[1] as string });\n }\n\n /** A footnote whose continuation is still arriving: open to the end of the text. */\n private heldFootnote(p: number, id: string): RawIsland {\n return this.island(\"footnote_def\", p, this.n, false, { id });\n }\n\n /** The text's lines as the one fence closer reads them (streaming: the open tail closes nothing). */\n private get fenceLines(): FenceLines {\n return {\n count: this.lineCount,\n line: (k) => this.lineText(k),\n openTail: (k) => this.isOpenTail(k),\n };\n }\n\n /**\n * Backtick fence — THE one closer (`closeFence`, source/code-ranges.ts): the\n * nested-fence rule for markdown fences with the strict-CommonMark retry, the\n * renderer's line-end closer, JSON-string awareness for ```json.\n */\n private backtickFence(p: number, li: number, opener: FenceOpener): RawIsland {\n const lang = opener.lang;\n const isJson = lang === \"json\";\n const normalized = normalizeFenceLanguage(lang);\n const meta: Record<string, string | number | boolean> = { fence: \"`\", ticks: opener.ticks, lang };\n if (normalized && SPECIAL_CODE_LANGUAGES.has(normalized)) meta.special = normalized;\n const end = closeFence(this.fenceLines, li, opener);\n if (end.closed) {\n return this.fenceIsland(p, this.contentEnds[end.line] as number, true, meta, li, end.line, isJson);\n }\n return this.fenceIsland(p, this.n, false, meta, li, this.lineCount, isJson);\n }\n\n private fenceIsland(\n p: number,\n end: number,\n complete: boolean,\n meta: Record<string, string | number | boolean>,\n openLine: number,\n closeLine: number,\n isJson: boolean,\n ): RawIsland {\n if (isJson && openLine + 1 < this.lineCount) {\n const bodyEnd =\n closeLine < this.lineCount ? (this.lineStarts[closeLine] as number) : this.n;\n const body = this.text.slice(this.lineStarts[openLine + 1] as number, Math.max(bodyEnd, this.lineStarts[openLine + 1] as number));\n if (body.trimStart().startsWith(\"{\")) Object.assign(meta, jsonMeta(body));\n }\n return this.island(\"fence\", p, end, complete, meta);\n }\n\n private tildeFence(p: number, li: number, opener: FenceOpener): RawIsland {\n const lang = opener.lang;\n const meta: Record<string, string | number | boolean> = { fence: \"~\", ticks: opener.ticks, lang };\n const normalized = normalizeFenceLanguage(lang);\n if (normalized && SPECIAL_CODE_LANGUAGES.has(normalized)) meta.special = normalized;\n const close = closeFence(this.fenceLines, li, opener);\n if (close.closed) {\n const tildeEnd = this.contentEnds[close.line] as number;\n const end = this.rendererOverflow(li + 1, close.line, tildeEnd);\n return this.island(\"fence\", p, end, end === this.n ? this.overflowComplete : true, meta);\n }\n return this.island(\"fence\", p, this.n, false, meta);\n }\n\n /** Completion of the last `rendererOverflow` that ran to the end of the text. */\n private overflowComplete = true;\n\n /**\n * The renderer's splitter does not know ~~~ fences: it reads the lines inside\n * one as ordinary lines, so a ```` ``` ```` fence (or an XML section, a JSON\n * block…) that STARTS inside the tilde fence can run past its closer. The\n * editor must lock at least what the renderer draws (verify-RC-B3 residual\n * R5), so a tilde island extends over every block the renderer would detect\n * starting inside it. Returns the island's end.\n */\n private rendererOverflow(firstLine: number, closeLine: number, tildeEnd: number): number {\n let end = tildeEnd;\n this.overflowComplete = true;\n for (let j = firstLine; j <= closeLine && j < this.lineCount; j++) {\n const start = this.lineStarts[j] as number;\n if (this.lineIsBlank(j)) continue;\n // The renderer sees no tildes: a ~~~ line (the closer included) opens\n // nothing, and skipping it BEFORE detection keeps this scan from ever\n // re-entering tildeFence (no recursion, however many ~~~ lines follow).\n if (fenceOpenerOf(this.lineText(j))?.char === \"~\") continue;\n const inner = this.detectBlockUncached(start, j, false);\n if (!inner) continue;\n if (inner.end > end) {\n end = inner.end;\n this.overflowComplete = inner.complete;\n }\n const lastLine = this.lineOf(Math.max(start, inner.end - 1));\n if (lastLine > j) j = lastLine;\n }\n return end;\n }\n\n /**\n * A line-leading `$$` that OPENS a math pair (source/math-pairs.ts — the\n * core's rule). A closer, an unpaired `$$`, or a prose pair is never a block:\n * a lone `$$` renders as literal text and locks nothing.\n */\n private mathBlock(p: number, tp: number): RawIsland | null {\n const close = this.mathPairs.get(tp);\n if (close === undefined) return null;\n const end = close + 2;\n const li = this.lineOf(tp);\n const ce = this.contentEnds[li] as number;\n // `$$x$$` followed by prose on its line is inline math inside a paragraph.\n if (end <= ce && !this.isBlank(end, ce)) return null;\n const endLine = this.lineOf(close);\n const endCe = this.contentEnds[endLine] as number;\n // A multi-line pair whose closer is followed by prose stays in its paragraph.\n if (endLine !== li && !this.isBlank(end, endCe)) return null;\n // Streaming: a closer on the still-open last line may yet be followed by\n // prose on that line (which makes it inline math in a paragraph), so the\n // block is not settled until the line ends (verify-RC-B3 residual R2′).\n // (An unsettled island runs to the end of the text, like every open island.)\n if (this.isOpenTail(endLine)) return this.island(\"math_block\", p, this.n, false, { delimiter: \"$$\" });\n return this.island(\"math_block\", p, end, true, { delimiter: \"$$\" });\n }\n\n /** `<artifact …>`, `<decision …>`, … at the start of a line. */\n private attributeXml(p: number, tp: number, t: string): RawIsland | null {\n for (const name of ATTRIBUTE_XML_NAMES) {\n const prefix = `<${name}`;\n if (!t.startsWith(prefix)) continue;\n const next = t[prefix.length];\n if (next !== \" \" && next !== \">\" && next !== \"/\" && next !== \"\\t\") continue;\n return this.attributeElement(name, p, tp, \"xml_attr\");\n }\n return null;\n }\n\n /** Opening tag at `tp` through its `</name>` (or to EOF when still streaming). */\n private attributeElement(\n name: string,\n p: number,\n tp: number,\n type: IslandType,\n ): RawIsland | null {\n const li = this.lineOf(tp);\n const ce = this.contentEnds[li] as number;\n const tag = readXmlTag(this.text, tp, this.finder);\n this.tick(tag ? tag.raw.length : 1);\n let openEnd: number;\n if (tag && !tag.isClosing) {\n if (tag.isSelfClosing) {\n return this.island(type, p, tp + tag.raw.length, true, { tag: name, selfClosing: true });\n }\n openEnd = tp + tag.raw.length;\n } else {\n const gt = this.next(\">\", tp);\n if (gt === -1) return this.island(type, p, this.n, false, { tag: name });\n if (gt >= ce) return null;\n openEnd = gt + 1;\n }\n const closer = `</${name}>`;\n const close = this.next(closer, openEnd);\n if (close === -1) return this.island(type, p, this.n, false, { tag: name });\n return this.island(type, p, close + closer.length, true, { tag: name });\n }\n\n /** `<thinking>`, `<flashcards>`, … — exact attribute-less openers. */\n private xmlRegion(p: number, tp: number, t: string): RawIsland | null {\n for (const name of XML_TAG_BLOCK_NAMES) {\n const opener = `<${name}>`;\n if (!t.startsWith(opener)) continue;\n const closer = `</${name}>`;\n const close = this.next(closer, tp + opener.length);\n if (close === -1) return this.island(\"xml_region\", p, this.n, false, { tag: name });\n return this.island(\"xml_region\", p, close + closer.length, true, { tag: name });\n }\n return null;\n }\n\n /** Line-leading unknown XML element — balanced by the renderer's own tracker. */\n private genericXml(p: number, li: number, seg: string, indent: number): RawIsland | null {\n const first = seg.slice(indent);\n const opening = readXmlTag(first, 0);\n if (opening && !opening.isClosing) {\n const root = opening.tagName;\n if (KNOWN_XML_TAG_NAMES.has(root) || ALLOWED_RAW_HTML_TAGS.has(root.toLowerCase())) {\n return null;\n }\n const tracker = new XmlContainerTracker(root);\n const firstEnd = tracker.consumeLine(seg, indent);\n if (firstEnd !== null) {\n return this.island(\"xml_container\", p, p + firstEnd, true, { tag: root });\n }\n for (let k = li + 1; k < this.lineCount; k++) {\n const end = tracker.consumeLine(this.lineText(k));\n if (end !== null) {\n return this.island(\"xml_container\", p, (this.lineStarts[k] as number) + end, true, {\n tag: root,\n });\n }\n }\n return this.island(\"xml_container\", p, this.n, false, { tag: root });\n }\n if (isUnclosedGenericXmlOpening(seg)) {\n return this.island(\"xml_container\", p, this.n, false, {});\n }\n return null;\n }\n\n private blockComment(p: number, tp: number, li: number): RawIsland | null {\n const close = this.next(\"-->\", tp + 4);\n if (close === -1) return this.island(\"html_comment\", p, this.n, false);\n const end = close + 3;\n const raw = this.text.slice(tp, end);\n const anchor = PINNED_ANCHOR_RE.exec(raw);\n const ce = this.contentEnds[li] as number;\n if (anchor) {\n // A pinned anchor followed by prose on its line is an inline marker.\n if (end <= ce && !this.isBlank(end, ce)) return null;\n return this.island(\"anchor\", p, end, true, { id: anchor[1] as string });\n }\n return this.island(\"html_comment\", p, end, true);\n }\n\n private htmlBlock(\n p: number,\n li: number,\n t: string,\n tp: number,\n atParaStart: boolean,\n ): RawIsland | null {\n const tag = readXmlTag(t, 0);\n if (!tag) return null;\n const name = tag.tagName.toLowerCase();\n if (!ALLOWED_RAW_HTML_TAGS.has(name)) return null;\n if (name === \"pre\" && !tag.isClosing) {\n const closer = /<\\/pre\\s*>/gi;\n closer.lastIndex = tp;\n const close = closer.exec(this.text);\n if (!close) return this.island(\"html_block\", p, this.n, false, { tag: name });\n return this.island(\"html_block\", p, close.index + close[0].length, true, { tag: name });\n }\n const typeSix = HTML_BLOCK_LEVEL_TAGS.has(name);\n // A line that is only one tag opens a block; while that line is still\n // arriving, more bytes can make it prose, so it decides nothing (G5).\n const loneTag = atParaStart && t.trimEnd() === tag.raw;\n if (loneTag && this.isOpenTail(li)) {\n // Undecided: this becomes a block when the line ends here, or prose if\n // more arrives. Hold it (and the rest) provisional (G5).\n this.provisionalFrom = Math.min(this.provisionalFrom, p);\n return null;\n }\n const typeSeven = loneTag;\n if (!typeSix && !typeSeven) return null;\n let end = this.contentEnds[li] as number;\n for (let k = li + 1; k < this.lineCount && !this.lineIsBlank(k); k++) {\n end = this.contentEnds[k] as number;\n }\n return this.island(\"html_block\", p, end, true, { tag: name });\n }\n\n private buildBraceTables(): void {\n const count = this.lineCount;\n // prefix[i] = net braces over lines [0, i)\n const prefix = new Int32Array(count + 1);\n for (let i = 0; i < count; i++) {\n const { opens, closes } = countStructuralBraces(this.lineText(i));\n prefix[i + 1] = (prefix[i] as number) + opens - closes;\n }\n // stop[i] = smallest j >= i with prefix[j + 1] <= prefix[i], or -1.\n const stop = new Int32Array(count).fill(-1);\n const stack: number[] = [];\n // Next index m > i (over prefix positions) with prefix[m] <= prefix[i].\n for (let m = 0; m <= count; m++) {\n const value = prefix[m] as number;\n while (stack.length && (prefix[stack[stack.length - 1] as number] as number) >= value) {\n const i = stack.pop() as number;\n if (i < count) stop[i] = m - 1;\n }\n stack.push(m);\n }\n this.braceNet = prefix;\n this.braceStop = stop;\n }\n\n /** A line-leading bare JSON object — the splitter's structural brace walk. */\n private bareJson(p: number, li: number, tp: number): RawIsland | null {\n let lastLine: number | null = null;\n let net = 0;\n if (p === (this.lineStarts[li] as number)) {\n if (!this.braceStop || !this.braceNet) this.buildBraceTables();\n const stop = (this.braceStop as Int32Array)[li] as number;\n if (stop !== -1) {\n lastLine = stop;\n net =\n ((this.braceNet as Int32Array)[stop + 1] as number) -\n ((this.braceNet as Int32Array)[li] as number);\n }\n } else {\n let running = 0;\n for (let k = li; k < this.lineCount; k++) {\n const line = k === li ? this.text.slice(tp, this.contentEnds[li] as number) : this.lineText(k);\n const { opens, closes } = countStructuralBraces(line);\n running += opens - closes;\n if (running <= 0) {\n lastLine = k;\n net = running;\n break;\n }\n }\n }\n if (lastLine === null) {\n // Only the head decides; the whole tail is read once, when it is ours.\n if (isRecognizedJsonHead(this.text.slice(tp, tp + 512))) {\n return this.island(\"json\", p, this.n, false, jsonMeta(this.text.slice(tp)));\n }\n return null;\n }\n if (net !== 0) return null;\n const end = this.contentEnds[lastLine] as number;\n const content = this.text.slice(tp, end).trim();\n try {\n const parsed: unknown = JSON.parse(content);\n if (parsed === null || typeof parsed !== \"object\") return null;\n } catch {\n return null;\n }\n return this.island(\"json\", p, end, true, jsonMeta(content));\n }\n\n private tree(p: number, li: number): RawIsland | null {\n let treeLines = 0;\n let lastTree = li;\n let k = li;\n while (k < this.lineCount) {\n if (this.lineIsBlank(k)) {\n k++;\n continue;\n }\n if (!TREE_GLYPHS.test(this.lineText(k))) break;\n treeLines++;\n lastTree = k;\n k++;\n }\n if (treeLines < 3) return null;\n return this.island(\"tree\", p, this.contentEnds[lastTree] as number, true);\n }\n\n // ── prose ──────────────────────────────────────────────────────────────\n\n private paragraph(pos: number, li: number): number {\n let end = this.contentEnds[li] as number;\n let breakLine = -1;\n for (let k = li + 1; k < this.lineCount; k++) {\n if (this.lineIsBlank(k)) break;\n if (this.detectBlock(this.lineStarts[k] as number, k, false)) {\n breakLine = k;\n break;\n }\n end = this.contentEnds[k] as number;\n }\n\n // A tree's root label (the non-blank, glyph-free, non-heading lines\n // directly above its first connector) belongs to the tree — the renderer\n // splitter's findTreeBlockStart.\n if (breakLine !== -1) {\n const breakIsland = this.detectBlock(this.lineStarts[breakLine] as number, breakLine, false);\n if (breakIsland?.type === \"tree\") {\n let root = breakLine;\n for (let j = breakLine - 1; j >= li; j--) {\n const trimmed = this.lineText(j).trim();\n if (!trimmed || isSplitterTreeLine(trimmed) || /^#{1,6}\\s/.test(trimmed)) break;\n root = j;\n }\n if (root < breakLine) {\n const treeStart = root === li ? pos : (this.lineStarts[root] as number);\n const tree = { ...breakIsland, start: treeStart };\n if (treeStart > pos) {\n const proseEnd = this.contentEnds[root - 1] as number;\n const scan = this.scanInline(pos, proseEnd);\n if (!scan.breakIsland) {\n this.push({ kind: \"prose\", start: pos, end: proseEnd, island: null, inlines: scan.inlines });\n this.push({ kind: \"gap\", start: proseEnd, end: treeStart, island: null, inlines: [] });\n this.push({ kind: \"island\", start: treeStart, end: tree.end, island: tree, inlines: [] });\n return tree.end;\n }\n } else {\n this.push({ kind: \"island\", start: treeStart, end: tree.end, island: tree, inlines: [] });\n return tree.end;\n }\n }\n }\n }\n\n const scan = this.scanInline(pos, end);\n if (!scan.breakIsland) {\n this.push({ kind: \"prose\", start: pos, end, island: null, inlines: scan.inlines });\n return end;\n }\n const br = scan.breakIsland;\n if (scan.orphan) {\n // The continuation half of a thinking region split across persisted\n // parts: everything since the last island is region body (splitter 3d).\n let start = pos;\n while (this.blocks.length) {\n const last = this.blocks[this.blocks.length - 1] as RawBlock;\n if (last.kind === \"island\") break;\n this.blocks.pop();\n start = last.start;\n }\n const island = { ...br, start };\n this.push({ kind: \"island\", start, end: island.end, island, inlines: [] });\n return island.end;\n }\n this.push({\n kind: \"prose\",\n start: pos,\n end: br.start,\n island: null,\n inlines: scan.inlines.filter((inline) => inline.end <= br.start),\n });\n this.push({ kind: \"island\", start: br.start, end: br.end, island: br, inlines: [] });\n return br.end;\n }\n\n private scanInline(\n ps: number,\n pe: number,\n ): { inlines: RawIsland[]; breakIsland: RawIsland | null; orphan: boolean } {\n const text = this.text;\n const inlines: RawIsland[] = [];\n this.tick(pe - ps); // the scan below visits each position of the paragraph at most once\n const hasKind = text.slice(ps, pe).includes(\"__kind\");\n // Embedded-kind JSON probing is capped per paragraph so a paragraph full\n // of unclosed `{\"…` stays linear; a candidate longer than the cap stays prose.\n let kindBudget = 4 * (pe - ps) + 65536;\n const stop = (island: RawIsland, orphan = false) => ({ inlines, breakIsland: island, orphan });\n const within = (needle: string, from: number): number => {\n const at = this.next(needle, from);\n return at !== -1 && at + needle.length <= pe ? at : -1;\n };\n let runs: BacktickRuns | null = null;\n /** First maximal backtick run of exactly `n` starting at or after `from`, within the paragraph (THE pairing table). */\n const codeSpanClose = (n: number, from: number): number => {\n if (!runs) {\n this.tick(pe - ps); // one pass builds the backtick-run table\n runs = new BacktickRuns(text, ps, pe);\n }\n const at = runs.next(n, from);\n return at !== -1 && at + n <= pe ? at : -1;\n };\n\n let i = ps;\n // The paragraph's END is computed exactly as one-shot computes it (so its\n // islands are read the same way); only what is REPORTED stops at the\n // provisional point.\n const scanEnd = Math.min(pe, this.provisionalFrom);\n while (i < scanEnd) {\n const ch = text[i];\n if (ch === \"\\\\\") {\n const nextCh = text[i + 1];\n if (nextCh === \"(\" || nextCh === \"[\") {\n const close = within(nextCh === \"(\" ? \"\\\\)\" : \"\\\\]\", i + 2);\n // `\\[ … \\]` is math only when it holds TeX; otherwise it is two\n // escaped brackets — literal text (isEscapedBracketMath).\n const isMath =\n close !== -1 &&\n (nextCh === \"(\" || isEscapedBracketMath(text.slice(i + 2, close), i > 0 ? text[i - 1] : undefined));\n if (close !== -1 && isMath) {\n inlines.push(this.island(\"math_inline\", i, close + 2, true, { delimiter: nextCh === \"(\" ? \"\\\\(\" : \"\\\\[\" }));\n i = close + 2;\n continue;\n }\n }\n i += 2;\n continue;\n }\n if (ch === \"`\") {\n const n = backtickRunLength(text, i);\n const close = codeSpanClose(n, i + n);\n // Streaming: while the paragraph can still grow — nothing follows it\n // but at most one line terminator, so the next line may join it — an\n // unclosed backtick run may yet be closed and turn everything after it\n // into code. Nothing after it is an island until then (G5 / flicker).\n if (close === -1 && this.streaming && this.paragraphMayGrow(pe)) {\n return { inlines, breakIsland: null, orphan: false };\n }\n i = close === -1 ? i + n : close + n;\n continue;\n }\n if (ch === \"$\") {\n if (text[i + 1] === \"$\") {\n const close = this.mathPairs.get(i);\n if (close === undefined) {\n i += 2;\n continue;\n }\n if (close + 2 > pe) return stop(this.island(\"math_block\", i, close + 2, true, { delimiter: \"$$\" }));\n inlines.push(this.island(\"math_inline\", i, close + 2, true, { delimiter: \"$$\" }));\n i = close + 2;\n continue;\n }\n const end = singleDollarMathEnd(text, i, pe);\n this.tick(end > 0 ? end - i : Math.min(403, pe - i));\n // Streaming: a closing `$` that is the last byte so far is undecided —\n // the next byte (a digit) can turn it back into currency, and anything\n // else makes the whole span math. Either way nothing from its opener\n // on is settled yet (G4, G5).\n if (end > 0 && this.streaming && end === this.n) {\n this.provisionalFrom = Math.min(this.provisionalFrom, i);\n return { inlines, breakIsland: null, orphan: false };\n }\n if (end > 0) {\n inlines.push(this.island(\"math_inline\", i, end, true, { delimiter: \"$\" }));\n i = end;\n continue;\n }\n i++;\n continue;\n }\n if (ch === \"{\") {\n if (text[i + 1] === \"{\") {\n const close = this.next(\"}}\", i + 2);\n if (\n close !== -1 &&\n close + 2 <= pe &&\n close - i <= 200 &&\n !text.slice(i, close).includes(\"\\n\")\n ) {\n const raw = text.slice(i, close + 2);\n const strict = STRICT_VARIABLE_RE.exec(raw);\n inlines.push(\n this.island(\"variable\", i, close + 2, true, strict ? { name: strict[1] as string } : { template: true }),\n );\n i = close + 2;\n continue;\n }\n i += 2;\n continue;\n }\n if (hasKind && kindBudget > 0 && /^\\{\\s*\"/.test(text.slice(i, i + 64))) {\n const limit = Math.min(pe, i + 65536);\n const end = matchingJsonObjectEnd(text, i, limit);\n kindBudget -= (end ?? limit) - i;\n this.tick((end ?? limit) - i);\n if (end !== null) {\n const kind = declaredKind(text.slice(i, end));\n if (kind) {\n inlines.push(this.island(\"kind_json\", i, end, true, jsonMeta(text.slice(i, end))));\n i = end;\n continue;\n }\n }\n }\n i++;\n continue;\n }\n if ((ch === \"[\" && text[i + 1] === \"[\") || (ch === \"!\" && text[i + 1] === \"[\" && text[i + 2] === \"[\")) {\n const open = ch === \"!\" ? i + 3 : i + 2;\n const close = within(\"]]\", open);\n const newline = this.next(\"\\n\", open);\n const inner = close === -1 ? \"\" : text.slice(open, close);\n if (close !== -1 && (newline === -1 || newline > close) && inner.trim() && !/[[\\]]/.test(inner)) {\n const cut = inner.search(/\\\\?\\|/);\n const target = (cut < 0 ? inner : inner.slice(0, cut)).trim();\n inlines.push(\n this.island(\"wikilink\", i, close + 2, true, ch === \"!\" ? { target, embed: true } : { target }),\n );\n i = close + 2;\n continue;\n }\n }\n if (ch === \"[\") {\n const media = MEDIA_REF_PREFIXES.find((prefix) => text.startsWith(prefix, i));\n if (media) {\n const close = within(\"]\", i + media.length);\n const newline = this.next(\"\\n\", i);\n if (close !== -1 && (newline === -1 || newline > close)) {\n inlines.push(this.island(\"media_ref\", i, close + 1, true, { media: media.slice(1, 6).toLowerCase() }));\n i = close + 1;\n continue;\n }\n }\n i++;\n continue;\n }\n if (ch === \"<\") {\n if (text.startsWith(\"<!--\", i)) {\n const close = this.next(\"-->\", i + 4);\n if (close === -1) return stop(this.island(\"html_comment\", i, this.n, false));\n const end = close + 3;\n const anchor = end - i <= 64 ? PINNED_ANCHOR_RE.exec(text.slice(i, end)) : null;\n const type: IslandType = anchor ? \"anchor\" : \"html_comment\";\n const meta = anchor ? { id: anchor[1] as string } : {};\n if (end > pe) return stop(this.island(type, i, end, true, meta));\n inlines.push(this.island(type, i, end, true, meta));\n i = end;\n continue;\n }\n const cite = CITE_RE.exec(text.slice(i, i + 64));\n if (cite) {\n inlines.push(this.island(\"cite\", i, i + cite[0].length, true, { n: Number(cite[1]) }));\n i += cite[0].length;\n continue;\n }\n const tag = readXmlTag(text, i, this.finder);\n this.tick(tag ? tag.raw.length : 1);\n if (tag && i + tag.raw.length <= pe) {\n const name = tag.tagName;\n const tagEnd = i + tag.raw.length;\n const isAttr = ATTRIBUTE_XML_NAMES.includes(name);\n const isThinking = THINKING_FAMILY.includes(name) && tag.raw === `<${name}>`;\n if (!tag.isClosing && (isAttr || isThinking)) {\n if (tag.isSelfClosing) {\n inlines.push(this.island(\"xml_inline\", i, tagEnd, true, { tag: name, selfClosing: true }));\n i = tagEnd;\n continue;\n }\n const closer = `</${name}>`;\n const close = this.next(closer, tagEnd);\n const blockType: IslandType = isAttr ? \"xml_attr\" : \"xml_region\";\n if (close === -1) return stop(this.island(blockType, i, this.n, false, { tag: name }));\n const end = close + closer.length;\n if (end > pe) return stop(this.island(blockType, i, end, true, { tag: name }));\n inlines.push(this.island(\"xml_inline\", i, end, true, { tag: name }));\n i = end;\n continue;\n }\n if (tag.isClosing && THINKING_FAMILY.includes(name)) {\n return stop(this.island(\"xml_region\", i, tagEnd, true, { tag: name, continuation: true }), true);\n }\n const lower = name.toLowerCase();\n inlines.push(\n this.island(ALLOWED_RAW_HTML_TAGS.has(lower) ? \"html_tag\" : \"xml_tag\", i, tagEnd, true, {\n tag: name,\n }),\n );\n i = tagEnd;\n continue;\n }\n // An attribute-bearing opener still arriving (no `>` anywhere yet).\n const pending = ATTRIBUTE_XML_NAMES.find(\n (name) => text.startsWith(`<${name}`, i) && /\\s/.test(text[i + name.length + 1] ?? \"\"),\n );\n if (pending && this.next(\">\", i) === -1) {\n return stop(this.island(\"xml_attr\", i, this.n, false, { tag: pending }));\n }\n i++;\n continue;\n }\n i++;\n }\n return { inlines, breakIsland: null, orphan: false };\n }\n}\n\n/**\n * Cut `text` into blocks whose raw concatenation is exactly `text`.\n * Never throws; unclosed constructs are islands with `complete: false`.\n */\nexport interface TokenizeOptions {\n /**\n * The text is a prefix of a message still arriving. The final line (no\n * terminator yet) can still grow — a bare ``` there may become ```bash — so\n * it closes no fence until its newline arrives (verify-RC-B3 residual R2).\n * Omit for stored text: a complete document's last line is final.\n */\n readonly streaming?: boolean;\n /**\n * DIAGNOSTIC — complexity tests only. When given, every loop that walks the\n * text itself adds the characters it visits to `meter.work`, so a test can\n * assert the tokenizer's work grows linearly with its input (deterministic,\n * unlike wall-clock timing). Loops over a slice are not charged here: the\n * slice's own cost covers them. Omit in production.\n */\n readonly meter?: { work: number };\n}\n\nexport function tokenizeSource(text: string, options: TokenizeOptions = {}): SourceBlock[] {\n const raw = new Tokenizer(text, options.streaming ?? false, options.meter).run();\n const cp = buildCodePointIndex(text);\n const inline = (island: RawIsland): SourceIsland => ({\n islandType: island.type,\n inline: true,\n complete: island.complete,\n meta: island.meta,\n start: island.start,\n end: island.end,\n startCp: cp.toCodePoint(island.start),\n endCp: cp.toCodePoint(island.end),\n raw: text.slice(island.start, island.end),\n });\n return raw.map(\n (block): SourceBlock => ({\n kind: block.kind,\n islandType: (block.island?.type as BlockIslandType | undefined) ?? null,\n complete: block.island ? block.island.complete : true,\n meta: block.island?.meta ?? {},\n inlines: block.inlines.map(inline),\n start: block.start,\n end: block.end,\n startCp: cp.toCodePoint(block.start),\n endCp: cp.toCodePoint(block.end),\n raw: text.slice(block.start, block.end),\n }),\n );\n}\n\n/** The exact source the blocks were cut from. */\nexport function joinSource(blocks: readonly SourceBlock[]): string {\n let out = \"\";\n for (const block of blocks) out += block.raw;\n return out;\n}\n\n/** Every island — block-level and inline — in document order. */\nexport function listIslands(blocks: readonly SourceBlock[]): SourceIsland[] {\n const out: SourceIsland[] = [];\n for (const block of blocks) {\n if (block.kind === \"island\" && block.islandType) {\n out.push({\n islandType: block.islandType,\n inline: false,\n complete: block.complete,\n meta: block.meta,\n start: block.start,\n end: block.end,\n startCp: block.startCp,\n endCp: block.endCp,\n raw: block.raw,\n });\n } else {\n // A loop, never a spread: a block can hold 100k+ inline islands and a\n // spread passes each as a call argument (RangeError, residual R3).\n for (const inline of block.inlines) out.push(inline);\n }\n }\n return out;\n}\n\n/** The block containing UTF-16 offset `offset` (the later block at a boundary). */\nexport function blockAt(blocks: readonly SourceBlock[], offset: number): SourceBlock | null {\n let lo = 0;\n let hi = blocks.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const block = blocks[mid] as SourceBlock;\n if (offset < block.start) hi = mid - 1;\n else if (offset >= block.end) lo = mid + 1;\n else return block;\n }\n return null;\n}\n","/**\n * SAVE = SPLICE (rich-content PLAN decision 6).\n *\n * An editor never hands back a whole re-serialized document. It hands back\n * per-block replacements for exactly the blocks the person changed; every\n * other byte of the stored text is written back as it was. This module\n * applies those replacements and returns:\n *\n * - the new text,\n * - a change set (old range → new range, in UTF-16 AND code points,\n * narrowed to the bytes that actually differ) that the annotation layer\n * uses to carry every live anchor through the save\n * (STORE-DESIGN §3.19 — the ProseMirror / Google Docs position-mapping\n * model), and\n * - an integrity guarantee: every island not explicitly replaced must still\n * be the same island, at its mapped position, in the new text. An edit\n * that opens an unclosed fence and swallows a kind below it is REFUSED.\n *\n * ISLANDS CHANGE ONLY THROUGH `islandEdit`. A prose/range edit must hand back\n * every island inside its range byte-identical and in order (a visual editor\n * holds them as atoms); if one is altered or dropped the save throws\n * `SourceSpliceError(\"island_edit\")` naming the island. A kind editor or code\n * view changes an island with `islandEdit(island, newRaw)`.\n *\n * A no-edit save (or edits whose text equals the original block) returns the\n * original string itself — byte-identical, zero changes.\n */\n\nimport { buildCodePointIndex, splitsSurrogatePair } from \"./offsets\";\nimport {\n joinSource,\n listIslands,\n tokenizeSource,\n type IslandType,\n type SourceBlock,\n type SourceIsland,\n} from \"./tokenize\";\n\n/**\n * Replace `[start, end)` (UTF-16) of the original with `text`. A plain edit\n * starts and ends on block boundaries; an island edit (`island: true`, made by\n * `islandEdit`) names exactly one island's span.\n */\nexport interface SourceEdit {\n readonly start: number;\n readonly end: number;\n readonly text: string;\n readonly island?: boolean;\n}\n\nexport interface SourceChange {\n /** The block-aligned range the edit named, in the ORIGINAL text. */\n readonly blockStart: number;\n readonly blockEnd: number;\n /** The narrowed range that actually differs: old text … */\n readonly oldStart: number;\n readonly oldEnd: number;\n /** … and where its replacement sits in the NEW text. */\n readonly newStart: number;\n readonly newEnd: number;\n readonly oldStartCp: number;\n readonly oldEndCp: number;\n readonly newStartCp: number;\n readonly newEndCp: number;\n}\n\nexport interface DisturbedIsland {\n readonly islandType: IslandType;\n readonly inline: boolean;\n /** Where the island was in the original (UTF-16). */\n readonly start: number;\n readonly end: number;\n /** Where it should have been in the new text. */\n readonly mappedStart: number;\n}\n\nexport interface SpliceIntegrity {\n /** True when every untouched island survived intact and outside bytes are identical. */\n readonly ok: boolean;\n /** Always true by construction; checked anyway because it is THE guarantee. */\n readonly bytesOutsideEditsIdentical: boolean;\n readonly disturbed: readonly DisturbedIsland[];\n}\n\nexport interface SpliceResult {\n readonly text: string;\n readonly changed: boolean;\n readonly changes: readonly SourceChange[];\n readonly integrity: SpliceIntegrity;\n /** Tokenization of the new text. */\n readonly blocks: readonly SourceBlock[];\n}\n\nexport type SourceSpliceErrorCode =\n | \"out_of_range\"\n | \"misaligned\"\n | \"overlap\"\n | \"stale_blocks\"\n | \"island_edit\"\n | \"integrity\";\n\nexport class SourceSpliceError extends Error {\n constructor(\n readonly code: SourceSpliceErrorCode,\n message: string,\n ) {\n super(message);\n this.name = \"SourceSpliceError\";\n }\n}\n\nexport interface SpliceOptions {\n /** The tokenization of `original`, when the caller already holds it. */\n readonly blocks?: readonly SourceBlock[];\n /**\n * Default `true`: a save that disturbs any island it did not explicitly\n * replace throws `SourceSpliceError(\"integrity\")`. `false` is for TOOLING\n * ONLY (diagnostic scripts that want the report instead of the refusal) —\n * no editor or persistence path may pass it.\n */\n readonly requireIntegrity?: boolean;\n}\n\n/** An edit that replaces one block's raw text. */\nexport function blockEdit(block: SourceBlock, text: string): SourceEdit {\n return { start: block.start, end: block.end, text };\n}\n\n/** The one door that changes an island: replace exactly its span with `text`. */\nexport function islandEdit(\n island: { readonly start: number; readonly end: number },\n text: string,\n): SourceEdit {\n return { start: island.start, end: island.end, text, island: true };\n}\n\n/** An edit that replaces a contiguous run of blocks `[first, last]`. */\nexport function blockRangeEdit(first: SourceBlock, last: SourceBlock, text: string): SourceEdit {\n return { start: first.start, end: last.end, text };\n}\n\n/**\n * Where an island's raw text sits in a replacement, at or after `from`, or -1\n * when the island is gone. Candidates: the island's own position measured from\n * the previous island and from the end of the edit, plus the nearest\n * occurrences either side. When the island's bytes occur more than once — a\n * copy inside a code span, or an insertion that itself contains a copy\n * (verify-RC-B3 residual R1) — the candidate whose surroundings still match\n * the original text wins, so a coincidental copy at the expected offset never\n * steals the island.\n */\nconst CONTEXT_WINDOW = 64;\n\nfunction locateIsland(\n text: string,\n raw: string,\n from: number,\n expected: number,\n expectedFromEnd: number,\n oldText: string,\n oldStart: number,\n oldEnd: number,\n): number {\n const candidates = new Set<number>();\n if (expected >= from && text.startsWith(raw, expected)) candidates.add(expected);\n if (expectedFromEnd >= from && text.startsWith(raw, expectedFromEnd)) candidates.add(expectedFromEnd);\n const after = text.indexOf(raw, Math.max(from, expected));\n if (after !== -1) candidates.add(after);\n const before = expected > from ? text.lastIndexOf(raw, expected) : -1;\n if (before >= from) candidates.add(before);\n if (candidates.size === 0) return text.indexOf(raw, from);\n if (candidates.size === 1) return candidates.values().next().value as number;\n let best = -1;\n let bestScore = -1;\n for (const at of candidates) {\n let score = 0;\n // Matching bytes just after the island …\n for (let k = 0; k < CONTEXT_WINDOW; k++) {\n const n = text[at + raw.length + k];\n if (n === undefined || n !== oldText[oldEnd + k]) break;\n score++;\n }\n // … and just before it.\n for (let k = 1; k <= CONTEXT_WINDOW; k++) {\n const n = text[at - k];\n if (n === undefined || n !== oldText[oldStart - k]) break;\n score++;\n }\n if (score > bestScore || (score === bestScore && at === expected)) {\n best = at;\n bestScore = score;\n }\n }\n return best;\n}\n\nfunction commonPrefix(a: string, b: string): number {\n const max = Math.min(a.length, b.length);\n let i = 0;\n while (i < max && a.charCodeAt(i) === b.charCodeAt(i)) i++;\n if (i > 0 && (splitsSurrogatePair(a, i) || splitsSurrogatePair(b, i))) i--;\n return i;\n}\n\nfunction commonSuffix(a: string, b: string, prefix: number): number {\n const max = Math.min(a.length, b.length) - prefix;\n let i = 0;\n while (i < max && a.charCodeAt(a.length - 1 - i) === b.charCodeAt(b.length - 1 - i)) i++;\n if (i > 0 && (splitsSurrogatePair(a, a.length - i) || splitsSurrogatePair(b, b.length - i))) i--;\n return i;\n}\n\n/**\n * Apply block-aligned replacements to `original`. Bytes outside the edits are\n * copied, never rebuilt; an edit equal to its block changes nothing.\n */\nexport function spliceSave(\n original: string,\n edits: readonly SourceEdit[],\n options: SpliceOptions = {},\n): SpliceResult {\n const blocks = options.blocks ?? tokenizeSource(original);\n if (options.blocks && joinSource(blocks) !== original) {\n throw new SourceSpliceError(\"stale_blocks\", \"the blocks passed in were not cut from this original text\");\n }\n\n const boundaries = new Set<number>([0, original.length]);\n for (const block of blocks) {\n boundaries.add(block.start);\n boundaries.add(block.end);\n }\n const islands = listIslands(blocks);\n const islandAt = new Map<string, SourceIsland>();\n for (const island of islands) islandAt.set(`${island.start}:${island.end}`, island);\n\n const sorted = [...edits].sort((a, b) => a.start - b.start || a.end - b.end);\n let previousEnd = -1;\n for (const edit of sorted) {\n if (edit.start < 0 || edit.end > original.length || edit.start > edit.end) {\n throw new SourceSpliceError(\"out_of_range\", `edit [${edit.start}, ${edit.end}) is outside the text`);\n }\n if (edit.island) {\n if (!islandAt.has(`${edit.start}:${edit.end}`)) {\n throw new SourceSpliceError(\n \"misaligned\",\n `islandEdit [${edit.start}, ${edit.end}) does not name an island's exact span`,\n );\n }\n } else if (!boundaries.has(edit.start) || !boundaries.has(edit.end)) {\n throw new SourceSpliceError(\n \"misaligned\",\n `edit [${edit.start}, ${edit.end}) does not start and end on block boundaries`,\n );\n }\n if (edit.start < previousEnd) {\n throw new SourceSpliceError(\"overlap\", `edit [${edit.start}, ${edit.end}) overlaps the previous edit`);\n }\n previousEnd = edit.end;\n }\n\n // Split every edit into the byte ranges that actually differ. A plain edit\n // must carry each island inside its range through byte-identical and in\n // order; the text between islands is diffed segment by segment.\n interface Narrowed {\n oldStart: number;\n oldEnd: number;\n replacement: string;\n }\n const effective: Narrowed[] = [];\n const replacedIslands = new Set<string>();\n const pushSegment = (oldStart: number, oldEnd: number, replacement: string) => {\n const old = original.slice(oldStart, oldEnd);\n if (old === replacement) return;\n const prefix = commonPrefix(old, replacement);\n const suffix = commonSuffix(old, replacement, prefix);\n effective.push({\n oldStart: oldStart + prefix,\n oldEnd: oldEnd - suffix,\n replacement: replacement.slice(prefix, replacement.length - suffix),\n });\n };\n for (const edit of sorted) {\n if (edit.island) {\n replacedIslands.add(`${edit.start}:${edit.end}`);\n pushSegment(edit.start, edit.end, edit.text);\n continue;\n }\n if (edit.text === original.slice(edit.start, edit.end)) continue;\n const inside = islands.filter((island) => island.start >= edit.start && island.end <= edit.end);\n let oldCursor = edit.start;\n let newCursor = 0;\n for (const island of inside) {\n // Context is compared against the edit's own old/new text, clipped to the edit.\n const at = locateIsland(\n edit.text,\n island.raw,\n newCursor,\n newCursor + (island.start - oldCursor),\n edit.text.length - (edit.end - island.start),\n original.slice(edit.start, edit.end),\n island.start - edit.start,\n island.end - edit.start,\n );\n if (at === -1) {\n const name = island.meta.tag ?? island.meta.name ?? island.meta.lang ?? \"\";\n throw new SourceSpliceError(\n \"island_edit\",\n `edit [${edit.start}, ${edit.end}) changes or removes the protected ${island.islandType}` +\n `${name ? ` (${String(name)})` : \"\"} island at [${island.start}, ${island.end}); ` +\n \"islands change only through islandEdit()\",\n );\n }\n pushSegment(oldCursor, island.start, edit.text.slice(newCursor, at));\n oldCursor = island.end;\n newCursor = at + island.raw.length;\n }\n pushSegment(oldCursor, edit.end, edit.text.slice(newCursor));\n }\n\n if (effective.length === 0) {\n return {\n text: original,\n changed: false,\n changes: [],\n integrity: { ok: true, bytesOutsideEditsIdentical: true, disturbed: [] },\n blocks,\n };\n }\n\n let text = \"\";\n let cursor = 0;\n let delta = 0;\n const pending: Array<Omit<SourceChange, \"oldStartCp\" | \"oldEndCp\" | \"newStartCp\" | \"newEndCp\">> = [];\n for (const edit of effective) {\n text += original.slice(cursor, edit.oldStart);\n const newStart = edit.oldStart + delta;\n text += edit.replacement;\n const newEnd = newStart + edit.replacement.length;\n const owner = sorted.find((e) => e.start <= edit.oldStart && e.end >= edit.oldEnd);\n pending.push({\n blockStart: owner?.start ?? edit.oldStart,\n blockEnd: owner?.end ?? edit.oldEnd,\n oldStart: edit.oldStart,\n oldEnd: edit.oldEnd,\n newStart,\n newEnd,\n });\n delta += edit.replacement.length - (edit.oldEnd - edit.oldStart);\n cursor = edit.oldEnd;\n }\n text += original.slice(cursor);\n\n const oldCp = buildCodePointIndex(original);\n const newCp = buildCodePointIndex(text);\n const changes: SourceChange[] = pending.map((change) => ({\n ...change,\n oldStartCp: oldCp.toCodePoint(change.oldStart),\n oldEndCp: oldCp.toCodePoint(change.oldEnd),\n newStartCp: newCp.toCodePoint(change.newStart),\n newEndCp: newCp.toCodePoint(change.newEnd),\n }));\n\n // Guard 1: every byte outside the changed ranges is the original byte.\n let bytesOutsideEditsIdentical = true;\n let oldCursor = 0;\n let newCursor = 0;\n for (const change of changes) {\n if (original.slice(oldCursor, change.oldStart) !== text.slice(newCursor, change.newStart)) {\n bytesOutsideEditsIdentical = false;\n }\n oldCursor = change.oldEnd;\n newCursor = change.newEnd;\n }\n if (original.slice(oldCursor) !== text.slice(newCursor)) bytesOutsideEditsIdentical = false;\n\n // Guard 2: every island not explicitly replaced is still that island, at its\n // mapped position, in the re-tokenized new text.\n const newBlocks = tokenizeSource(text);\n const newIslandsByStart = new Map<number, string[]>();\n for (const island of listIslands(newBlocks)) {\n const list = newIslandsByStart.get(island.start);\n if (list) list.push(island.raw);\n else newIslandsByStart.set(island.start, [island.raw]);\n }\n const disturbed: DisturbedIsland[] = [];\n // Islands a plain edit carried through: the edit claims to keep them, so if\n // one did not survive as that island its bytes were matched to a copy that\n // is not an island — the edit changed an island (island_edit, always).\n const carried = (island: SourceIsland) =>\n sorted.some((edit) => !edit.island && island.start >= edit.start && island.end <= edit.end);\n const changedInside: SourceIsland[] = [];\n for (const island of islands) {\n if (replacedIslands.has(`${island.start}:${island.end}`)) continue;\n const mappedStart = mapPosition(changes, island.start, { assoc: 1 }).pos;\n const candidates = newIslandsByStart.get(mappedStart);\n if (!candidates || !candidates.includes(island.raw)) {\n if (carried(island)) {\n changedInside.push(island);\n continue;\n }\n disturbed.push({\n islandType: island.islandType,\n inline: island.inline,\n start: island.start,\n end: island.end,\n mappedStart,\n });\n }\n }\n\n if (changedInside.length > 0) {\n const first = changedInside[0] as SourceIsland;\n const name = first.meta.tag ?? first.meta.name ?? first.meta.lang ?? \"\";\n throw new SourceSpliceError(\n \"island_edit\",\n `the edit changes the protected ${first.islandType}${name ? ` (${String(name)})` : \"\"} island at ` +\n `[${first.start}, ${first.end}) — its bytes survive only as ordinary text` +\n `${changedInside.length > 1 ? ` (and ${changedInside.length - 1} more)` : \"\"}; islands change only through islandEdit()`,\n );\n }\n\n const integrity: SpliceIntegrity = {\n ok: bytesOutsideEditsIdentical && disturbed.length === 0,\n bytesOutsideEditsIdentical,\n disturbed,\n };\n if ((options.requireIntegrity ?? true) && !integrity.ok) {\n const named = disturbed\n .slice(0, 5)\n .map((island) => `${island.islandType}@${island.start}`)\n .join(\", \");\n throw new SourceSpliceError(\n \"integrity\",\n `integrity: the save disturbed ${disturbed.length} protected island(s) it did not replace` +\n `${named ? ` (${named}${disturbed.length > 5 ? \", …\" : \"\"})` : \"\"}` +\n `${bytesOutsideEditsIdentical ? \"\" : \"; bytes outside the edits changed\"}`,\n );\n }\n return { text, changed: true, changes, integrity, blocks: newBlocks };\n}\n\nexport interface MapOptions {\n /** -1 keeps a position at an insertion point before the inserted text; 1 (default) moves it after. */\n readonly assoc?: -1 | 1;\n /** Offset unit of `pos` and of the result. Default `utf16`. */\n readonly unit?: \"utf16\" | \"codepoint\";\n}\n\nexport interface MappedPosition {\n readonly pos: number;\n /** True when the position sat strictly inside replaced text. */\n readonly deleted: boolean;\n}\n\n/**\n * Carry a position in the old text through a change set (ProseMirror StepMap\n * semantics): positions before a change stay, positions after shift by the\n * size difference, a position strictly inside replaced text is `deleted` and\n * lands on the replacement's edge chosen by `assoc`.\n */\nexport function mapPosition(\n changes: readonly SourceChange[],\n pos: number,\n options: MapOptions = {},\n): MappedPosition {\n const assoc = options.assoc ?? 1;\n const cp = options.unit === \"codepoint\";\n let delta = 0;\n for (const change of changes) {\n const oldStart = cp ? change.oldStartCp : change.oldStart;\n const oldEnd = cp ? change.oldEndCp : change.oldEnd;\n const newStart = cp ? change.newStartCp : change.newStart;\n const newEnd = cp ? change.newEndCp : change.newEnd;\n if (pos < oldStart) break;\n if (pos > oldEnd) {\n delta = newEnd - oldEnd;\n continue;\n }\n if (oldStart === oldEnd) {\n // Pure insertion at `pos`.\n return { pos: assoc < 0 ? newStart : newEnd, deleted: false };\n }\n if (pos === oldStart) return { pos: newStart, deleted: false };\n if (pos === oldEnd) return { pos: newEnd, deleted: false };\n return { pos: assoc < 0 ? newStart : newEnd, deleted: true };\n }\n return { pos: pos + delta, deleted: false };\n}\n\nexport interface MappedRange {\n readonly start: number;\n readonly end: number;\n /** True when a change overlapped the range's interior. */\n readonly touched: boolean;\n /** True when the whole range was replaced away. */\n readonly collapsed: boolean;\n}\n\n/** Carry an anchor range through a change set; it stays inside its text when edits happen around it. */\nexport function mapRange(\n changes: readonly SourceChange[],\n start: number,\n end: number,\n unit: \"utf16\" | \"codepoint\" = \"utf16\",\n): MappedRange {\n const cp = unit === \"codepoint\";\n const mappedStart = mapPosition(changes, start, { assoc: 1, unit });\n const mappedEnd = mapPosition(changes, end, { assoc: -1, unit });\n const touched = changes.some((change) => {\n const oldStart = cp ? change.oldStartCp : change.oldStart;\n const oldEnd = cp ? change.oldEndCp : change.oldEnd;\n return oldStart < end && oldEnd > start;\n });\n const newStart = mappedStart.pos;\n const newEnd = Math.max(newStart, mappedEnd.pos);\n return { start: newStart, end: newEnd, touched, collapsed: newEnd === newStart && end > start };\n}\n"]}