- Backend emits session id in SSE; frontend sets activeChat so follow-ups
reuse the same session (fixes fragmented history).
- sessions.summary column; messages past RECENT_LIMIT (10) are folded into
a persisted summary via a non-streaming model call.
- buildMessages sends system(+summary) + last 10 messages, bounding context
while preserving long-range memory.
- Tests: aiMessages (capping + summary injection).
Add react-markdown + remark-math + rehype-katex to render the AI's
markdown (headings, bold, lists, code, blockquotes, tables) and LaTeX
math ($H_2O$ etc.). ReactMarkdown escapes raw HTML, keeping the stored
message rendering safe from XSS. Styled via .markdown-body in Message.css.
Applied to assistant messages only; user text stays plain.
Persist the user message before streaming so the model receives the
current question (previously only the system prompt was sent on new
chats, causing canned greetings). Also fixes user message being lost
when the AI call errors.
- Replace Bauhaus aesthetic with Material Design 3-inspired layout
- Add working grade/subject/chapter dropdown selectors with placeholder options
- Fix ChatInput layout: remove position:absolute, use flex column flow
- Update sidebar with Material Icons, upgrade card, and clean hover states
- Add TopNav dropdowns with click-outside-to-close behavior
- Modernize message bubbles, action buttons, and welcome state
- Replace SVG icons with Material Symbols throughout
- Apply consistent BEM naming, CSS custom properties, no inline styles
- Add TopNav component with AI Chat, Study Guides, Progress tabs
- Refactor sidebar to include brand, new chat, subjects, chat history, settings
- Add message action buttons (Helpful, Note, Deeper) on assistant responses
- Enhance ChatInput with photo, mic attachment icons and AI disclaimer
- Improve welcome state with 2x2 suggested prompt grid
- Update global layout for proper sidebar offset (fix nav overlap)
- Remove obsolete Header component
- All styles: strict BEM naming, zero inline CSS, Paper Look theme