Forge
markdowndeeb25a2
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
271. **Не заменять** внешний браузер: он остаётся каноничным default для `launchBrowser` (OAuth, расширения, привычные DevTools, изолированные профили). Встроенный просмотр — **дополнение**, включаемое явно.
282. **Опция UX** (имя ключа в настройках workspace или пользователя — детализация при реализации), например смыслы: **внешний** | **MFD** | **спросить один раз** / per-session. Семантика запуска и env не меняется: меняется только **поверхность навигации** после успешного `LaunchAsync`.
293. **Источник URL** — тот же, что для текущей логики `KestrelLaunchBrowser` / `launchBrowser`: первый подходящий `http`/`https` из эффективного окружения (в т.ч. `ASPNETCORE_URLS` после мерджа с профилем). Паритет «что открыли» с внешним режимом обязателен.
304. **Размещение:** отдельная **страница или регион MFD** (см. [0075](0075-ui-topic-index-and-mfd-page-conventions.md)), в типичном сценарии рядом с `DebugStack` / инструментацией, без перехвата PFD-зоны целиком (ср. [0091](0091-pfd-debug-situational-deck-hypothesis.md)).
315. **Технология встраивания** — вынести в отдельный подпункт реализации: на Windows — естественный кандидат **WebView2**; кросс-платформенная матрица (Linux/macOS) — отдельный срез (не блокирует Proposed-решение, но влияет на roadmap).
326. **Паритет агента (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
601. Настройка **поверхности** (external / mfd / ask) и маршрутизация из того же пути, что сейчас ведёт к `KestrelLaunchBrowser`.
612. MFD: страница + web host (WebView2 и т.д.); согласовать с [0075](0075-ui-topic-index-and-mfd-page-conventions.md).
623. События жизненного цикла отладки: старт, стоп, смена профиля — обновить или очистить view.
634. Тесты: по возможности headless/интеграционные на уровне «URL передан view», без полного E2E браузера в CI (уточнить в пайплайне).
645. User-facing: одна мини-секция в User Guide, ссылка из [0090](0090-launch-profiles-and-debug-startup-configurations.md) / этот ADR.
65
View only · write via MCP/CIDE