# Frontend: чат, потоковый ответ и голос

UI на https://chat-agent.gis-master.ru/ отправляет запросы в Core и получает
события через защищённый NATS `/ws`. Файловое распознавание и диагностика
открываются на https://voice.gis-master.ru/. [Владельцы и маршруты](</experiments/voice-ai/archive/w/DOCS/DEPLOYMENT.md>).

Канонический маршрут — `/chat/<session_id>`. Без UUID создаётся новый чат;
после reload история и runtime artifacts восстанавливаются через `/core/history`.
`user123` — общий subject suffix, поэтому клиент обязательно фильтрует session,
request, attempt и generation до отображения статуса, текста или команды карты.
Глобальные сервисные статусы обрабатываются отдельно.

## Запрос и отмена

`POST /core/message` получает `request_id`; UI ждёт итог максимум 125 секунд.
Ответ показывается фрагментами, завершение — окончательным событием/RPC.
`GET /core/requests/<id>` восстанавливает snapshot после NATS reconnect,
`DELETE` отменяет ответ с проверкой session. Core NATS не хранит полный replay.
Отменённый текст остаётся помеченным черновиком. При отмене редактирования
сохраняется исходная история; успешный результат перестраивает выбранную ветку.

Кнопки остановки микрофона и отмены ответа выполняют разные действия. Перегрузка,
потеря транспорта, deadline и отказ распознавания имеют отдельные понятные статусы.

## Голос

WebRTC — транспорт по умолчанию, WSS PCM выбирается явно. Автоматической смены
транспорта и ICE restart нет. WebRTC публикует SDP сразу и кандидаты по мере
появления; capability 404 — единственный legacy fallback. STUN/TURN сохранены.
Сигнализация 10 с, media 20 с после answer, disconnected grace 8 с.
Потеря ICE-канала после connected предупреждает, сохраняя медиапоток.

WSS `/audio/ws` передаёт mono PCM16LE с фактической sample rate браузера;
сервер resample в 16 kHz. Start control — 3 с, binary chunk ≤8 КиБ.
Общий лимит — три audio connections; четвёртый получает отказ до PCM.
После end завершение ASR ожидается ≤20 секунд. Подробности:
[AUDIO_TRANSPORTS](</experiments/voice-ai/archive/w/DOCS/AUDIO_TRANSPORTS.md>), [WEBRTC_SIGNALING](</experiments/voice-ai/archive/w/DOCS/WEBRTC_SIGNALING.md>),
[замеры C2](</experiments/voice-ai/archive/w/DOCS/CHAT_AGENT_AUDIO_C2.md>).

## Исходники и проверки

- [AssistantApp](#archive-availability)
- [request state и фильтры](#archive-availability)
- [HTTP и cancel](#archive-availability)
- [NATS reconnect](</experiments/voice-ai/archive/w/src_front/src/net/natsClient.ts>)
- [UI](</experiments/voice-ai/archive/w/src_front/src/ui/chatUi.ts>)

`npm run check` выполняется в `src_front/`. Проверять собственный чат, чужие
session events, snapshot после reconnect, отмену и history reload. Синтетический
WAV подтверждает PCM/ASR/ответ, но не качество физического микрофона или WER.
