feat(assistant): авто-переиндексация системы при смене флагов + пометка «без описания»
- updateFeatures вызывает _autoReindexSystem(): при тоггле любого модуля снимок знаний о системе обновляется сам (только если уже индексировали — не создаёт KB на пустом месте). Кнопку жать больше не нужно после смены флагов. - getAssistant отдаёт systemUndoc — модули с фича-флагом, но без записи в каталоге; админ-карточка показывает «Без описания: …» (пассивная подсказка, без пушей), чтобы при желании дополнить «Описание системы». Проверено: авто-реиндекс (не создаёт пустой / обновляет существующий) + undoc 3/3. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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'),
|
||||
});
|
||||
|
||||
@@ -148,7 +148,10 @@
|
||||
'<div class="perm-label"><i data-lucide="boxes" style="width:14px;height:14px;vertical-align:-2px;margin-right:6px"></i>Знания о системе для Квантика</div>' +
|
||||
'<div class="perm-desc">Снимок включённых модулей + каталог разделов + ваше описание индексируются, чтобы Квантик знал актуальное состояние платформы и не предлагал отключённое. Запускайте после смены фича-флагов.</div>' +
|
||||
'<textarea id="asst-sysdoc" rows="5" placeholder="Опишите модули/правила платформы своими словами (необязательно) — это тоже попадёт в знания Квантика…" style="' + IN + ';resize:vertical">' + esc(cfg.systemDoc || '') + '</textarea>' +
|
||||
'<div style="display:flex;gap:8px;flex-wrap:wrap;align-items:center"><button id="asst-index-sys" class="asst-ib primary">Сохранить и проиндексировать систему</button><span id="asst-sysidx-st" style="font-size:.78rem;color:#8a94a6">' + esc(_skInfo) + '</span></div>';
|
||||
'<div style="display:flex;gap:8px;flex-wrap:wrap;align-items:center"><button id="asst-index-sys" class="asst-ib primary">Сохранить и проиндексировать систему</button><span id="asst-sysidx-st" style="font-size:.78rem;color:#8a94a6">' + esc(_skInfo) + '</span></div>' +
|
||||
((cfg.systemUndoc && cfg.systemUndoc.length)
|
||||
? '<div style="font-size:.76rem;color:#b45309;background:rgba(245,158,11,.1);border:1px solid rgba(245,158,11,.3);border-radius:8px;padding:6px 10px">Без описания (только статус вкл/выкл): <b>' + cfg.systemUndoc.map(esc).join(', ') + '</b>. Опишите их в поле выше, чтобы Квантик отвечал по ним подробно.</div>'
|
||||
: '');
|
||||
host.appendChild(skb);
|
||||
|
||||
if (window.lucide) lucide.createIcons();
|
||||
|
||||
Reference in New Issue
Block a user