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.tsturn_end) вызывает initFromServer для bulk-инициализации после api.agentMessages.
  • W-024: auth.ts мигрирован на Svelte 5 runeslib/stores/auth.ts (Svelte 4 writable/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.Xauth.X, $isAdminisAdmin()).
  • 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 — добавлен endpoint getWSTicket(agentId) в lib/api/client.ts через request<{ ticket: string }>. connectWS упрощён: убран прямой fetch с ручной обработкой 401 + повторным fetch; silent-refresh теперь автоматически работает через request.
  • W-029: убран лишний $effect в AppSidebar.sveltecloseSidebar() теперь срабатывает только на onclick={closeSidebar} в ссылках навигации, не на любое изменение pathname (важно для history.replaceState при переключении агента).
  • W-030: routes/+page.sveltegoto('/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 }.