v0.1.16
Что исправлено
Исправлен баг дублирования/«каши» в стриминговом выводе сообщений и tool-ошибок (когда фрагменты приходят перекрывающимися или как снимок целого текста, а не чистый delta).
Симптомы до фикса
- Повторяющиеся куски текста в ответах (например,
Готово...Готово...и т.п.). - Нечитаемые длинные строки в сообщениях и ошибках инструментов.
Root cause
Клиентская функция склейки стрима в src/lib/message-limits.ts всегда делала простое current + delta.
При перекрывающихся чанках или snapshot-чанках это порождало экспоненциальные повторы текста в UI.
Технические изменения
src/lib/message-limits.ts
- Добавлен
mergeStreamingChunk(current, chunk):- если
chunkуже содержитcurrentкак префикс -> берёмchunk; - если
currentуже заканчиваетсяchunk-> оставляемcurrent; - иначе ищем максимальный overlap (
suffix(current)==prefix(chunk)) и добавляем только недостающую часть; - fallback: обычная конкатенация.
- если
appendDeltaWithCap(...)теперь использует merge перед ограничением длины и безопасной обрезкой.
src/lib/message-limits.test.ts
- Добавлены тесты:
- snapshot-чанки не дублируют текст;
- overlap-чанки склеиваются один раз без повторов.
Проверка
bun run test src/lib/message-limits.test.ts— PASSbun run ci:local— PASS (lint + typecheck + tests + build)
Коммит
51ffd6ffix(stream): dedupe overlapping chunks to prevent repeated output