0.134.51
Changed
- Рефакторинг дублирующего функционала между
/settings/и/agents/{id}/. Анализ выявил четыре класса пересечений: (A) явный дубль (Cron/Heartbeat продублированы в settings без добавленной ценности — агрегация по всем агентам реализовалась циклом по per-agent эндпоинтам, т.е. settings-страницы не имели собственного бэкенда); (B2) смешение уровней управления (Skills: матрица «навык × агент» жила и в settings, и в агенте); (C) спрятанный UX (MCP-активация для агента была вложена вpermissions → mcpвместо отдельного пункта навигации); (D1) дубль редактирования полей агента (settings/agentsvs/agents/{id}). Рефакторинг только frontend — backend (Go handlers/services/store) не тронут, т.к. все эндпоинты переиспользуются оставшимися разделами; специфичных admin-агрегирующих эндпоинтов для cron/heartbeat не существует (проверено grep’ом/api/v1/admin/(cron|heartbeat)→ 0). Netto: −717 строк. - Категория A — убран дубль из settings. Удалены
web/src/routes/settings/cron/(3 файла) иweb/src/routes/settings/heartbeat/(3 файла). Пунктыcron,heartbeatубраны изSettingsSidebar.svelte. Управление cron/heartbeat осталось только в/agents/{id}/cronи/agents/{id}/heartbeat(как и должно быть — сущности привязаны к агенту). - Категория B2 — Skills: разделение уровней.
settings/skills/+page.svelteупрощён: убрана матрица «навык × агент» (привязка управляется только из агента); оставлен CRUD глобального каталога. В/agents/{id}/skills/+page.svelteиконка «Редактировать» убрана для глобальных и встроенных навыков (рендерится только для индивидуальныхskill_owner_agent_id === agentId). Страница/agents/{id}/skills/{skillId}для глобальных/builtin навыков теперь показывает read-only превью (имя, описание, метаданные, триггеры, контент в<pre>) вместо формы редактирования. - Баг ownership-check (найден
ocr review, критичный):isEditableInAgent/confirmRemoveSkill/removeSkillпроверялиskill_owner_agent_id !== nullбез сверки сagentId. Навык, принадлежащий другому агенту, ошибочно классифицировался как «редактируемый здесь» и при удалении хард-делетился черезapi.skills.delete. Исправлено: проверкаskill_owner_agent_id === agentIdво всех трёх точках; убрана unreachable-ветка!== undefined(тип поля —number | null). - Прочее из review: вынесен единый
parseSkillMetadatahelper (устранено дублирование JSON-парсинга междуinitialDataиparsedMeta), guard!isNaN(date.getTime())против «Invalid Date»,aria-labelна back-link, убран избыточный&& initialDataв read-only ветке. Вsettings/skills: пустойcatch {}вloadSkillsтеперь показывает ошибку;errorсбрасывается перед повторным delete. - Категория C — MCP: отдельный пункт навигации агента. Создан новый маршрут
/agents/{id}/mcp/+page.svelte— обёртка над переиспользуемымMcpPermissionsCard(loading черезPermissionsStore, своя кнопка save). Пунктmcpдобавлен в навигацию агента (+layout.svelte, группа «Агент», рядом сwebhooks). Вкладкаmcpубрана из/agents/{id}/permissions:'mcp'удалён изPermSectionKeyиSECTIONS(usePermissionTab.svelte.ts), import и ветка{:#else if tab.active === 'mcp'}удалены изpermissions/+page.svelte. Подключение серверов (stdio/SSE/HTTP, OAuth) осталось вsettings/mcp(как и должно быть по модели «подключение в settings, активация у агента»). - Категория D1 —
settings/agents→ только каталог. Модалка редактирования существующего агента удалена (редактирование — в/agents/{id}). Форма создания упрощена доname+description(убраныcontext_max_tokensиrealtime_extraction). Блок участников удален (управление — в/agents/{id}/members). - Функциональные регрессии (найдены
ocr review, исправлены): (1)context_max_tokens/realtime_extractionпосле удаления из settings нигде не редактировались — добавлена секция «Настройки контекста» в Профиль агента (/agents/{id}/+page.svelte, только дляcanEditAgent), сохранение черезapi.agents.update. (2) Удаление агента нигде не было доступно — добавлена секция «Опасная зона» в Профиль сConfirmModalи редиректом на/agentsпослеapi.agents.delete. - Прочее из review: error-баннер при ошибке создания был скрыт за
fixed inset-0оверлеем модалки — теперь дублируется внутри модалки рядом с кнопками;name/descriptionтриммятся передapi.agents.create. - Что НЕ менялось: audit в settings и в агенте (по решению — разные срезы); backend (Go); все остальные разделы settings и агента. 309 a11y-warnings в
svelte-check— pre-existing паттерны проекта (div+onclick-модалки,<label>безfor), не связанные с рефакторингом.