[bug][mcp] replaceImage всё ещё дёргает курсор: mutateLiveContentUnlocked пишет деструктивно (продолжение #152) #164

Closed
opened 2026-06-24 14:50:05 +03:00 by Ghost · 0 comments

Выделено из ревью PR #154 (suggestion 4).

Симптом

Фикс #152 (структурный диф через applyDocToFragment/updateYFragment, сохраняющий Yjs-id и якорь курсора) применён к основному write-пути, но путь замены изображения остался на старом деструктивном write-back. Значит для инструмента replaceImage прыжок курсора #152 всё ещё воспроизводится.

Где

packages/mcp/src/client.tsmutateLiveContentUnlocked (≈ L489–491) делает по-старому:

fragment.delete(0, length)
Y.applyUpdate(doc, Y.encodeStateAsUpdate(tempDoc))

Используется из replaceImage (см. client.ts:2659 и :2713).

Предлагаемая правка

Перевести mutateLiveContentUnlocked на тот же applyDocToFragment(ydoc, newDoc), что и основной путь, чтобы диф сохранял id неизменных узлов и якорь курсора. Сопроводить тестом на этот путь (по образцу comment-cursor-stability.test.mjs): курсор/RelativePosition в неизменном узле переживает замену изображения.

Заметки

  • Это предсуществующий код, не регресс PR #154 — но фикс #152 без него неполон.
  • Проверить атомарность (одна ydoc.transact) и совместимость updateYFragment с узлом image на верхнем/вложенном уровне.
Выделено из ревью PR #154 (suggestion 4). ## Симптом Фикс #152 (структурный диф через `applyDocToFragment`/`updateYFragment`, сохраняющий Yjs-id и якорь курсора) применён к основному write-пути, но **путь замены изображения остался на старом деструктивном write-back**. Значит для инструмента `replaceImage` прыжок курсора #152 всё ещё воспроизводится. ## Где `packages/mcp/src/client.ts` — `mutateLiveContentUnlocked` (≈ L489–491) делает по-старому: ```ts fragment.delete(0, length) Y.applyUpdate(doc, Y.encodeStateAsUpdate(tempDoc)) ``` Используется из `replaceImage` (см. `client.ts:2659` и `:2713`). ## Предлагаемая правка Перевести `mutateLiveContentUnlocked` на тот же `applyDocToFragment(ydoc, newDoc)`, что и основной путь, чтобы диф сохранял id неизменных узлов и якорь курсора. Сопроводить тестом на этот путь (по образцу `comment-cursor-stability.test.mjs`): курсор/RelativePosition в неизменном узле переживает замену изображения. ## Заметки - Это предсуществующий код, не регресс PR #154 — но фикс #152 без него неполон. - Проверить атомарность (одна `ydoc.transact`) и совместимость `updateYFragment` с узлом image на верхнем/вложенном уровне.
vvzvlad added the bug label 2026-06-24 20:47:38 +03:00
Ghost closed this issue 2026-06-25 12:49:15 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#164