[CL-CALL-CHAT] Реконсиляция транскрипта звонка вместо полной перерисовки #4

Merged
andrei merged 2 commits from feature/claude-call-transcript-reconcile into main 2026-06-24 20:15:31 +00:00
Owner

Чат криво при разговоре на call.europa-tech.org: Retell шлёт полный транскрипт на каждое слово, а update-хендлер делал transcript.innerHTML='' и пересобирал DOM → мерцание, прыжки скролла, срыв выделения, плюс content вставлялся как innerHTML (ломал вёрстку/XSS).

Что сделано:

  • renderTranscript() обновляет узлы по индексу, трогает DOM только при изменении.
  • Текст через textContent (экранирование).
  • Автоскролл только если пользователь внизу.
  • npm test = render.test.js (реальный код против DOM-стаба).

План тестирования: npm test → PASS; node --check инлайн-скрипта → OK.

Где могу ошибаться: точный симптом 'криво' краток; если имелась в виду путаница ролей/язык — нужен кейс.

Чат криво при разговоре на call.europa-tech.org: Retell шлёт полный транскрипт на каждое слово, а update-хендлер делал transcript.innerHTML='' и пересобирал DOM → мерцание, прыжки скролла, срыв выделения, плюс content вставлялся как innerHTML (ломал вёрстку/XSS). Что сделано: - renderTranscript() обновляет узлы по индексу, трогает DOM только при изменении. - Текст через textContent (экранирование). - Автоскролл только если пользователь внизу. - npm test = render.test.js (реальный код против DOM-стаба). План тестирования: npm test → PASS; node --check инлайн-скрипта → OK. Где могу ошибаться: точный симптом 'криво' краток; если имелась в виду путаница ролей/язык — нужен кейс.
Что сделано:
- update-хендлер Retell больше не делает transcript.innerHTML='' на каждом
  частичном апдейте; renderTranscript() обновляет узлы по индексу, трогая DOM
  только при изменении текста/роли.
- Текст реплики выводится через textContent (а не innerHTML) — речь с <, &,
  markdown больше не ломает вёрстку и закрывает XSS-вектор.
- Автоскролл только когда пользователь уже внизу — чтение не дёргает вниз.
- npm test теперь запускает render.test.js (реальный код против DOM-стаба).

Зачем:
- "Чат криво при разговоре": Retell шлёт полный транскрипт на каждое слово,
  полная перерисовка давала мерцание, прыжки скролла и срыв выделения.

План тестирования:
- npm test → renderTranscript checks: PASS (рост строки переиспользует узел,
  экранирование, лейблы ролей, усечение при сжатии транскрипта).
- node --check инлайн-скрипта index.html — синтаксис валиден.

Где могу ошибаться:
- Точный симптом "криво" описан кратко; фикс закрывает мерцание/скролл/вёрстку,
  но если имелась в виду, напр., путаница ролей или язык — нужен уточняющий кейс.
[CL-CALL-CHAT] CI: запускать render.test.js в smoke-проверке
Some checks failed
Forgejo Smoke Test / Smoke (pull_request) Failing after 40h50m17s
f81b4f80e4
andrei merged commit 731e96bbdd into main 2026-06-24 20:15:31 +00:00
andrei deleted branch feature/claude-call-transcript-reconcile 2026-06-24 20:15:31 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
europa-tech-srl/retell-webcall!4
No description provided.