1.2.6
Changed (#385)
- Чат: размышления (reasoning) сообщений истории больше не инлайн-аккордеон
<details>в теле бабла — у сообщения с reasoning в footer появляется кнопка 🧠 (brain-иконка lucide, рядом с копировать/лайк/дизлайк/избранное), открывающая текст в split-view панелиSidePanel(паттерн #384): заголовок «Размышления», markdown черезMarkdownRenderer(security contract #306 — DOMPurify обязателен), внутренний скролл. Поведение: повторный клик по кнопке того же сообщения закрывает панель, клик по кнопке другого сообщения переключает контент, клик при открытой другой вкладке переключает на reasoning, активная кнопка подсвечена (active-reasoning); смена агента закрывает reasoning-панель (messageId принадлежит другому агенту), исчезновение сообщения из истории (topic-break, удаление) — тоже, вместо висящей пустой панели (empty-state-заглушка «Размышления недоступны» остаётся на кадр перехода,role="status"). Живой стрим reasoning не изменился:ReasoningBlockвStreamingMessageостаётся инлайн-блоком с авто-раскрытием; кнопки «Размышления» в шапке чата нет — reasoning существует только в контексте сообщения. Состояние split-view панели вынесено из локального rune+page.svelteв модульный storestores/sidePanel.svelte.ts(паттернsidebar.svelte.ts: приватные runes + геттерыsidePanelKind/sidePanelReasoningMessageId+ мутаторыtoggleSidePanel/toggleReasoning/closeSidePanel) — панель открывается и из компонентов сообщения без проброски колбэков через MessageList (паттерн прямого импорта store, как favoritesStore); общий набор lucide path’ов для двух мест использования вынесен вutils/icons.ts. ocr review (3 прогона) — ключевая находка закрыта: эффект закрытия при смене агента обязан читатьsidePanelKind()черезuntrack, иначе Svelte 5 реинвалидирует эффект от собственногоcloseSidePanel()и панель закрывалась бы сразу после открытия кнопкой; также закрыты untrack в эффекте stale-очистки (холостые прогоны на каждое переключение вкладок), empty-state +role="status", stateless-контрактReasoningPanel(смена сообщения — prop-update, не remount), общий модуль иконок, единыйpanelMeta-derived без кастов в шаблоне, узкий типactivePanelу ChatHeader (reasoning маппится в null на кол-сайте),aria-labelкнопки; отклонены с обоснованием: русские комментарии/строки (конвенция проекта),aria-pressedвместоaria-expanded(кнопка — честный toggle), перенос остальных иконок шапки в icons.ts (используются в одном месте),void _agent-конвенция файла. Тесты: новыеstores/sidePanel.svelte.test.ts(8 — toggle-семантика вкладок и reasoning) иReasoningPanel.test.ts(3 — empty/whitespace/markdown);npm run check,npm test(866),make build-webui— зелёные.