From 1915026bff8ba43bf735e5134d4963d39572f4e9 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Wed, 24 Jun 2026 21:34:43 +0300 Subject: [PATCH] =?UTF-8?q?feat(assistant):=20=D0=B0=D0=B2=D1=82=D0=BE-?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B8=D0=BD=D0=B4=D0=B5=D0=BA=D1=81?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC?= =?UTF-8?q?=D1=8B=20=D0=BF=D1=80=D0=B8=20=D1=81=D0=BC=D0=B5=D0=BD=D0=B5=20?= =?UTF-8?q?=D1=84=D0=BB=D0=B0=D0=B3=D0=BE=D0=B2=20+=20=D0=BF=D0=BE=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D0=BA=D0=B0=20=C2=AB=D0=B1=D0=B5=D0=B7=20=D0=BE?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D1=8F=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - updateFeatures вызывает _autoReindexSystem(): при тоггле любого модуля снимок знаний о системе обновляется сам (только если уже индексировали — не создаёт KB на пустом месте). Кнопку жать больше не нужно после смены флагов. - getAssistant отдаёт systemUndoc — модули с фича-флагом, но без записи в каталоге; админ-карточка показывает «Без описания: …» (пассивная подсказка, без пушей), чтобы при желании дополнить «Описание системы». Проверено: авто-реиндекс (не создаёт пустой / обновляет существующий) + undoc 3/3. Co-Authored-By: Claude Opus 4.8 (1M context) --- backend/src/controllers/adminController.js | 18 ++++++++++++++++++ frontend/js/admin/sections/assistant.js | 5 ++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/backend/src/controllers/adminController.js b/backend/src/controllers/adminController.js index 301c4f6..1c4ef12 100644 --- a/backend/src/controllers/adminController.js +++ b/backend/src/controllers/adminController.js @@ -556,6 +556,7 @@ function updateFeatures(req, res) { invalidateGamificationCache(); } catch { /* defensive — shouldn't fail */ } } + _autoReindexSystem(); // снимок «знаний о системе» подстраивается под новые флаги (если уже индексировали) res.json({ ok: true }); } @@ -1024,6 +1025,22 @@ function buildSystemKb() { return chunks; } +// Тихая авто-переиндексация (вызывается при смене фича-флагов). Не создаёт KB, +// если админ ещё ни разу не индексировал — только обновляет существующий снимок. +function _autoReindexSystem() { + try { + if (!_aset('assistant_system_kb')) return; + db.prepare("INSERT OR REPLACE INTO app_settings (key, value) VALUES ('assistant_system_kb', ?)").run(JSON.stringify(buildSystemKb())); + db.prepare("INSERT OR REPLACE INTO app_settings (key, value) VALUES ('assistant_system_kb_at', ?)").run(new Date().toISOString()); + } catch (e) {} +} + +// Модули с фича-флагом, но без записи в каталоге (нет «красивого» описания) — подсказка админу. +function _undocumentedModules() { + try { const known = new Set(MODULE_CATALOG.map(m => m.key).filter(Boolean)); return Object.keys(_featFlags()).filter(k => !known.has(k) && k !== 'assistant'); } + catch (e) { return []; } +} + /* POST /api/admin/assistant/index-system — пересобрать знания о системе */ function indexSystem(req, res) { try { @@ -1077,6 +1094,7 @@ function getAssistant(_req, res) { systemDoc: _aset('assistant_system_doc') || '', systemKbCount: (() => { try { return (JSON.parse(_aset('assistant_system_kb') || '[]') || []).length; } catch (e) { return 0; } })(), systemKbAt: _aset('assistant_system_kb_at') || null, + systemUndoc: _undocumentedModules(), chunks, usage, usage30, feedback, failover, presets: ASSISTANT_PRESETS, kiloModels: _kiloModels(), kiloModelsCustom: !!_aset('assistant_kilo_models'), }); diff --git a/frontend/js/admin/sections/assistant.js b/frontend/js/admin/sections/assistant.js index 565a004..d87c940 100644 --- a/frontend/js/admin/sections/assistant.js +++ b/frontend/js/admin/sections/assistant.js @@ -148,7 +148,10 @@ '
Знания о системе для Квантика
' + '
Снимок включённых модулей + каталог разделов + ваше описание индексируются, чтобы Квантик знал актуальное состояние платформы и не предлагал отключённое. Запускайте после смены фича-флагов.
' + '' + - '
' + esc(_skInfo) + '
'; + '
' + esc(_skInfo) + '
' + + ((cfg.systemUndoc && cfg.systemUndoc.length) + ? '
Без описания (только статус вкл/выкл): ' + cfg.systemUndoc.map(esc).join(', ') + '. Опишите их в поле выше, чтобы Квантик отвечал по ним подробно.
' + : ''); host.appendChild(skb); if (window.lucide) lucide.createIcons();