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» практически невозможен из-за сериализации ходов).