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

Черновик адаптера 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-tui

CLI должен отказаться от этого режима, если не выполнены оба условия:

  • QWEN_DAEMON_URL или --daemon-url заданы.
  • GET /capabilities сообщает о наличии session_create, session_prompt и session_events.

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

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