Commit Graph

793 Commits

Author SHA1 Message Date
Maxim Dolgolyov cbb6edf372 feat(sim-builder): фаза 6 — раздача классу, клон, шаблоны, привязка к программе (custom_sims) 2026-06-13 13:06:30 +03:00
Maxim Dolgolyov 1bee332ae1 feat(sim-builder): фаза 5 — каталог custom-sims в /lab (LabCustom: ленивая регистрация, секция, deep-link) 2026-06-13 12:48:21 +03:00
Maxim Dolgolyov a13c0b77fa feat(sim-builder): фаза 4 — редактор симуляций (sim-builder.html: панели, живое превью, save/publish) 2026-06-13 12:29:13 +03:00
Maxim Dolgolyov 572d479f12 feat(sim-builder): фаза 2 — физический интегратор (SimPhysics: гравитация/пружины/столкновения, drag тел) 2026-06-13 11:51:42 +03:00
Maxim Dolgolyov e51b57d9c7 feat(sim-builder): фаза 1 — графики (plot), drag-ручки, readout, векторы origin+dx/dy 2026-06-13 11:30:37 +03:00
Maxim Dolgolyov 4dd92f83a0 feat(sim-builder): фаза 0 — рантайм SimEngine + безопасный движок выражений + адаптер LabRegistry 2026-06-13 11:14:13 +03:00
Maxim Dolgolyov eca68e1a28 feat(labs): Фаза2 — измерительные инструменты (линейка + угломер)
LabMeasure (_measure.js): SVG-оверлей поверх сцены с pointer-events:none
(симуляция остаётся интерактивной), перетаскиваемые ручки. Линейка — длина
px + ≈ метры (PX_PER_M) + угол; угломер — угол при вершине с дугой.
Кнопка-тумблер в топбаре лаборатории. Самодостаточно, симуляции не трогает.
Этим Фаза 2 закрыта.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 11:13:41 +03:00
Maxim Dolgolyov 51fcb6e4b7 feat(labs): Фаза2 — сохранение/возобновление параметров симуляции
Поверх getState/applyState: в обычном режиме параметры активной симуляции
персистятся в localStorage (lab-sim-state-v1, дедуп, кап 8КБ, flush на pagehide)
и восстанавливаются при открытии. В embed/онлайн-уроке персист выключен —
состоянием управляет учитель. applyState обёрнут в try/catch (старые формы не ломают).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 11:07:14 +03:00
Maxim Dolgolyov 2067e6efb1 feat(labs): Фаза2 — сохранить кадр симуляции в «Мои материалы» + скачать PNG
Кнопки в топбаре лаборатории: снимок активного canvas → MaterialSave.image
(аплоад + kind:image в /api/materials) и «Скачать PNG». Захват — крупнейший
видимый canvas сцены. material-save.js подключён в lab.html.
(3D/WebGL-кадр может быть пустым без preserveDrawingBuffer — доработать позже.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 11:02:07 +03:00
Maxim Dolgolyov c4ca8bcae7 refactor(labs): Фаза0 фундамент — убрать мёртвый SimUtil, добавить LabPalette + SimBase
- Удалён _util.js (SimUtil): 0 использований во всех симуляциях (проверено),
  грузился впустую.
- LabPalette (_palette.js): единый источник цветов canvas + PX_PER_M вместо
  хардкода в каждом файле; задел под светлую тему.
- SimBase (_simbase.js): опциональная база жизненного цикла (DPR-fit + RAF
  play/pause/reset/destroy). Существующие симуляции не трогаются; «дробовик»
  остаётся fallback. Адаптация — постепенно, по мере правок (нет фронт-тестов).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 10:52:27 +03:00
Maxim Dolgolyov c0442d6803 feat(labs): задания ещё для 12 симуляций + прогресс плана
LAB_TASKS расширен: waves, circuit, radioactive, heatengine, hydrostatics,
isoprocess, probability, emfield, geometry, photosynthesis, celldivision (+
ранее quadratic/trigcircle/normaldist/projectile/pendulum) — итого 17.
Только валидные single-concept id (мульти-модули molphys/chemistry пропущены).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 10:44:28 +03:00
Maxim Dolgolyov 15282c50b3 feat(labs): Фаза1 — фреймворк учебных заданий (LabTasks)
Превращает песочницы в учебные инструменты: задание → ответ числом с допуском →
проверка/подсказка/прогресс (по образцу race.js, но переиспользуемо).
- _tasks.js: LabTasks (панель, прогресс-точки, проверка с tol, KaTeX в условии).
- Интеграция в loadTheory (одна точка): панель «Задания» дописывается в теорию,
  бейдж на кнопке теории когда задания есть.
- Данные на 5 симуляций: quadratic, trigcircle, normaldist, projectile, pendulum.
Проверка на клиенте (учебные, не оценочные). XP — отдельным инкрементом.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 10:42:17 +03:00
Maxim Dolgolyov 28db2de74f feat(labs): Фаза0 — эконом-режим FX + выбор симуляции из списка в редакторе
План улучшения симуляций — plans/simulations-improvement/README.md.
- LabFX: reduced-motion/эконом-режим (prefers-reduced-motion + тумблер
  localStorage labfx-economy). Тряска отключается, частицы ×0.25 — доступность
  и экономия на слабых устройствах сразу для всех ~50 симуляций. Кнопка-тумблер
  в lab.html рядом со звуком.
- lesson-editor: блок «Симуляция» — выпадающий список из /api/lab/sims
  (сгруппирован по предметам) вместо сырого ввода simId; неизвестный id не
  теряется, помечается «(не найдена)». Закрывает хрупкую вставку в урок.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 10:33:50 +03:00
Maxim Dolgolyov 57eae767bf style(command-center): выровнять токены под дизайн-систему ls.css
Командный центр форкал токены со своими значениями → визуально не совпадал
с системой. Выровнено: --surface стекло rgba(255,255,255,.82)+backdrop-filter
(было сплошной #fff), --border .10 (было .08), --border-2 .20 (было .16),
тени → системные --shadow/--shadow-h, радиусы --r-sm 8 / --r 12 (было 10/14).
Карточки (acc-card/kpi/hcard/qbtn/tb-icon) теперь матовое стекло как везде.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 23:39:34 +03:00
Maxim Dolgolyov 1c20bafd05 style(library): аккуратная карточка файла — действия отдельным рядом
Раньше метаданные и «Открыть»+3 иконки делили одну строку → на ширине грида
дата переносилась криво, кнопки наезжали. Теперь подвал колонкой: метаданные
строкой, действия — отдельным рядом (Открыть растягивается, иконки — компактные
квадраты 34×34 с лёгким фоном). Без наложений и кривых переносов.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 23:32:43 +03:00
Maxim Dolgolyov ad7265d553 feat(flashcards): Anki-стиль интервалов — кнопки различаются
Раньше на новой карте Снова/Трудно/Знаю/Легко все давали 1 день (чистый SM-2:
оценка влияла только на ease factor). Теперь интервал зависит от оценки:
новая карта Легко=4д (остальные 1д), на повторах Трудно ×1.2 / Знаю ×ef /
Легко ×ef×1.3 (easy-бонус). Серверный sm2() и клиентское превью fcNextInterval
синхронны — проверено 0 расхождений на 256 комбинациях.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 23:27:40 +03:00
Maxim Dolgolyov cd9f2d5efa feat(flashcards): клик-для-редактирования вместо дубля поле+превью
Карточка по умолчанию показывает ОТРИСОВАННЫЙ текст (формулы KaTeX красиво),
клик → textarea с сырым LaTeX для правки, blur → сохранение + переотрисовка.
Никакого дублирования (как в Anki). Кнопка «ƒₓ Формула» синхронизирует
отрисовку после вставки (модалка снимает фокус с поля → fcEndEdit).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 23:19:43 +03:00
Maxim Dolgolyov 39aa283daf feat(flashcards): KaTeX-превью формул в редакторе карточек
В редакторе текст карточки — в textarea (сырой LaTeX рендерить нельзя), поэтому
$a^2+b^2=c^2$ показывался текстом. Под каждым полем добавлено живое превью
mathHtmlFC: формулы рендерятся KaTeX, обновляются на вводе, скрыты если формул нет.
В режиме изучения рендер уже был.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 23:12:33 +03:00
Maxim Dolgolyov 9dd3522869 feat(flashcards): ИИ-генерация карточек по теме/тексту с предпросмотром в текущую колоду 2026-06-12 23:06:08 +03:00
Maxim Dolgolyov 21cea72874 style/security: эмодзи→SVG, safeUrl в ассистенте, prefs в localStorage (Спринт3)
- Убраны эмодзи (правило: только inline SVG .ic): classes.html 🃏→layers,
  collection-rb.html →star, pet.html 😋/😢→текст (textContent не держит SVG).
- assistant.js: safeUrl() на динамических href (FAQ/поиск/RAG/правила) —
  блокирует javascript:/data:, пропускает /… и https://….
- LS.prefs: персистентность через localStorage (раньше sync был отключён,
  настройки терялись при перезагрузке). Грузим синхронно + flush на pagehide.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 23:00:49 +03:00
Maxim Dolgolyov 9d622454d6 feat(my-materials): папки в виде рейла слева + drag-and-drop перемещение карточек 2026-06-12 22:53:18 +03:00
Maxim Dolgolyov 107ca2220c feat(imggen): feature-gate «imggen» с контролем по классам/ученикам (Спринт2)
- server: requireFeature('imggen') на /api/imggen (глобальный гейт).
- imggenController: enforcement через isFeatureEnabledForUser в status()/generate()
  — учитывает глобальный флаг + оверлей класса + free_student (403 если выкл.).
- admin «games/features» + free-student: тумблер «Генерация картинок (ИИ)».
- classes.html: переключатель модуля imggen в настройках класса (per-class).
Дефолт — ON (opt-in disable), как у остальных фич. Проверено на features-движке.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 22:15:54 +03:00
Maxim Dolgolyov 5a57812dab fix(my-materials): рендер KaTeX в заметках (формулы $$…$$) 2026-06-12 21:57:01 +03:00
Maxim Dolgolyov 95fee1d8c5 fix(security): убрать stored-XSS в блоке columns урока (Спринт1 #4)
Блок columns хранит rich-HTML из мини-редактора и рендерился сырым в innerHTML
(единственный неэкранированный блок) — учитель мог внедрить <img onerror>/script,
исполняемый у каждого ученика (кража JWT из localStorage). Добавлен санитайзер
sanitizeRichHtml (инертный template + вырезание on*/script/iframe/javascript:),
сохраняет форматирование, но блокирует исполнение.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 21:56:46 +03:00
Maxim Dolgolyov 5d3db90b5d perf(classroom): инкрементальный поллинг доски, картинки в файлы, ретеншн
#1 Студенческий поллинг: вместо полной перезагрузки доски каждые 2с —
   лёгкая сигнатура страницы (?meta=1 → maxSeq+count). Если доска совпадает
   с сервером (обычный случай при живом WS) — ничего не грузим. Полная
   перезагрузка только при расхождении. Счёт подтверждённых штрихов — по
   положительным id (без bookkeeping).
#2 Картинки-штрихи выносятся в файлы /uploads/classroom (вместо base64 в БД):
   меньше БД и payload поллинга. Имя с префиксом sessionId.
#5 Ретеншн: classroom-cleanup удаляет штрихи+файлы завершённых сессий старше
   N дней (app_settings.classroom_retention_days, по умолч. 30; 0 = выкл),
   историю/чат/посещаемость не трогает. Планировщик в server.js.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 13:02:26 +03:00
Maxim Dolgolyov ddc260e114 feat(admin): тумблер вкл/выкл генерации картинок
Главный выключатель в разделе «Генерация картинок» (флаг on в конфиге,
независим от наличия токена). Выключено → /api/imggen отдаёт 503
«временно выключена». Админ-тест работает и при выключенном тумблере
(generateImage проверяет только наличие конфига). Бейдж различает
«Включена / Выключена / Не настроена».

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 12:00:05 +03:00
Maxim Dolgolyov 88651d85ab feat(admin): раздел «Генерация картинок» — управление провайдером и тест
Новый админ-раздел: Account ID / токен (маскируется) / модель Cloudflare,
лимиты (пауза, дневной лимит) из БД, статистика, кнопка теста генерации.
imggenController: лимиты и модель теперь из конфига, поддержка JSON и
бинарного ответа CF, переиспользуемые generateImage() и stats().
Бэкенд GET/PUT /api/admin/imggen + POST /api/admin/imggen/test (admin-only).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 11:37:47 +03:00
Maxim Dolgolyov c75e331c02 fix(lesson-editor): рендер формул KaTeX в ячейках таблиц в превью
Превью раньше рендерило KaTeX только в блоках .pv-formula — формулы $...$
в ячейках таблиц показывались сырыми, хотя у ученика (lesson.html) они
рендерятся. Таблица-превью получила класс .pv-table и попадает в KaTeX-проход.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 11:16:47 +03:00
Maxim Dolgolyov 6fcdafed50 feat(imggen): фон питомца, обложки курсов, аватары и доска через ИИ
Питомец: кастомный фон (миграция 068 pet_bg_custom, POST /api/pet/bg/custom,
  карточка «Свой фон (ИИ)» в гардеробной, применение картинкой).
Курсы: обложка-картинка (миграция 069 cover_image, генерация в модалке
  редактирования, рендер вместо эмодзи).
Аватар: кнопка «Сгенерировать (ИИ)» в загрузке → кадрирование → модерация.
Доска (classroom): кнопка-инструмент «Сгенерировать картинку (ИИ)».

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 10:59:26 +03:00
Maxim Dolgolyov d6faf6b22c feat(imggen): генерация картинок ИИ (FLUX.1) — ассистент, флэшкарты, редактор уроков
Бэкенд /api/imggen (status/generate, CF Workers AI, cooldown+дневной лимит).
Переиспользуемый модал LS.imagePromptModal (js/imggen.js).
Квантик: режим «Нарисовать» в чате (inline).
Флэшкарты: кнопка «ИИ» в блоке картинки карточки.
Редактор уроков: кнопка «Сгенерировать» в блоке изображения.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 10:41:59 +03:00
Maxim Dolgolyov b9f70ff88b feat(assistant): учитель видит профиль ученика для Квантика (агрегат, без заметок)
GET /assistant/student-profile/:id (teacher/admin): производный профиль ученика
— слабые предметы, трудные темы экзамена, цель, серия. Сырые заметки НЕ
отдаются (приватны). Доступ: свой класс или «Мои ученики»; чужой → 403; админ
— любой (проверено). На /my-students — кнопка «Профиль» с поповером. Ученику в
панели памяти уже написано «учитель видит лишь общие слабые темы».

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 23:16:07 +03:00
Maxim Dolgolyov 9cfb7d1c3b feat(assistant): долгая память об ученике (персонализация)
Производный профиль (без LLM): слабые предметы, трудные темы экзамена,
цель/дата, серия — из test_sessions/exam_attempts/exam_user_plan. Подмешивается
в системный промпт → персональные ответы; такие не кэшируются глобально.
Заметки: таблица assistant_memory + фоновый LLM-экстрактор (дросселирован),
дедуп + лимит 15. Панель ученика «Что я о тебе помню» (профиль + заметки,
удаление). Админ-тумблер. API GET/DELETE /assistant/memory (/:id под
authMiddleware, владелец проверяется в хендлере).

Заодно: сверка стабильного baseline route-auth 56→66 (долг от branch-merge,
хук не идёт на merge) — новых незащищённых маршрутов не добавлено.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 22:51:04 +03:00
Maxim Dolgolyov 5417083f88 feat(pet): большое наполнение кастомизации контентом
Цвета 6→11 (розовый/оранжевый/бирюза/лайм/индиго). Узоры 5→8
(сердечки/звёздочки/клетка). Аксессуары 11→18 + новая зона «В лапах»
(бини, нимб, монокль, медаль, серёжки, палочка, шарик). Разблокировка за
учёбу: нимб (8 достижений), медаль (30 тестов). Фоны 7→11
(класс/лаборатория/зима/радуга) с градиентами и частицами. Новая вкладка
«Образы» — 4 готовых набора (Учёный/Волшебник/Чемпион/Милашка) применяют
аксессуары+узор+цвет одним кликом.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 14:52:58 +03:00
Maxim Dolgolyov 1ed9dbcacf feat(pet): подтверждение покупки фона в гардеробной
Перед платной покупкой фона — диалог LS.confirm («Купить «X» за N монет?»)
+ предпроверка баланса (тост, если монет не хватает). Применение уже
купленных/стандартного — без подтверждения.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 14:40:04 +03:00
Maxim Dolgolyov 4c0fcc88f0 fix(pet): гардеробная читаема на светлой теме (не сливается)
База дизайна светлая (--surface≈белый), а заливки/границы модалки были
белым-альфа → исчезали. Переведено на тёмные токены: --border вместо
white-alpha, тёмные тинты для карточек зон/кнопок/таб-бара, надетый тайл —
сплошной фиолетовый с белым текстом, имя/счётчик — насыщенные цвета.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 14:37:35 +03:00
Maxim Dolgolyov 98c3775c9e style(pet): зоны гардероба — отдельные карточки (чёткое разграничение)
Тонкие линии-разделители заменены на карточки зон (фон + рамка + отступы),
тулбар «Надето/кнопки» отделён отступом. Блоки больше не сливаются.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 14:29:16 +03:00
Maxim Dolgolyov 442c748e81 style(pet): чип монет — сплошной золотой бейдж с тёмным текстом (контраст)
Золотой текст на бледно-золотом фоне сливался. Теперь яркий золотой
градиент + тёмно-коричневый текст/иконка — читается на любом фоне.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 14:27:52 +03:00
Maxim Dolgolyov c99731a6b2 style(pet): премиальный визуал гардеробной
Освещённая ниша превью (верхний свет + фиолетовый пьедестал-glow снизу,
краевая виньетка, объёмная тень), имя градиентом, чип баланса монет в шапке.
Контролы: вкладки с градиентной активной, аксессуар-тайлы с подъёмом и
glow (надетое — градиент-заливка), крупные цветовые кружки с кольцом,
узор-плитки и фон-карточки с подсветкой/подъёмом и активным кольцом.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 14:24:56 +03:00
Maxim Dolgolyov 3760238e05 fix(pet): превью в гардеробной строго по центру
Размер стоял на самом <svg> (width:86%), а его родитель #wr-preview-svg —
пустой div без заданной ширины → процент считался от неопределённой ширины
и питомец смещался. Размер задан обёртке (#wr-preview-svg width:82% от сцены),
svg внутри 100%; сцена — flex-центрирование. Парение перенесено на обёртку.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 14:20:56 +03:00
Maxim Dolgolyov a6ca3f0327 style(pet): центрирование превью в гардеробной + солиднее вид
Превью больше не съезжает вверх: place-items:center + фикс-размер 86%
(вместо flex + height:auto). Добавлено мягкое парение питомца, drop-shadow,
внутренняя виньетка и фиолетовая рамка сцены; модалка шире, с градиентной
шапкой и разделителем; стадия эволюции — в пилюле.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 14:18:55 +03:00
Maxim Dolgolyov ac618b3fb1 feat(pet): кастомизация вынесена в модалку-«гардеробную» с живым превью
Кнопка «Нарядить» на сцене открывает модалку: слева крупное живое превью
питомца (обновляется мгновенно при любой смене — аксессуар/цвет/узор/фон),
справа вкладки Аксессуары/Цвет/Узор/Фон. Превью-сцена отражает выбранный
фон. Закрытие крестиком, кликом по фону, Esc. Инлайн-карточка убрана со
страницы; все рендереры идут через общий paintPet (сцена + превью).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 14:15:59 +03:00
Maxim Dolgolyov cac352b355 fix(pet): аккуратная раскладка гардероба (зоны — строки, не слипаются)
Контейнер #pet-accessories наследовал старый .pet-accessories
(display:flex center) → панель действий и зоны сваливались в один поток.
Снял класс + #pet-accessories{display:block}: тулбар с разделителем сверху,
каждая зона — отдельная строка (подпись справа фикс-ширины + плитки),
тонкие разделители, иконки на кнопках «Случайный образ»/«Снять всё».

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 14:08:19 +03:00
Maxim Dolgolyov 7db337eccd style(pet): полностью переработан вид блока «Кастомизация»
Премиальная карточка с градиентом и заголовком-иконкой; сегментные вкладки
с иконками и подсветкой активной; аксессуары — тайлы по зонам с галочкой
вместо текстовых чипов; узор — крупные превью-плитки с подписью; фон —
увеличенные карточки; плавное появление панелей.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 14:05:23 +03:00
Maxim Dolgolyov 6880e1a55a feat(pet): прокачанный блок кастомизации + много контента
Контент:
- Узор тела (новая ось): пятнышки, полоски, градиент, галактика (клип по
  силуэту, рендер в обоих рендерерах) + миграция pet_pattern + /api/pet/pattern.
- +4 аксессуара: колпак, тёмные очки, шарф, цветок (все бесплатные).
- +3 фона: Сияние, Леденец, Сакура (CSS-градиенты + частицы: звёзды/пузыри/лепестки).

UI кастомизации:
- Вкладка «Узор» со свотчами-превью.
- Гардероб по зонам (Голова/Лицо/Шея/Уши/Акцент) + счётчик надетого,
  кнопки «Случайный образ» и «Снять всё».
- Фон — инлайн-сетка с превью/ценой/балансом (как раньше).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 13:58:12 +03:00
Maxim Dolgolyov 152291aec8 feat(pet): единый UI кастомизации (аксессуары/цвет/фон) + пояснение эволюции
Вынес кастомизацию из тесного блока сцены в отдельную карточку с вкладками
«Аксессуары · Цвет · Фон». Фон теперь выбирается инлайн (сетка превью с
ценой/статусом, покупка/выбор за монеты) вместо незаметной кнопки-модалки.
Добавил легенду эволюции: облик (уши/антенны/крылья/аура…) растёт с XP по
уровням — объясняет «откуда крылья». Рендереры цвета/гардероба не тронуты
(те же id), бэкенд без изменений.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 13:44:09 +03:00
Maxim Dolgolyov 7bf1da94e4 feat(pet): гардероб — выбор аксессуаров + новые украшения
Аксессуары больше не навешиваются авто по уровню — теперь разблокируются
и НАДЕВАЮТСЯ по выбору (один на слот). Новые: шапочка выпускника, наушники,
бабочка (бесплатные — доступны даже при 0 XP). Сохранены цилиндр/корона/очки/
звезда с прежними порогами; дефолт повторяет старый вид (без сюрпризов).

Бэкенд: миграция pet_equipped, каталог ACCESSORY_CATALOG + /api/pet/equip
(валидация разблокировки и слотов). Рендер аксессуаров строго по equipped —
в обеих копиях (pet.html и pet-sprite.js для дашборда). UI гардероба на /pet.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 13:37:45 +03:00
Maxim Dolgolyov 13d91714d4 docs(teacher-guide): актуализация под текущее состояние системы
- Учебники (11.1): вместо 2 курсов — полный каталог (Матем 5-6, Алгебра/
  Геометрия 7-11, Физика 7-11, Химия 7-9).
- Новые главы: 18 Квантик-ассистент, 19 Флэшкарты, 20 Ещё модули
  (Карта знаний, Теория, Кроссворд, Виселица, Красная книга, Коллекция,
  Мои материалы, Магазин, Родители) + админ-глава A7 Провайдеры ИИ.
- Экзамен (12.3): хаб «Подготовка к экзамену 9» (Темы/Варианты/Практика/
  Пробник) + Квантик-подсказки; ссылка на /exam-prep/math9.
- Фикс сломанных ссылок навигации (s-14-4, s-16-3) + полные списки feature-flags.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 21:53:54 +03:00
Maxim Dolgolyov b9d63b0776 fix(assistant): не обрезать пошаговые решения посреди формулы
Лимит ответа был 420 токенов — длинное решение обрывалось внутри $$…$$,
незакрытый блок показывался сырым LaTeX. Теперь лимит по режиму
(ответ 1200, проверка 900, подсказка 320), а рендер отбрасывает
незакрытый хвост $$ (ставит «…») вместо сырого кода.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 21:33:07 +03:00
Maxim Dolgolyov 6e0a00fd8b feat(assistant): авто-получение лимитов моделей для любого провайдера
Новый GET /admin/assistant/models: тянет список моделей провайдера с лимитами
(OpenAI-совместимый /models: context_length+max_completion_tokens+pricing;
нативный Google generativelanguage: inputTokenLimit/outputTokenLimit) и кэширует
лимиты текущей модели на провайдере. Карточка показывает лимиты у ВСЕХ провайдеров
(не только Kilo), для отсутствующих — фоновая авто-подгрузка. В форме — кнопка
«Загрузить модели провайдера» с выбором модели и её лимитами. Так Gemini и любые
новые модели получают лимиты автоматически.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 21:28:34 +03:00
Maxim Dolgolyov f1f79335ec fix(assistant): длинные формулы не обрезаются + лимиты моделей в админке
Рендер ответа: display-формулы KaTeX прокручиваются по горизонтали
(overflow-x:auto), пузырь ассистента во всю ширину, панель шире (380px) —
длинные выражения больше не режутся по правому краю.

Админка: к моделям Kilo добавлены ctx/out (из /models); на карточке Kilo
показывается «контекст N · ответ до M токенов · бесплатно».

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 21:18:50 +03:00