@ai-matrx/content-ir 0.11.6 → 0.12.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../source/offsets.ts","../source/constants.ts","../source/math.ts","../source/xml-tag.ts","../source/tokenize.ts","../source/splice.ts"],"names":["at"],"mappings":"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","file":"source.cjs","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 single-dollar math rule — the one predicate that decides whether\n * `$…$` is inline math or currency.\n *\n * Moved here from matrx-frontend `components/markdown-core/math-normalizer.ts`\n * (2026-09-23) so the renderer's normalizer and the source tokenizer can never\n * disagree about which bytes are math: the normalizer imports this function.\n *\n * Pandoc's rule — the opening `$` is not followed by whitespace, the closing\n * `$` is not preceded by whitespace and not followed by a digit — plus a math\n * signal: a TeX command or operator (`\\alpha`, `^`, `_`, `{`, `=`, …), or a\n * lone variable (`$x$`, `$n$`, `$x'$`). Content that opens with a digit needs\n * a real TeX signal, so a price range can never read as math.\n */\n\nconst TEX_SIGNAL = /\\\\[A-Za-z]+|[\\\\^_{}=<>+]/;\nconst LONE_VARIABLE = /^[A-Za-z](?:'|[0-9])?$/;\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 (LONE_VARIABLE.test(content)) return true;\n if (/^[0-9]/.test(content)) return /\\\\[A-Za-z]+|[\\\\^_{}]/.test(content);\n return TEX_SIGNAL.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 let close = -1;\n for (let k = open + 1; k < limit; 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. The renderer copies stay for rendering (PLAN decision 6);\n * a divergence between the two is a defect in whichever changed last.\n */\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\nexport function readXmlTag(content: string, start: number): 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 while (cursor < content.length && content[cursor] !== quote) cursor++;\n if (cursor === content.length) return null;\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 private fenceMarker: { char: \"`\" | \"~\"; ticks: number } | null = null;\n\n constructor(readonly rootTag: string) {}\n\n consumeLine(line: string, startOffset = 0): number | null {\n const fence = /^[ \\t]*(`{3,}|~{3,})(.*)$/.exec(line);\n if (!this.inComment && !this.inCdata && this.inlineTicks === 0 && fence) {\n const marker = fence[1] as string;\n const char = marker[0] as \"`\" | \"~\";\n const suffix = fence[2] as string;\n if (marker.length >= 3) {\n if (!this.fenceMarker) {\n this.fenceMarker = { char, ticks: marker.length };\n return null;\n }\n if (\n char === this.fenceMarker.char &&\n marker.length >= this.fenceMarker.ticks &&\n suffix.trim() === \"\"\n ) {\n this.fenceMarker = null;\n }\n return null;\n }\n }\n if (this.fenceMarker) return null;\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 { singleDollarMathEnd } from \"./math\";\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 front matter at the start of the text. */\n | \"front_matter\"\n /** A box-drawing tree diagram. */\n | \"tree\";\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\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\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/** JSON-string state after scanning `line[0, upTo)` from the given state. */\nfunction 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\nfunction 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\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\n constructor(private readonly text: string) {\n this.n = text.length;\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 this.lineStarts.push(start);\n this.contentEnds.push(text.length);\n this.lineEnds.push(text.length);\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 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 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 if (t.startsWith(\"```\")) return this.backtickFence(p, li, t);\n if (indent <= 3 && t.startsWith(\"~~~\")) {\n const tilde = this.tildeFence(p, li, t);\n if (tilde) return tilde;\n }\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 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 if (this.lineText(li) !== \"---\" || t !== \"---\") return null;\n let sawContent = false;\n for (let k = li + 1; k < this.lineCount; k++) {\n const line = this.lineText(k);\n if (line === \"---\" || line === \"...\") {\n return sawContent ? this.island(\"front_matter\", 0, this.contentEnds[k] as number, true) : null;\n }\n if (!NOT_WHITESPACE.test(line)) continue;\n if (!/^(?:[A-Za-z0-9_\"'-][^:]*:(?:\\s|$)|\\s+\\S|-\\s)/.test(line)) return null;\n sawContent = true;\n }\n return null;\n }\n\n /** Backtick fence — the splitter's close rules, JSON-string aware for ```json. */\n private backtickFence(p: number, li: number, t: string): RawIsland {\n const openTicks = backtickRunLength(t, 0);\n const info = t.slice(openTicks).trim();\n const lang = info.split(/\\s/)[0] ?? \"\";\n const isJson = lang === \"json\";\n const normalized = normalizeFenceLanguage(lang);\n const meta: Record<string, string | number | boolean> = { fence: \"`\", ticks: openTicks, lang };\n if (normalized && SPECIAL_CODE_LANGUAGES.has(normalized)) meta.special = normalized;\n\n let state = { inString: false, escaped: false };\n for (let k = li + 1; k < this.lineCount; k++) {\n const line = this.lineText(k);\n const trimmedLine = line.trim();\n if (trimmedLine.startsWith(\"```\")) {\n const at = line.indexOf(\"```\");\n if (isJson) {\n const probe = jsonStringState(line, 0, at, state);\n if (probe.inString) {\n state = jsonStringState(line, at, line.length, probe);\n continue;\n }\n }\n const closeTicks = backtickRunLength(trimmedLine, 0);\n const isBare = trimmedLine.slice(closeTicks).trim() === \"\";\n if (isBare && closeTicks >= openTicks) {\n return this.fenceIsland(p, this.contentEnds[k] as number, true, meta, li, k, isJson);\n }\n if (isJson) state = jsonStringState(line, 0, line.length, state);\n continue;\n }\n const at = line.indexOf(\"```\");\n if (at !== -1) {\n if (isJson) {\n const probe = jsonStringState(line, 0, at, state);\n if (probe.inString) {\n state = jsonStringState(line, at, line.length, probe);\n continue;\n }\n }\n const closeTicks = backtickRunLength(line, at);\n const after = line.slice(at + closeTicks).trim();\n if (closeTicks >= openTicks && after === \"\") {\n return this.fenceIsland(p, this.contentEnds[k] as number, true, meta, li, k, isJson);\n }\n if (isJson) state = jsonStringState(line, 0, line.length, state);\n continue;\n }\n if (isJson) state = jsonStringState(line, 0, line.length, state);\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, t: string): RawIsland | null {\n const open = /^(~{3,})(.*)$/.exec(t);\n if (!open) return null;\n const ticks = (open[1] as string).length;\n const lang = (open[2] as string).trim().split(/\\s/)[0] ?? \"\";\n const meta: Record<string, string | number | boolean> = { fence: \"~\", ticks, lang };\n const normalized = normalizeFenceLanguage(lang);\n if (normalized && SPECIAL_CODE_LANGUAGES.has(normalized)) meta.special = normalized;\n const close = new RegExp(`^ {0,3}~{${ticks},}[ \\\\t]*$`);\n for (let k = li + 1; k < this.lineCount; k++) {\n if (close.test(this.lineText(k))) {\n return this.island(\"fence\", p, this.contentEnds[k] as number, true, meta);\n }\n }\n return this.island(\"fence\", p, this.n, false, meta);\n }\n\n private mathBlock(p: number, tp: number): RawIsland | null {\n const li = this.lineOf(tp);\n const ce = this.contentEnds[li] as number;\n const sameLine = this.text.indexOf(\"$$\", tp + 2);\n if (sameLine !== -1 && sameLine + 2 <= ce) {\n // `$$x$$` alone on its line is a display block; followed by prose it is inline.\n if (!this.isBlank(sameLine + 2, ce)) return null;\n if (sameLine === tp + 2) return null; // `$$$$` — nothing to protect\n return this.island(\"math_block\", p, sameLine + 2, true, { delimiter: \"$$\" });\n }\n const close = this.text.indexOf(\"$$\", tp + 2);\n if (close === -1) return this.island(\"math_block\", p, this.n, false, { delimiter: \"$$\" });\n return this.island(\"math_block\", p, close + 2, 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);\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.text.indexOf(\">\", 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.text.indexOf(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.text.indexOf(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.text.indexOf(\"-->\", 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 const typeSeven = atParaStart && t.trimEnd() === tag.raw;\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 const partial = this.text.slice(tp);\n if (isRecognizedJsonHead(partial)) {\n return this.island(\"json\", p, this.n, false, jsonMeta(partial));\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 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)) break;\n end = this.contentEnds[k] as number;\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 const hasKind = text.slice(ps, pe).includes(\"__kind\");\n const stop = (island: RawIsland, orphan = false) => ({ inlines, breakIsland: island, orphan });\n let i = ps;\n while (i < pe) {\n const ch = text[i];\n if (ch === \"\\\\\") {\n const next = text[i + 1];\n if (next === \"(\" || next === \"[\") {\n const closer = next === \"(\" ? \"\\\\)\" : \"\\\\]\";\n const close = text.indexOf(closer, i + 2);\n if (close !== -1 && close + 2 <= pe) {\n inlines.push(this.island(\"math_inline\", i, close + 2, true, { delimiter: next === \"(\" ? \"\\\\(\" : \"\\\\[\" }));\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 run = \"`\".repeat(n);\n let k = i + n;\n let close = -1;\n while (k < pe) {\n const idx = text.indexOf(run, k);\n if (idx === -1 || idx >= pe) break;\n if (text[idx + n] === \"`\") {\n let m = idx;\n while (text[m] === \"`\") m++;\n k = m;\n continue;\n }\n close = idx;\n break;\n }\n i = close === -1 ? i + n : close + n;\n continue;\n }\n if (ch === \"$\") {\n if (text[i + 1] === \"$\") {\n const close = text.indexOf(\"$$\", i + 2);\n if (close !== -1 && close + 2 <= pe && close > i + 2) {\n inlines.push(this.island(\"math_inline\", i, close + 2, true, { delimiter: \"$$\" }));\n i = close + 2;\n } else {\n i += 2;\n }\n continue;\n }\n const end = singleDollarMathEnd(text, i, pe);\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 = text.indexOf(\"}}\", i + 2);\n if (close !== -1 && close + 2 <= pe && close - i <= 200 && !text.slice(i, close).includes(\"\\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) {\n const end = matchingJsonObjectEnd(text, i, pe);\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 === \"[\") {\n const media = MEDIA_REF_PREFIXES.find((prefix) => text.startsWith(prefix, i));\n if (media) {\n const close = text.indexOf(\"]\", i + media.length);\n if (close !== -1 && close < pe && !text.slice(i, close).includes(\"\\n\")) {\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 = text.indexOf(\"-->\", i + 4);\n if (close === -1) return stop(this.island(\"html_comment\", i, this.n, false));\n const end = close + 3;\n const anchor = PINNED_ANCHOR_RE.exec(text.slice(i, end));\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);\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 = text.indexOf(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 && text.indexOf(\">\", 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 function tokenizeSource(text: string): SourceBlock[] {\n const raw = new Tokenizer(text).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 out.push(...block.inlines);\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 report: every island outside the edited ranges 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 caught\n * here instead of being saved silently.\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} from \"./tokenize\";\n\n/** Replace `[start, end)` (UTF-16, on block boundaries) of the original with `text`. */\nexport interface SourceEdit {\n readonly start: number;\n readonly end: number;\n readonly text: string;\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 = \"out_of_range\" | \"misaligned\" | \"overlap\" | \"stale_blocks\" | \"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 /** Throw `SourceSpliceError(\"integrity\")` instead of reporting a disturbed island. */\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/** 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\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\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 (!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 // Effective edits: drop no-ops, narrow the rest to the bytes that differ.\n interface Narrowed {\n blockStart: number;\n blockEnd: number;\n oldStart: number;\n oldEnd: number;\n replacement: string;\n }\n const effective: Narrowed[] = [];\n for (const edit of sorted) {\n const old = original.slice(edit.start, edit.end);\n if (old === edit.text) continue;\n const prefix = commonPrefix(old, edit.text);\n const suffix = commonSuffix(old, edit.text, prefix);\n effective.push({\n blockStart: edit.start,\n blockEnd: edit.end,\n oldStart: edit.start + prefix,\n oldEnd: edit.end - suffix,\n replacement: edit.text.slice(prefix, edit.text.length - suffix),\n });\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 pending.push({\n blockStart: edit.blockStart,\n blockEnd: edit.blockEnd,\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 outside the edited blocks is still that island.\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 for (const island of listIslands(blocks)) {\n const touched = effective.some(\n (edit) => island.start < edit.blockEnd && island.end > edit.blockStart,\n );\n if (touched) 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 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 const integrity: SpliceIntegrity = {\n ok: bytesOutsideEditsIdentical && disturbed.length === 0,\n bytesOutsideEditsIdentical,\n disturbed,\n };\n if (options.requireIntegrity && !integrity.ok) {\n throw new SourceSpliceError(\n \"integrity\",\n `the edit disturbed ${disturbed.length} protected island(s) outside the edited blocks`,\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"]}
@@ -0,0 +1,306 @@
1
+ /**
2
+ * THE OFFSET-PRESERVING SOURCE TOKENIZER (rich-content PLAN decision 6).
3
+ *
4
+ * Cuts stored markdown into blocks that cover the text EXACTLY: the
5
+ * concatenation of every block's `raw` is the input, always, byte for byte.
6
+ * Nothing is trimmed, normalized, or re-serialized here — the tokenizer only
7
+ * draws boundaries. Every custom construct the platform stores (kinds and
8
+ * `__kind` JSON, typed JSON blocks, special fences, XML sections including
9
+ * attribute-bearing, mid-line and unknown containers, `{{variables}}`,
10
+ * `<matrxcite/>`, math, raw HTML, code fences, HTML comments and pinned
11
+ * anchors `<!--@a:…-->`) is an ISLAND: an atomic span no editor may parse
12
+ * into its own model. Islands that sit inside running prose (a variable, a
13
+ * citation, inline math) stay inside their paragraph as `inlines`, so a
14
+ * visual editor keeps the paragraph whole and holds the island as an atom.
15
+ *
16
+ * Block kinds:
17
+ * - `prose` — a markdown paragraph run (headings, lists, tables…): the only
18
+ * thing a visual editor may re-serialize, and only when edited.
19
+ * - `island` — a protected construct; `islandType` says which.
20
+ * - `gap` — the line terminator(s) and blank lines between blocks. Never
21
+ * edited; they keep the document's exact spacing.
22
+ *
23
+ * Streaming-tolerant: never throws on partial input. A construct whose
24
+ * closer has not arrived yet becomes an island running to the end of the text
25
+ * with `complete: false` — the same ownership rule the renderer's splitter
26
+ * applies, so a half-streamed fence or XML section is never reflowed.
27
+ *
28
+ * Boundaries follow matrx-frontend's renderer splitter (`content-splitter-v2.ts`)
29
+ * wherever it decides where a construct ends, so the editor and the renderer
30
+ * agree on what is locked. Offsets are UTF-16 (`start`/`end`) and code points
31
+ * (`startCp`/`endCp`).
32
+ */
33
+ type SourceBlockKind = "prose" | "island" | "gap";
34
+ /** Island types that own whole blocks. */
35
+ type BlockIslandType =
36
+ /** ``` / ~~~ fenced code of any language (meta.lang, meta.special). */
37
+ "fence"
38
+ /** A bare JSON object block — typed JSON, `__kind` instances, directives. */
39
+ | "json"
40
+ /** A known attribute-less XML region (`<thinking>`, `<flashcards>`, …). */
41
+ | "xml_region"
42
+ /** An attribute-bearing XML element (`<artifact …>`, `<decision …>`, …). */
43
+ | "xml_attr"
44
+ /** Any other line-leading, balanced XML element. */
45
+ | "xml_container"
46
+ /** Allow-listed raw HTML block. */
47
+ | "html_block"
48
+ /** `<!-- … -->` comment. */
49
+ | "html_comment"
50
+ /** A pinned annotation anchor `<!--@a:id-->`. */
51
+ | "anchor"
52
+ /** `$$ … $$` display math on its own lines. */
53
+ | "math_block"
54
+ /** YAML front matter at the start of the text. */
55
+ | "front_matter"
56
+ /** A box-drawing tree diagram. */
57
+ | "tree";
58
+ /** Island types that live inside a prose block. */
59
+ type InlineIslandType = "variable" | "cite" | "math_inline" | "html_tag" | "xml_tag" | "xml_inline" | "html_comment" | "anchor" | "kind_json" | "media_ref";
60
+ type IslandType = BlockIslandType | InlineIslandType;
61
+ type IslandMeta = Readonly<Record<string, string | number | boolean>>;
62
+ interface SourceSpan {
63
+ /** UTF-16 offset of the first code unit. */
64
+ readonly start: number;
65
+ /** UTF-16 offset just past the last code unit. */
66
+ readonly end: number;
67
+ /** Code-point offset of `start`. */
68
+ readonly startCp: number;
69
+ /** Code-point offset of `end`. */
70
+ readonly endCp: number;
71
+ /** Exactly `text.slice(start, end)`. */
72
+ readonly raw: string;
73
+ }
74
+ interface SourceIsland extends SourceSpan {
75
+ readonly islandType: IslandType;
76
+ /** True when the island sits inside a prose block. */
77
+ readonly inline: boolean;
78
+ /** False when the construct's closer never arrived (streaming / malformed). */
79
+ readonly complete: boolean;
80
+ readonly meta: IslandMeta;
81
+ }
82
+ interface SourceBlock extends SourceSpan {
83
+ readonly kind: SourceBlockKind;
84
+ /** Set only on `island` blocks. */
85
+ readonly islandType: BlockIslandType | null;
86
+ readonly complete: boolean;
87
+ readonly meta: IslandMeta;
88
+ /** Inline islands of a `prose` block, in document order. Empty otherwise. */
89
+ readonly inlines: readonly SourceIsland[];
90
+ }
91
+ /**
92
+ * Cut `text` into blocks whose raw concatenation is exactly `text`.
93
+ * Never throws; unclosed constructs are islands with `complete: false`.
94
+ */
95
+ declare function tokenizeSource(text: string): SourceBlock[];
96
+ /** The exact source the blocks were cut from. */
97
+ declare function joinSource(blocks: readonly SourceBlock[]): string;
98
+ /** Every island — block-level and inline — in document order. */
99
+ declare function listIslands(blocks: readonly SourceBlock[]): SourceIsland[];
100
+ /** The block containing UTF-16 offset `offset` (the later block at a boundary). */
101
+ declare function blockAt(blocks: readonly SourceBlock[], offset: number): SourceBlock | null;
102
+
103
+ /**
104
+ * SAVE = SPLICE (rich-content PLAN decision 6).
105
+ *
106
+ * An editor never hands back a whole re-serialized document. It hands back
107
+ * per-block replacements for exactly the blocks the person changed; every
108
+ * other byte of the stored text is written back as it was. This module
109
+ * applies those replacements and returns:
110
+ *
111
+ * - the new text,
112
+ * - a change set (old range → new range, in UTF-16 AND code points,
113
+ * narrowed to the bytes that actually differ) that the annotation layer
114
+ * uses to carry every live anchor through the save
115
+ * (STORE-DESIGN §3.19 — the ProseMirror / Google Docs position-mapping
116
+ * model), and
117
+ * - an integrity report: every island outside the edited ranges must still
118
+ * be the same island, at its mapped position, in the new text. An edit
119
+ * that opens an unclosed fence and swallows a kind below it is caught
120
+ * here instead of being saved silently.
121
+ *
122
+ * A no-edit save (or edits whose text equals the original block) returns the
123
+ * original string itself — byte-identical, zero changes.
124
+ */
125
+
126
+ /** Replace `[start, end)` (UTF-16, on block boundaries) of the original with `text`. */
127
+ interface SourceEdit {
128
+ readonly start: number;
129
+ readonly end: number;
130
+ readonly text: string;
131
+ }
132
+ interface SourceChange {
133
+ /** The block-aligned range the edit named, in the ORIGINAL text. */
134
+ readonly blockStart: number;
135
+ readonly blockEnd: number;
136
+ /** The narrowed range that actually differs: old text … */
137
+ readonly oldStart: number;
138
+ readonly oldEnd: number;
139
+ /** … and where its replacement sits in the NEW text. */
140
+ readonly newStart: number;
141
+ readonly newEnd: number;
142
+ readonly oldStartCp: number;
143
+ readonly oldEndCp: number;
144
+ readonly newStartCp: number;
145
+ readonly newEndCp: number;
146
+ }
147
+ interface DisturbedIsland {
148
+ readonly islandType: IslandType;
149
+ readonly inline: boolean;
150
+ /** Where the island was in the original (UTF-16). */
151
+ readonly start: number;
152
+ readonly end: number;
153
+ /** Where it should have been in the new text. */
154
+ readonly mappedStart: number;
155
+ }
156
+ interface SpliceIntegrity {
157
+ /** True when every untouched island survived intact and outside bytes are identical. */
158
+ readonly ok: boolean;
159
+ /** Always true by construction; checked anyway because it is THE guarantee. */
160
+ readonly bytesOutsideEditsIdentical: boolean;
161
+ readonly disturbed: readonly DisturbedIsland[];
162
+ }
163
+ interface SpliceResult {
164
+ readonly text: string;
165
+ readonly changed: boolean;
166
+ readonly changes: readonly SourceChange[];
167
+ readonly integrity: SpliceIntegrity;
168
+ /** Tokenization of the new text. */
169
+ readonly blocks: readonly SourceBlock[];
170
+ }
171
+ type SourceSpliceErrorCode = "out_of_range" | "misaligned" | "overlap" | "stale_blocks" | "integrity";
172
+ declare class SourceSpliceError extends Error {
173
+ readonly code: SourceSpliceErrorCode;
174
+ constructor(code: SourceSpliceErrorCode, message: string);
175
+ }
176
+ interface SpliceOptions {
177
+ /** The tokenization of `original`, when the caller already holds it. */
178
+ readonly blocks?: readonly SourceBlock[];
179
+ /** Throw `SourceSpliceError("integrity")` instead of reporting a disturbed island. */
180
+ readonly requireIntegrity?: boolean;
181
+ }
182
+ /** An edit that replaces one block's raw text. */
183
+ declare function blockEdit(block: SourceBlock, text: string): SourceEdit;
184
+ /** An edit that replaces a contiguous run of blocks `[first, last]`. */
185
+ declare function blockRangeEdit(first: SourceBlock, last: SourceBlock, text: string): SourceEdit;
186
+ /**
187
+ * Apply block-aligned replacements to `original`. Bytes outside the edits are
188
+ * copied, never rebuilt; an edit equal to its block changes nothing.
189
+ */
190
+ declare function spliceSave(original: string, edits: readonly SourceEdit[], options?: SpliceOptions): SpliceResult;
191
+ interface MapOptions {
192
+ /** -1 keeps a position at an insertion point before the inserted text; 1 (default) moves it after. */
193
+ readonly assoc?: -1 | 1;
194
+ /** Offset unit of `pos` and of the result. Default `utf16`. */
195
+ readonly unit?: "utf16" | "codepoint";
196
+ }
197
+ interface MappedPosition {
198
+ readonly pos: number;
199
+ /** True when the position sat strictly inside replaced text. */
200
+ readonly deleted: boolean;
201
+ }
202
+ /**
203
+ * Carry a position in the old text through a change set (ProseMirror StepMap
204
+ * semantics): positions before a change stay, positions after shift by the
205
+ * size difference, a position strictly inside replaced text is `deleted` and
206
+ * lands on the replacement's edge chosen by `assoc`.
207
+ */
208
+ declare function mapPosition(changes: readonly SourceChange[], pos: number, options?: MapOptions): MappedPosition;
209
+ interface MappedRange {
210
+ readonly start: number;
211
+ readonly end: number;
212
+ /** True when a change overlapped the range's interior. */
213
+ readonly touched: boolean;
214
+ /** True when the whole range was replaced away. */
215
+ readonly collapsed: boolean;
216
+ }
217
+ /** Carry an anchor range through a change set; it stays inside its text when edits happen around it. */
218
+ declare function mapRange(changes: readonly SourceChange[], start: number, end: number, unit?: "utf16" | "codepoint"): MappedRange;
219
+
220
+ /**
221
+ * UTF-16 ⇄ code-point offset conversion.
222
+ *
223
+ * JavaScript strings are indexed in UTF-16 code units; Postgres `position()`,
224
+ * `substring()` and `length()` count code points. Every offset this module
225
+ * emits is given in BOTH units so an anchor captured on either side of the
226
+ * wire can be mapped without re-deriving the text.
227
+ */
228
+ /** Indexes the surrogate pairs of one text so conversion is O(log pairs). */
229
+ interface CodePointIndex {
230
+ /** Code-point offset of a UTF-16 offset. */
231
+ toCodePoint(utf16: number): number;
232
+ /** UTF-16 offset of a code-point offset. */
233
+ toUtf16(codePoint: number): number;
234
+ /** Code-point length of the text. */
235
+ readonly lengthCp: number;
236
+ }
237
+ /** True when `offset` sits between the two halves of a surrogate pair. */
238
+ declare function splitsSurrogatePair(text: string, offset: number): boolean;
239
+ declare function buildCodePointIndex(text: string): CodePointIndex;
240
+ /** One-shot conversion; build an index when converting many offsets. */
241
+ declare function toCodePointOffset(text: string, utf16: number): number;
242
+ /** One-shot conversion; build an index when converting many offsets. */
243
+ declare function toUtf16Offset(text: string, codePoint: number): number;
244
+
245
+ /**
246
+ * THE single-dollar math rule — the one predicate that decides whether
247
+ * `$…$` is inline math or currency.
248
+ *
249
+ * Moved here from matrx-frontend `components/markdown-core/math-normalizer.ts`
250
+ * (2026-09-23) so the renderer's normalizer and the source tokenizer can never
251
+ * disagree about which bytes are math: the normalizer imports this function.
252
+ *
253
+ * Pandoc's rule — the opening `$` is not followed by whitespace, the closing
254
+ * `$` is not preceded by whitespace and not followed by a digit — plus a math
255
+ * signal: a TeX command or operator (`\alpha`, `^`, `_`, `{`, `=`, …), or a
256
+ * lone variable (`$x$`, `$n$`, `$x'$`). Content that opens with a digit needs
257
+ * a real TeX signal, so a price range can never read as math.
258
+ */
259
+ declare function isSingleDollarMath(content: string, after: string | undefined): boolean;
260
+ /**
261
+ * Where a single-dollar math span opened at `open` (a lone `$`) closes, or -1.
262
+ * Same scan the normalizer uses: same line, backslash-escapes skipped, the
263
+ * closer is a `$` not followed by another `$`, and the content passes
264
+ * {@link isSingleDollarMath}. Returns the offset just past the closing `$`.
265
+ */
266
+ declare function singleDollarMathEnd(text: string, open: number, limit?: number): number;
267
+
268
+ /**
269
+ * XML tag reading + the generic-container balance scanner.
270
+ *
271
+ * Ported VERBATIM (behaviour) from matrx-frontend
272
+ * `components/mardown-display/blocks/xml/readXmlTag.ts` and the
273
+ * `XmlContainerTracker` in
274
+ * `components/mardown-display/markdown-classification/processors/utils/content-splitter-v2.ts`
275
+ * so the source tokenizer ends a generic XML section exactly where the
276
+ * renderer does. The renderer copies stay for rendering (PLAN decision 6);
277
+ * a divergence between the two is a defect in whichever changed last.
278
+ */
279
+ interface ReadXmlTag {
280
+ tagName: string;
281
+ raw: string;
282
+ isClosing: boolean;
283
+ isSelfClosing: boolean;
284
+ attributes: Array<{
285
+ name: string;
286
+ value: string;
287
+ }>;
288
+ }
289
+ declare function readXmlTag(content: string, start: number): ReadXmlTag | null;
290
+ /**
291
+ * Balances ONE unknown root tag line by line, ignoring lookalike tags inside
292
+ * fenced code, inline code spans, comments and CDATA. `consumeLine` returns
293
+ * the offset (within that line) just past the root's closing tag, or null.
294
+ */
295
+ declare class XmlContainerTracker {
296
+ readonly rootTag: string;
297
+ private depth;
298
+ private inComment;
299
+ private inCdata;
300
+ private inlineTicks;
301
+ private fenceMarker;
302
+ constructor(rootTag: string);
303
+ consumeLine(line: string, startOffset?: number): number | null;
304
+ }
305
+
306
+ export { type BlockIslandType, type CodePointIndex, type DisturbedIsland, type InlineIslandType, type IslandMeta, type IslandType, type MapOptions, type MappedPosition, type MappedRange, type ReadXmlTag, type SourceBlock, type SourceBlockKind, type SourceChange, type SourceEdit, type SourceIsland, type SourceSpan, SourceSpliceError, type SourceSpliceErrorCode, type SpliceIntegrity, type SpliceOptions, type SpliceResult, XmlContainerTracker, blockAt, blockEdit, blockRangeEdit, buildCodePointIndex, isSingleDollarMath, joinSource, listIslands, mapPosition, mapRange, readXmlTag, singleDollarMathEnd, spliceSave, splitsSurrogatePair, toCodePointOffset, toUtf16Offset, tokenizeSource };