Черновик адаптера TUI Daemon
Устарело: этот документ описывает ранний прототип
DaemonTuiAdapter. Устаревший адаптер всё ещё существует вpackages/cli/src/ui/daemon/, но переиспользуемое направление — это слой общих UI-транскрипций SDK. Актуальную архитектуру см. в../daemon/14-cli-tui-adapter.md.
Цель (историческая)
Добавить транспорт TUI, управляемый флагом, который общается с qwen serve через
DaemonSessionClient вместо создания внутрипроцессного Config + runtime агента.
Это внутренний путь валидации для миграции клиента Mode B. Он не должен заменять стандартный путь TUI, пока не стабилизируются output-приемники, типизированные события демона, разрешения на уровне сессии и диагностика жизненного цикла.
Предлагаемая точка входа
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 и двойного вывода остаётся без изменений.
Явно не входит в цели
- Не удалять текущий внутрипроцессный runtime TUI.
- Не менять поведение JSONL, stream-json или двойного вывода в этом PR.
- Не открывать CRUD файлов, управление MCP, CRUD памяти или изменения провайдера/аутентификации через TUI.
- Не делать предположений о прямом подключении браузера/веба к демону; это только терминал.
Безопасность слияния
- По умолчанию выключено.
- Аддитивный код.
- Ни один из существующих флагов CLI не меняет поведение.
- Если демон недоступен, экспериментальный путь завершается ошибкой до запуска TUI и сообщает пользователю запустить
qwen serve.
План проверки
- Модульные тесты отображения событий в состояние TUI с синтетическими событиями демона.
- Модульные тесты пересылки prompt, cancel, model switch и голосования за разрешения.
- Модульные тесты разбора флагов/переменных окружения, когда флаг функции подключен.
- Дымовое тестирование с локальным
qwen serve:- текст prompt поступает в TUI
- cancel завершает активный prompt
- запрос разрешения можно принять или отклонить
- переподключение отправляет отслеживаемый
Last-Event-ID
Блокеры перед стандартной миграцией
- Схема типизированных событий демона.
- Маршрут разрешений на уровне сессии.
- Рефакторинг output-приемников для паритета JSONL / stream-json / dual-output.
- Семантика закрытия/удаления жизненного цикла сессии.
- Диагностика runtime для MCP, навыков, провайдеров и окружения рабочей области.