From 36eb0b980b8e3e15cceba3f1a5f1de5e68eefb76 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Wed, 24 Jun 2026 21:30:49 +0300 Subject: [PATCH] =?UTF-8?q?feat(assistant):=20=D0=B0=D0=B2=D1=82=D0=BE-?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D1=85=D0=B2=D0=B0=D1=82=20=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D1=8B=D1=85=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=84=D0=B8=D1=87=D0=B0-=D1=84=D0=BB=D0=B0?= =?UTF-8?q?=D0=B3=D0=B0=D0=BC=20=D0=B2=20=D0=B8=D0=BD=D0=B4=D0=B5=D0=BA?= =?UTF-8?q?=D1=81=D0=B0=D1=86=D0=B8=D0=B8=20=D1=81=D0=B8=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D0=BC=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit buildSystemKb теперь добавляет в снимок ЛЮБОЙ фича-флаг, которого нет в MODULE_CATALOG, как «функция X — вкл/выкл» (assistant-сам пропускается). Новый модуль с фича-флагом попадает в знания Квантика автоматически после «Проиндексировать», без правки кода. Для красивого описания/ссылки — запись в каталоге или поле «Описание системы». Проверено: авто-подхват 6/6, node --check OK. Co-Authored-By: Claude Opus 4.8 (1M context) --- backend/src/controllers/adminController.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/backend/src/controllers/adminController.js b/backend/src/controllers/adminController.js index 1a5197b..301c4f6 100644 --- a/backend/src/controllers/adminController.js +++ b/backend/src/controllers/adminController.js @@ -1013,6 +1013,12 @@ function buildSystemKb() { chunks.push({ title: m.name, text: `Модуль «${m.name}» — ${e ? 'ВКЛЮЧЁН и доступен' : 'ВЫКЛЮЧЕН (не предлагать ученику)'}. ${m.desc}${m.url ? ' Раздел: ' + m.url + '.' : ''}` }); }); chunks.push({ title: 'Доступные модули', text: `Сейчас на платформе ВКЛЮЧЕНЫ разделы: ${on.join(', ')}.` + (off.length ? ` ВЫКЛЮЧЕНЫ (о них не рассказывать и не предлагать): ${off.join(', ')}.` : '') }); + // авто-подхват НОВЫХ модулей: любой фича-флаг, которого нет в каталоге (assistant — это сам помощник, пропускаем) + const known = new Set(MODULE_CATALOG.map(m => m.key).filter(Boolean)); + Object.keys(flags).forEach(k => { + if (known.has(k) || k === 'assistant') return; + chunks.push({ title: 'Функция: ' + k, text: `Функция платформы «${k}» — ${flags[k] !== false ? 'ВКЛЮЧЕНА' : 'ВЫКЛЮЧЕНА (не предлагать)'}.` }); + }); const doc = _aset('assistant_system_doc'); if (doc && doc.trim()) doc.split(/\n{2,}/).map(s => s.trim()).filter(Boolean).forEach(p => chunks.push({ title: 'Описание системы', text: p.slice(0, 1500) })); return chunks;