0.134.14
Changed
Реализованы 10 P1-задач из аудита docs/audit/web-2026-06-06.md (Группа 1: малые правки + DRY + миграции на Svelte 5 runes).
- W-021: DRY:
agentColorsвынесен вlib/utils/agentColor.ts— массив из 5 цветов дублировался вChatMessage.svelte,ChatHeader.svelte,ChatSidebar.svelte,ChatThinking.svelte,routes/chat/+page.svelte. Создана утилита с типизированнымAgentColorClass(derived изas const). ВChatHeader.svelteиChatSidebar.svelte(гдеagentColorпринималAgent) вызовы заменены наagentColor(agent.id). - W-022: DRY:
agentDisplayNameвынесен вlib/utils/agentDisplayName.ts— функция дублировалась вroutes/chat/+page.svelteиlib/components/chat/ChatHeader.svelte. Локальные копии удалены. - W-023:
reactions/favoritesпереведены на$state-классы —lib/utils/reactions.tsиlib/utils/favorites.tsудалены, заменены наlib/stores/reactions.svelte.tsиlib/stores/favorites.svelte.ts(классы с$state<Map>). API:get(id),initFromServer(record),clear(),set/toggle.ChatMessage.svelteупрощён: локальный$stateзаменён на$derived(прямое чтение из store).chat.svelte.ts(вturn_end) вызываетinitFromServerдля bulk-инициализации послеapi.agentMessages. - W-024:
auth.tsмигрирован на Svelte 5 runes —lib/stores/auth.ts(Svelte 4writable/derived) заменён наlib/stores/auth.svelte.tsс классомAuthStore(isAuthenticated = $state(false),user = $state<CurrentUser | null>(null), etc.). Конструктор читаетgetAccessToken()и подписывается наonAuthRefresh. ЭкспортыisAuthenticated/currentUser/isAdmin/getAgentRole/canEditAgentстали функциями. Обновлены 19 импортов (from '$lib/stores/auth'→from '$lib/stores/auth.svelte') и все использования ($auth.X→auth.X,$isAdmin→isAdmin()). - W-026: scroll-эффект в chat троттлится через
requestAnimationFrame—$effectсоscrollToBottom()обёрнут в rAF с флагомscrollPending, теперь во время стрима scroll вызывается не чаще 1 раза за кадр. - W-027:
behavior: 'instant'→'auto'вroutes/chat/+page.svelte— стандартное значениеScrollBehaviorв TypeScript, эквивалентное мгновенной прокрутке. - W-028:
connectWSиспользуетrequestдля получения ticket — добавлен endpointgetWSTicket(agentId)вlib/api/client.tsчерезrequest<{ ticket: string }>.connectWSупрощён: убран прямойfetchс ручной обработкой 401 + повторным fetch; silent-refresh теперь автоматически работает черезrequest. - W-029: убран лишний
$effectвAppSidebar.svelte—closeSidebar()теперь срабатывает только наonclick={closeSidebar}в ссылках навигации, не на любое изменениеpathname(важно дляhistory.replaceStateпри переключении агента). - W-030:
routes/+page.svelte—goto('/chat')в теле<script>, не вonMount— убран лишний рендер спиннера, редирект срабатывает синхронно при инициализации компонента. - W-031: типизирован
PageDataв 19 файлахroutes/agents/[id]/*/+page.svelte— добавленimport type { PageData } from './$types';и замененоlet { data } = $props()наlet { data }: { data: PageData } = $props().+layout.tsдляagents/[id]уже существовал и возвращает{ agentId: number }.