Черновик адаптера демона TUI
Устарело: этот документ описывает ранний прототип
DaemonTuiAdapter. Устаревший адаптер всё ещё существует вpackages/cli/src/ui/daemon/, но переиспользуемое направление теперь — это общий слой UI-транскриптов SDK. Актуальную архитектуру см. в../daemon/14-cli-tui-adapter.md.
Цель (историческая)
Добавить TUI-транспорт, управляемый флагом, который взаимодействует с qwen serve через DaemonSessionClient вместо создания внутрипроцессного Config + агентской среды выполнения.
Это внутренний путь валидации для миграции клиента Mode B. Он не должен заменять стандартный путь TUI до тех пор, пока выходные приёмники, типизированные события демона, разрешения в рамках сессии и диагностика жизненного цикла не станут стабильными.
Предлагаемая точка входа
QWEN_DAEMON_URL=http://127.0.0.1:4170 qwen --experimental-daemon-tuiОпционально:
QWEN_DAEMON_TOKEN=... QWEN_DAEMON_WORKSPACE=/repo qwen --experimental-daemon-tuiCLI должен отказаться от этого режима, если не выполнены оба условия:
- установлены
QWEN_DAEMON_URLили--daemon-url. GET /capabilitiesрекламируетsession_create,session_promptиsession_events.
Минимальный поток
- Создать
DaemonClientс URL и токеном демона. - Выполнить запрос
/capabilities. - Создать или присоединиться с помощью
DaemonSessionClient.createOrAttach(). - Подписаться на
session.events(). - Отправлять запросы пользователя через
session.prompt(). - Направлять отмену через
session.cancel(). - Направлять переключение модели через
session.setModel(). - Направлять голоса разрешений через
session.respondToPermission().
Контракт рендеринга
Первая реализация добавляет DaemonTuiAdapter — локально проверяемый редуктор и прототип транспорта. Он отображает только следующие события демона:
| Событие демона | Обработка TUI |
|---|---|
session_update / agent_message_chunk | Добавить текст ассистента |
session_update / agent_thought_chunk | Добавить текст размышлений |
session_update / tool_call | Показать жизненный цикл вызова инструмента |
permission_request | Показать существующий UI подтверждения, где возможно |
permission_resolved | Закрыть или обновить UI подтверждения |
model_switched | Обновить отображение футера/модели |
session_died | Показать состояние отключения и остановить стриминг |
Неизвестные события должны игнорироваться, не быть фатальными. Типизированные редукторы событий появятся в более позднем PR протокола.
Адаптер ещё не подключён к стандартному приложению Ink. Существующее интерактивное TUI, JSONL, stream-json и поведение двойного вывода остаются неизменными.
Явные не-цели
- Не удалять текущую внутрипроцессную среду выполнения TUI.
- Не изменять поведение JSONL, stream-json или двойного вывода в этом PR.
- Не выставлять пока через TUI CRUD файлов, управление MCP, CRUD памяти или изменение провайдера/аутентификации.
- Не делать предположений о прямом доступе к демону из браузера/веба; это только терминал.
Безопасность слияния
- Отключено по умолчанию.
- Аддитивный путь кода.
- Никакие существующие флаги CLI не меняют поведение.
- Если демон недоступен, экспериментальный путь завершается ошибкой до запуска TUI и сообщает пользователю запустить
qwen serve.
План валидации
- Модульное тестирование отображения событий в состояние TUI с синтетическими событиями демона.
- Модульное тестирование пересылки запросов, отмены, переключения модели и голосов разрешений.
- Модульное тестирование разбора флагов/переменных окружения при подключении флага функции.
- Дымовое тестирование с локальным
qwen serve:- текст запроса стримится в TUI
- отмена завершает активный запрос
- запрос разрешения может быть принят или отклонён
- повторное подключение отправляет отслеживаемый
Last-Event-ID
Блокировки перед миграцией по умолчанию
- Типизированная схема событий демона.
- Маршрут разрешений в рамках сессии.
- Рефакторинг выходных приёмников для паритета JSONL / stream-json / двойного вывода.
- Семантика закрытия/удаления жизненного цикла сессии.
- Диагностика времени выполнения для MCP, навыков, провайдеров и окружения рабочей области.