Skip to Content
Руководство для разработчиковDaemon Client AdaptersПроект адаптера демона IDE

Проект адаптера демона 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 .

Минимальный поток работы

  1. Хост расширения создаёт DaemonClient.
  2. Выполняет запрос /capabilities и проверяет совместимость рабочего пространства.
  3. Создаёт или присоединяется с помощью DaemonSessionClient.createOrAttach().
  4. Подписывается на session.events() в хосте расширения.
  5. Преобразует события демона в существующие сообщения webview.
  6. Отправляет запросы пользователя через session.prompt().
  7. Маршрутизирует отмену/смену модели через session.cancel() и session.setModel().
  8. Маршрутизирует решения по разрешениям через 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_diedUI разрыва соединения + возможность переподключения

Неизвестные события должны игнорироваться или логироваться как отладочные метаданные.

Пользовательский опыт локальности во время выполнения

Расширение должно сделать локальность демона видимой:

  • рабочее пространство/файлы — это пути на хосте демона
  • 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.
Last updated on