| 1 | # Сравнение кандидатов на поверхность редактора (v1) |
| 2 | |
| 3 | **Статус:** чертеж-компаньон к [ADR 0103](../adr/0103-editor-hud-substrate-semantic-projection-and-surface-adapter.md) |
| 4 | **Дата:** 2026-04-26 |
| 5 | **Обновлено:** 2026-06-20 — нормативная линия Monaco: [ADR 0162](../adr/0162-monaco-forward-editor-webview2-host.md) |
| 6 | |
| 7 | **Связь:** [0085](../adr/0085-editor-hud-inline-layer-and-hud-banner.md), [0098](../adr/0098-semantic-first-document-as-projection.md), [0035](../adr/0035-mfd-embedded-webview-external-llm-and-mcp-boundary.md), [concept-to-implementation-map-v1](../ui-ux/concept-to-implementation-map-v1.md), [LANGUAGE-SERVICES-PLAN.md](../LANGUAGE-SERVICES-PLAN.md) |
| 8 | |
| 9 | Документ — **сравнительный аппендикс** к хосту документного редактора в зоне **Forward**. Он **не** меняет продуктовый baseline: **AvaloniaEdit** остаётся стеком по умолчанию в репозитории. |
| 10 | |
| 11 | --- |
| 12 | |
| 13 | ## 1. Текущий стек (baseline) |
| 14 | |
| 15 | | Измерение | AvaloniaEdit (сейчас) | |
| 16 | |-----------|------------------------| |
| 17 | | **Интеграция** | Нативный Avalonia; хост `DockDocumentView`; TextMate через AvaloniaEdit.TextMate | |
| 18 | | **LSP / семантика** | Склейка в коде приложения (направление DAL — [0102](../adr/0102-data-acquisition-layer-boundary-and-contract.md)); «клей» не исчезает сам | |
| 19 | | **Inline HUD** | Adorners, свои renderers, tooltips — реализуемо; полноценные inlays/ghost уровня VS — предмет доработок | |
| 20 | | **Производительность** | Для типичных файлов хорошо; для очень больших — от способа использования хоста | |
| 21 | | **Тема** | Может следовать теме приложения; паритет с MFD/кабиной — отдельная работа ([0066](../adr/0066-cockpit-ui-vs-ide-presentation-layer.md)) | |
| 22 | | **High-frequency** | События напрямую; всё равно вести через **bounded**-контур [0103](../adr/0103-editor-hud-substrate-semantic-projection-and-surface-adapter.md), а не в DataBus | |
| 23 | | **Риск** | Меньше разброса платформы на Windows; нет встроенного браузера во Forward | |
| 24 | |
| 25 | --- |
| 26 | |
| 27 | ## 2. Веб-редактор в WebView2 (например Monaco) |
| 28 | |
| 29 | | Измерение | Monaco (или аналог) в WebView2 | |
| 30 | |-----------|----------------------------------| |
| 31 | | **Что это** | Встроенный **Edge** webview в **нативном** процессе — **не** оболочка Electron-приложения. Иные компромиссы (interop, C++/WinRT, два кучи) vs связка Chromium+Node. | |
| 32 | | **Inline HUD** | Богатая экосистема (у Monaco: decorations, codelens-паттерны); остаётся работа по **C#-специфичной** стыковке LSP и **IPC** к DAL/IDE | |
| 33 | | **Тема** | Две системы: веб-CSS и Avalonia `PrimitivesKit` / кабина — риск **дублирования** | |
| 34 | | **Производительность** | Может быть сильной; large-doc и **alloc** — от интеграции | |
| 35 | | **Платформа** | WebView2 ориентирован на Windows; кроссплатформенный MFD уже ссылается на [0093](../adr/0093-mfd-embedded-browser-for-launch-url.md) для **вторичных** поверхностей, без обязанности для **кодового** редактора | |
| 36 | | **Политика** | [ADR 0103](../adr/0103-editor-hud-substrate-semantic-projection-and-surface-adapter.md): **не** baseline Forward; только опциональная исследовательская линия. WebView2 как инструмент **MFD** — [0035](../adr/0035-mfd-embedded-webview-external-llm-and-mcp-boundary.md). | |
| 37 | |
| 38 | --- |
| 39 | |
| 40 | ## 3. Другие нативные или гибридные варианты (strawman) |
| 41 | |
| 42 | | Вариант | Когда смотреть | |
| 43 | |---------|----------------| |
| 44 | | **Более тяжёлая кастомизация Avalonia** (больше adorners, Skia, своя вёрстка текста) | Оставаться нативным; вкладываться, если пределы AvaloniaEdit **измеримы** в целевых сценариях (большие файлы, плотность hint’ов) | |
| 45 | | **Редактор в отдельном процессе** (IPC) | Вне v1; растёт операционка и синхронизация с «истиной буфера» [0084](../adr/0084-agent-edits-editor-source-of-truth-presence-channel.md) | |
| 46 | | **Стиль Roslyn/VS platform** | Долгий горизонт; не вытекает из спайка 0103 | |
| 47 | |
| 48 | --- |
| 49 | |
| 50 | ## 4. Как это питает `IEditorSurfaceAdapter` |
| 51 | |
| 52 | Контракт адаптера — **независимый от хоста**: тот же `SemanticProjectionPipeline` / `EditorHudEngine` сначала крутит AvaloniaEdit; веб-хост реализует **тот же** порт координат, каретки и **семантического отображения**, без дублирования DAL или CCU. |
| 53 | |
| 54 | **Минимальная поверхность порта (концептуально):** |
| 55 | |
| 56 | - `DocumentId` + снимок текста или диапазоны изменений для LSP |
| 57 | - Каретка/selection в смещениях документа; опционально визуальная строка/колонка |
| 58 | - API запроса **стабилизированной** презентации hover/диагностик от **движка** (а не сырой LSP во view) |
| 59 | |
| 60 | --- |
| 61 | |
| 62 | ## 5. Сводка решения |
| 63 | |
| 64 | | Сценарий | Направление | |
| 65 | |----------|-------------| |
| 66 | | **Редактор кода Forward по умолчанию** | **AvaloniaEdit** + слои [0103](../adr/0103-editor-hud-substrate-semantic-projection-and-surface-adapter.md) | |
| 67 | | **MFD / URL запуска / внешний LLM** | WebView2 по **0035 / 0093** — не замена ядра редактора без отдельного ADR | |
| 68 | | **Monaco / WebView2 Forward** | [ADR 0162](../adr/0162-monaco-forward-editor-webview2-host.md): strangler `monaco_webview2`, не Photino-shell; фазы M0–M6 | |
| 69 | |