| 1 | # ADR 0093: Встроенный просмотр URL запуска на MFD (расширение к профилям и launchBrowser) |
| 2 | |
| 3 | **Статус:** Accepted · Implemented |
| 4 | **Дата:** 2026-04-24 |
| 5 | |
| 6 | ## Связанные ADR |
| 7 | |
| 8 | | ADR | Роль | |
| 9 | |-----|------| |
| 10 | | [0090](0090-launch-profiles-and-debug-startup-configurations.md) | семантика `launchBrowser` и URL из Kestrel / `ASPNETCORE_URLS` | |
| 11 | | [0002](0002-debug-human-agent-parity.md) | один смысл запуска — разные *поверхности* просмотра, без второго «типа» отладки | |
| 12 | | [0075](0075-ui-topic-index-and-mfd-page-conventions.md) | страницы MFD / слоты | |
| 13 | | [0021](0021-pfd-mfd-cockpit-attention-model.md) | кокпит: стек, лог, гипотезы + контент сессии рядом | |
| 14 | | [0091](0091-pfd-debug-situational-deck-hypothesis.md) | PFD vs Mfd | |
| 15 | |
| 16 | --- |
| 17 | ## Контекст |
| 18 | |
| 19 | В [0090](0090-launch-profiles-and-debug-startup-configurations.md) зафиксированы Kestrel-профили, импорт из `Properties/launchSettings.json` и смысловой флаг **открыть браузер** после старта процесса. В реализации baseline это **внешнее** открытие URL (системный браузер), что совпадает с привычным поведением Visual Studio и не требует встраивать движок рендеринга. |
| 20 | |
| 21 | Одновременно продуктовая линия CIDE — **кокпит** (MFD, отладка, агент): разработчику и агенту выгодно **не покидать IDE**, чтобы **видеть отрисованную страницу** по тому же `http(s)://…`, что отдаёт Kestrel, — рядом со стеком, точками останова и каналом отладки. Вопрос не в замене MSBuild/DAP, а в **третьей оси** после «какой профиль / какой URL»: **где** показать тот же URL. |
| 22 | |
| 23 | <a id="adr0093-decision"></a> |
| 24 | |
| 25 | ## Решение (направление) |
| 26 | |
| 27 | 1. **Не заменять** внешний браузер: он остаётся каноничным default для `launchBrowser` (OAuth, расширения, привычные DevTools, изолированные профили). Встроенный просмотр — **дополнение**, включаемое явно. |
| 28 | 2. **Опция UX** (имя ключа в настройках workspace или пользователя — детализация при реализации), например смыслы: **внешний** | **MFD** | **спросить один раз** / per-session. Семантика запуска и env не меняется: меняется только **поверхность навигации** после успешного `LaunchAsync`. |
| 29 | 3. **Источник URL** — тот же, что для текущей логики `KestrelLaunchBrowser` / `launchBrowser`: первый подходящий `http`/`https` из эффективного окружения (в т.ч. `ASPNETCORE_URLS` после мерджа с профилем). Паритет «что открыли» с внешним режимом обязателен. |
| 30 | 4. **Размещение:** отдельная **страница или регион MFD** (см. [0075](0075-ui-topic-index-and-mfd-page-conventions.md)), в типичном сценарии рядом с `DebugStack` / инструментацией, без перехвата PFD-зоны целиком (ср. [0091](0091-pfd-debug-situational-deck-hypothesis.md)). |
| 31 | 5. **Технология встраивания** — вынести в отдельный подпункт реализации: на Windows — естественный кандидат **WebView2**; кросс-платформенная матрица (Linux/macOS) — отдельный срез (не блокирует Proposed-решение, но влияет на roadmap). |
| 32 | 6. **Паритет агента (MCP):** контракт `debug_launch` / профилей **не** обязывает знать о MFD. Агент по-прежнему оперирует workspace + target + профилем; выбор **внешний vs MFD** — настройка IDE для человека (и опционально идемпотентный хинт в `settings`, если когда-либо понадобится в протоколе — только как необязательное расширение). |
| 33 | |
| 34 | <a id="adr0093-consequences"></a> |
| 35 | |
| 36 | ## Последствия |
| 37 | |
| 38 | - Появляется **зависимость** от встраиваемого web runtime и политик безопасности (навигация, mixed content, localhost TLS) — бюджет сопровождения отдельно от «просто Process.Start». |
| 39 | - Нужны правила **жизненного цикла**: смена URL при перезапуске отладки, закрытие вкладки при `debug_stop`, отсутствие «зависшего» web view без сессии. |
| 40 | - Документация User Guide: когда предпочесть MFD, когда внешний браузер (коротко, продуктовый слой). |
| 41 | |
| 42 | <a id="adr0093-non-goals"></a> |
| 43 | |
| 44 | ## Отклонённые / вне scope |
| 45 | |
| 46 | - **Только** встроенный браузер без внешнего пути — отклонено: ломает типичные сценарии логина и привычный DevTools-контур. |
| 47 | - Полный **паритет** с Chrome DevTools внутри IDE — вне scope. Для v1 встроенного режима достаточно **обычного рендеринга страницы** по тому же URL (как во внешнем браузере: разметка, стили, скрипты на странице), **без** панели Network, Application, Performance и остального контура DevTools. |
| 48 | - **Удаление** `launchBrowser: false` при выборе MFD — неверно: флаг остаётся про «надо ли открывать URL вообще»; поверхность — второй уровень. |
| 49 | |
| 50 | <a id="adr0093-implementation-status"></a> |
| 51 | |
| 52 | ## Статус внедрения |
| 53 | |
| 54 | - Не реализовано. Текущий baseline: внешний браузер по [0090](0090-launch-profiles-and-debug-startup-configurations.md). Настоящий ADR фиксирует направление и границы, чтобы не смешивать с рефакторингом DAP/профилей. |
| 55 | |
| 56 | <a id="adr0093-implementation-checklist"></a> |
| 57 | |
| 58 | ## Implementation checklist (когда возьмём в работу) |
| 59 | |
| 60 | 1. Настройка **поверхности** (external / mfd / ask) и маршрутизация из того же пути, что сейчас ведёт к `KestrelLaunchBrowser`. |
| 61 | 2. MFD: страница + web host (WebView2 и т.д.); согласовать с [0075](0075-ui-topic-index-and-mfd-page-conventions.md). |
| 62 | 3. События жизненного цикла отладки: старт, стоп, смена профиля — обновить или очистить view. |
| 63 | 4. Тесты: по возможности headless/интеграционные на уровне «URL передан view», без полного E2E браузера в CI (уточнить в пайплайне). |
| 64 | 5. User-facing: одна мини-секция в User Guide, ссылка из [0090](0090-launch-profiles-and-debug-startup-configurations.md) / этот ADR. |
| 65 | |