[feat][mcp] Убрать math и автолинк голых доменов из MCP-markdown-записи (без флагов; формулы — через JSON) + text-режим чтения для машинного диффа #502
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Суть
Две зеркальные боли агентского фидбека: markdown-слой при машинной работе искажает данные.
Запись:
($ticket_lifetime=2592000)превращается в LaTeX-формулу,gitea.vvzvlad.xyzавто-линкуется. Чтение под дифф: авто-ссылки и склейки строк дают ложные расхождения.По коду виновник записи — не markdown как таковой (CommonMark
foo_bar_bazне курсивит), а два расширения поверх: кастомный$...$-регексп (math-inline.ts) канонического импортера и автолинк бессхемных доменов. «_→ нижний индекс» — это KaTeX уже внутри ошибочно созданной math-ноды.Решение по итогам обсуждения (зафиксировано владельцем):
update_page_jsonсmathInline/mathBlock-нодой: JSON-путь и существует для сложных случаев.Решение
1. Запись: параметризовать канонический импортер, MCP зовёт с выключенными расширениями
markdownToProseMirror(md, { parseMath: false, fuzzyLinkify: false }):parseMath: false—$...$-регексп не применяется, доллары остаются текстом;fuzzyLinkify: false— автолинк только явныхhttps://…-URL; голые домены — текст;[text](url)работает как всегда.MCP-инструменты (
createPage,updatePageMarkdown, markdown-фрагменты insert/patch) зовут импортер ТОЛЬКО так — без флагов в контракте инструментов. Другие потребители импортера (полный импорт файлов, git-sync) — дефолты не меняются (там markdown пишут люди/экспортёры, math легитимен).В описания write-инструментов добавить: «литеральные блоки (конфиги, shell) — оборачивай в код-фенсы; формулы — через update_page_json».
2. Чтение:
format: "text"у getPageПлоский детерминированный текст узлов для машинного диффа: инлайн-марки/якоря/автоформат отброшены, блок = строка(и), hardBreak =
\n(после #503). Реализация — переиспользовать серверныйjsonToText-путь (питает tsvector), не изобретать второй сериализатор. Стабильность вывода между версиями пакета = контракт, закрепляется snapshot-тестом.Крайние случаи
$...$: перестанут создавать формулы — это и есть цель (владелец: формулы через JSON). Человеческий редактор и импорт файлов не затронуты.export_page_markdown, lossless из #328): экспорт может содержать$…$-текст из старых формул? Нет — экспорт эмитит math-ноды своей разметкой, а ИМПОРТ полных файлов идёт с дефолтами (math on) — lossless-пара не рвётся. Зафиксировать тестом.[image],[table 3x4]) — стабильно и задокументировано в описании инструмента.Тесты / приёмка
($ticket_lifetime=2592000),foo_bar_baz, голый домен, backticks — через createPage/updatePageMarkdown сохраняются литерально;https://…остаётся ссылкой;## заголовоки списки работают.$x^2$— формула создаётся (дефолты нетронуты).Связанное
Фидбек-пакет: #501 (токен), #503 (hardBreak — text-режим зависит от его
\n-семантики). КонтрактDocmostClientLike, регистрация в обоих хостах, пересборка build/* обоих пакетов.[feat][mcp] Литеральные режимы для агентов: запись без markdown-интерпретации (plain) + чтение сырого текста для машинного диффаto [feat][mcp] Убрать math и автолинк голых доменов из MCP-markdown-записи (без флагов; формулы — через JSON) + text-режим чтения для машинного диффа