1.1.1
Fixed (#373)
- Чат: единообразие мобильного представления и скрытие служебных строк cron/heartbeat-прогонов (#373), только фронтенд — логика бэкенда и LLM-контекст не затронуты. (1) Системные сообщения (cron/heartbeat) рендерились отдельной веткой с классом
flex items-start gap-3, на которую не действовал мобильный media query (app.css,max-width: 767px) — иконка канала оставалась слева и «сплющивала» пузырь. Системная и обычная веткиChatMessage.svelteсведены в общий снипет-каркас.msg-row→ leading-иконка/аватар →.msg-content→.msg-author-name→ пузырь: на мобильных иконка канала скрывается тем же правилом, что и аватары (имя сверху, пузырь на всю ширину), на десктопе вид не изменился. (2) В истории чата cron-прогон показывался целиком: user-сообщение с текстом задачи → tool_iteration-карточки → промежуточные assistant+tool_calls → финальный ответ. Теперь виден только финальный ответ:hiddenSystemRunIds(chatMerge.ts) выделяет «цепочки» системных прогонов (user/assistant сchannel=cron|heartbeatплюсtool_iteration-строки, персистящиеся без канала; непрерывность блока гарантирована сериализацией ходов одним SessionActor) и скрывает всё, кроме последней assistant-строки цепи — ею бывает и error-текст сбойного прогона (#371), так что ошибки остаются видимыми.tool_iteration-карточки обычных ходов не затрагиваются (цепь начинается только системной строкой; «осиротевшие» карточки без системной строки справа остаются видимыми), соседние прогоны без обычных сообщений между ними не склеиваются (user-строка всегда начинает новую цепь), обрезка окна пагинацией обрабатывается («хвост» прогона без user-строки прикрепляется к финалу, «голова» без финала скрыта целиком — живой прогресс cron в чат и так не транслируется). Скрытие рендеровое: строки остаются в БД, API и контексте агента. Тесты (TS, новыйchatMerge.test.ts): полный прогон, heartbeat, соседние прогоны, хвост/prepend окна пагинации, цепь без assistant, error-финал, обычный ход с tool_iteration не затронут, контрактisSystemChannel. ocr review — 8 находок, 5 закрыты (тест склейки prepended-окна, контракт-блок,SYSTEM_CHANNELSкак единственная точка правды, снипет-каркас, объединение пустых веток MessageList), 2 отклонены с обоснованием (разрыв цепи на «прочих ролях» не ломает видимость финала — он начинает новую цепь; сценарий «окно целиком из mid-run tool_iteration» практически невозможен из-за сериализации ходов).