From 2506a7280615e54cd9df6dc1791d530370c47f77 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Wed, 24 Jun 2026 14:52:42 +0300 Subject: [PATCH] =?UTF-8?q?feat(assistant):=20=D0=BA=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D1=82=20=D1=83=D1=80=D0=BE=D0=BA=D0=B0/?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=9A=D0=B2=D0=B0=D0=BD=D1=82=D0=B8=D0=BA=D0=B0=20(?= =?UTF-8?q?=D1=84=D0=B8=D1=87=D0=B0=202/6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Квантик теперь знает, где находится ученик: - pageHint() — лёгкий ситуативный контекст («ученик на странице учебник: «Физика 7, §12»») подмешивается к ЛЮБОМУ свободному вопросу автоматически - getPageContext() расширен с учебника на уроки (theory/course/lesson): «Объяснить этот урок / Конспект урока / Флешкарты из урока» - метки чипов адаптируются (параграф/урок) Бэкенд уже принимал context (pageCtx) — правок не потребовалось. Co-Authored-By: Claude Opus 4.8 (1M context) --- frontend/js/assistant.js | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/frontend/js/assistant.js b/frontend/js/assistant.js index 2424781..9f4bf3f 100644 --- a/frontend/js/assistant.js +++ b/frontend/js/assistant.js @@ -480,12 +480,35 @@ var h = sec.querySelector('.sec-h'); var title = (h && h.textContent.trim()) || (document.title || 'Параграф').split('·')[0].trim(); var text = (sec.textContent || '').replace(/\s+/g, ' ').trim().slice(0, 3500); - if (text.length > 40) return { title: title, text: text }; + if (text.length > 40) return { title: title, text: text, kind: 'textbook' }; + } + } + if (PAGE === 'theory') { + var c = document.querySelector('.lesson-content, .lsn-content, .lesson-body, #lesson-content, article.lesson, .course-lesson, .lesson-view'); + if (c) { + var lt = document.querySelector('h1, .lsn-title, .lesson-title'); + var ltitle = (lt && lt.textContent.trim()) || (document.title || 'Урок').split('·')[0].trim(); + var ltext = (c.textContent || '').replace(/\s+/g, ' ').trim().slice(0, 3500); + if (ltext.length > 60) return { title: ltitle, text: ltext, kind: 'lesson' }; } } } catch (e) {} return null; } + // Лёгкий ситуативный контекст для ЛЮБОГО вопроса — где сейчас ученик (заголовок+раздел). + var PAGE_LABEL = { textbook: 'учебник', theory: 'урок/курс', exam: 'экзамен или тест', flashcards: 'флешкарты', + lab: 'лаборатория', homework: 'домашние задания', dashboard: 'главная', knowledge: 'карта знаний', + library: 'библиотека', analytics: 'аналитика', gradebook: 'журнал', qbank: 'банк вопросов' }; + function pageHint() { + try { + var label = PAGE_LABEL[PAGE] || ''; + var hEl = document.querySelector('.sec.active .sec-h, h1, .lsn-title, .lesson-title, .page-title'); + var title = (hEl && hEl.textContent.trim()) || (document.title || '').split('·')[0].split('|')[0].trim(); + title = title.replace(/\s+/g, ' ').slice(0, 120); + if (!title && !label) return ''; + return 'Ученик сейчас на странице платформы' + (label ? ' («' + label + '»)' : '') + (title ? ': «' + title + '»' : '') + '. Учитывай это, если вопрос относится к материалу страницы.'; + } catch (e) { return ''; } + } /* ── «Спроси Квантика» ───────────────────────────────────────────────── */ var SUGGESTIONS = ['Как вырезать кусок учебника?', 'Как создать карточки?', 'Как начать тест?', 'Объясни теорему Пифагора', 'Где мои домашние задания?', 'Как включить тёмную тему?']; @@ -508,11 +531,13 @@ var MODE_PH = { answer: 'Спроси что угодно: «объясни…», «как…»', hint: 'Задача, по которой нужна подсказка…', check: 'Вставь своё решение — проверю…', draw: 'Опиши картинку: «кот-учёный, плоская иллюстрация»' }; function openAsk(prefill) { var sel = _lastSel, pc = getPageContext(); + var noun = pc && pc.kind === 'lesson' ? 'этот урок' : 'этот параграф'; + var noun2 = pc && pc.kind === 'lesson' ? 'урока' : 'параграфа'; var ctxBtns = ''; if (sel) ctxBtns += ''; - if (pc) ctxBtns += '' + - '' + - ''; + if (pc) ctxBtns += '' + + '' + + ''; var sug = (_role === 'teacher' || _role === 'admin') ? TEACHER_SUGGESTIONS : SUGGESTIONS; var chips = '
' + ctxBtns + sug.map(function (q) { return ''; }).join('') + '
'; @@ -534,7 +559,8 @@ var mode = 'answer'; renderChat(chatEl); if (_chat.length) chipsEl.style.display = 'none'; - function go(q, context, m) { if (chipsEl) chipsEl.style.display = 'none'; inp.value = ''; send(q, context, chatEl, m || mode); } + // свободный вопрос (context не задан явно) → подмешиваем лёгкий ситуативный контекст страницы + function go(q, context, m) { if (chipsEl) chipsEl.style.display = 'none'; inp.value = ''; if (context == null) context = pageHint() || undefined; send(q, context, chatEl, m || mode); } inp.addEventListener('keydown', function (e) { if (e.key === 'Enter') go(inp.value); }); bubble.querySelectorAll('.asst-mode').forEach(function (b) { b.addEventListener('click', function () {