Проект адаптера демона IDE
Цель
Позволить расширению-компаньону VS Code использовать в режиме «собачьей еды» Mode B, подключаясь из хоста расширения к qwen serve через DaemonSessionClient.
WebView не должен вызывать демона напрямую. Хост расширения владеет URL демона, токеном, идентификатором сессии и состоянием повторного воспроизведения SSE, после чего передаёт санитизированные события приложения в webview.
Предлагаемая точка входа
Настройки VS Code:
{
"qwen-code.experimentalDaemon.enabled": true,
"qwen-code.experimentalDaemon.url": "http://127.0.0.1:4170",
"qwen-code.experimentalDaemon.token": ""
}Резервное использование переменных окружения для локального «собачьего корма»:
QWEN_IDE_DAEMON_URL=http://127.0.0.1:4170 code .Минимальный поток работы
- Хост расширения создаёт
DaemonClient. - Выполняет запрос
/capabilitiesи проверяет совместимость рабочего пространства. - Создаёт или присоединяется с помощью
DaemonSessionClient.createOrAttach(). - Подписывается на
session.events()в хосте расширения. - Преобразует события демона в существующие сообщения webview.
- Отправляет запросы пользователя через
session.prompt(). - Маршрутизирует отмену/смену модели через
session.cancel()иsession.setModel(). - Маршрутизирует решения по разрешениям через
session.respondToPermission().
Отношение к существующему ACP-соединению
Первая реализация вводит параллельный путь соединения, а не заменяет AcpConnection:
QwenAgentManager
current default -> AcpConnection -> qwen --acp дочерний процесс
experimental -> DaemonIdeConnection -> qwen serve HTTP/SSEОба пути должны по возможности передавать одни и те же высокоуровневые колбэки webview. Если событие пока нельзя точно отобразить, путь демона должен выдавать понятное предупреждение о неподдерживаемом состоянии, а не молча делать вид, что паритет достигнут.
Этот PR добавляет DaemonIdeConnection как локально проверяемый прототип адаптера хоста расширения. Он ещё не подключён к пути по умолчанию в QwenAgentManager, поэтому существующее поведение VS Code остаётся на основе ACP-подпроцесса.
Контракт отображения событий
| Событие демона | Обработка в IDE |
|---|---|
session_update / agent_message_chunk | Существующий колбэк потока ассистента |
session_update / agent_thought_chunk | Существующий колбэк потока размышлений |
session_update / tool_call | Существующий колбэк обновления вызова инструмента |
permission_request | Существующий колбэк UI запроса разрешения |
permission_resolved | Закрыть/обновить UI разрешения |
model_switched | Существующий колбэк состояния модели, где возможно |
session_died | UI разрыва соединения + возможность переподключения |
Неизвестные события должны игнорироваться или логироваться как отладочные метаданные.
Пользовательский опыт локальности во время выполнения
Расширение должно сделать локальность демона видимой:
- рабочее пространство/файлы — это пути на хосте демона
- MCP-серверы запускаются на хосте демона
- навыки загружаются из файловой системы демона
- учётные данные провайдера разрешаются в окружении процесса демона
Не следует подразумевать, что локальные расширения VS Code, локальный профиль браузера, локальные сервисы на localhost или локальные SSH/kube-учётные данные автоматически доступны демону.
Явные не-цели
- Нет миграции по умолчанию от
AcpConnection. - Нет прямого транспорта webview-демон.
- Нет CRUD-операций с файлами на стороне демона через IDE до появления границ файлового сервиса.
- Пока нет обратного RPC для редактора/браузера/буфера обмена.
- Нет полной интеграции удалённого управления.
Безопасность слияния
- По умолчанию отключено за настройкой/переменной окружения.
- Дополнительный, параллельный путь соединения.
- Существующий путь ACP-подпроцесса VS Code остаётся неизменным.
- Токен демона никогда не попадает в JavaScript webview.
План проверки
- Модульные тесты фабрики сессий демона и потребления SSE-событий.
- Модульные тесты отображения событий демона в существующие колбэки хоста расширения.
- Модульные тесты отправки запросов (prompt), отмены, смены модели и ответов на запросы разрешений.
- Модульные тесты разрешения настроек/переменных окружения при подключении флага функции.
- Дымовое тестирование локального хоста расширения против
qwen serve:- поток промпта попадает в чат
- отмена работает
- UI разрешений может обработать запрос
- переподключение SSE использует отслеживаемый
Last-Event-ID
Блоки перед миграцией по умолчанию
- Типизированная схема событий демона.
- Идентификация клиента с меткой демона.
- Маршрут разрешений с областью сессии.
- Диагностика времени выполнения только для чтения.
- Граница FileSystemService и безопасные маршруты чтения файлов.
- Рефакторинг вывода для паритета CLI/TUI.