feat(assistant): Ф2 онбординг-тур + проактив «продолжи урок»

Ф2: коачмарк-тур новичка по разделам (сайдбар + сам помощник), офер на
дашборде пока не пройден/не закрыт, повтор из приветствия и Assistant.tour().
activeLesson: контекст-эндпоинт отдаёт начатый незавершённый урок (как
«продолжить чтение»), добавлено проактивное правило «Продолжи …» → /course.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-04 16:30:34 +03:00
parent 3f8009c59d
commit 9baaca7f68
2 changed files with 133 additions and 6 deletions
+20 -3
View File
@@ -85,6 +85,22 @@ function pendingHomework(uid) {
} catch (e) { return { overdue: null, dueSoon: null }; }
}
function activeLesson(uid, role) {
// Начатый, но не завершённый урок (как «продолжить чтение» на дашборде).
try {
const pub = role === 'student' ? 'AND l.is_published = 1 AND c.is_published = 1' : '';
const row = db.prepare(`
SELECT l.id AS lessonId, l.title AS lessonTitle, l.course_id AS courseId, c.title AS courseTitle
FROM lesson_progress lp
JOIN lessons l ON lp.lesson_id = l.id
JOIN courses c ON l.course_id = c.id
WHERE lp.user_id = ? AND lp.completed = 0 ${pub}
ORDER BY lp.updated_at DESC LIMIT 1
`).get(uid);
return row || null;
} catch (e) { return null; }
}
/* ── GET /api/assistant/context ───────────────────────────────────────── */
function getContext(req, res) {
const uid = req.user.id;
@@ -97,10 +113,11 @@ function getContext(req, res) {
} catch (e) { /* table may be missing on a legacy instance */ }
res.json({
enabled: u ? u.assistant_enabled !== 0 : true,
enabled: u ? u.assistant_enabled !== 0 : true,
seen,
dueCards: dueCardsCount(uid),
homework: pendingHomework(uid),
dueCards: dueCardsCount(uid),
homework: pendingHomework(uid),
activeLesson: activeLesson(uid, req.user.role),
});
}