feat: implement 33 nice-to-have features + fix 37 code review bugs

5 SDD batches archived:
- Batch 1: UI Polish (10 features, 14 tasks)
- Batch 2: Study System (8 features, 23 tasks)
- Batch 3: Infrastructure (5 features, 22 tasks)
- Batch 4: AI Advanced (5 features, 30 tasks) — RAG with @xenova/transformers
- Batch 5: Core Features (5 features, 19 tasks)

37 bugs fixed from comprehensive code review (11 CRITICAL, 12 HIGH, 14 MEDIUM/LOW):
- SSE streaming now works (event.token check)
- API keys no longer exposed via GET /api/models
- FTS5 injection sanitized
- DB backup/restore with admin auth
- Buddy mode wired (buddy_meta column)
- Exam auto-submit stale closure fixed
- CSS variables aligned with design tokens
- Progress data corruption fixed
- WebSocket protocol auto-detection
- Tests infrastructure completed (vitest + node:test)
This commit is contained in:
renato97
2026-06-08 18:18:47 -03:00
parent b7d1e7319f
commit 4ff4302a8c
79 changed files with 13667 additions and 389 deletions

View File

@@ -2,9 +2,9 @@
* Builds the system prompt for a conversation based on its type, user progress,
* available PDFs, and any attachment texts.
*/
function buildSystemPrompt(conversation, progressRows = [], pdfContents = [], attachmentTexts = []) {
function buildSystemPrompt(conversation, progressRows = [], pdfContents = [], attachmentTexts = [], ragChunks = [], difficulty = 'normal') {
if (conversation.type === 'main') {
return buildMainPrompt(progressRows, pdfContents, attachmentTexts);
return buildMainPrompt(progressRows, pdfContents, attachmentTexts, ragChunks, difficulty, conversation);
}
if (conversation.type === 'fork') {
return buildForkPrompt(conversation);
@@ -12,7 +12,7 @@ function buildSystemPrompt(conversation, progressRows = [], pdfContents = [], at
return '';
}
function buildMainPrompt(progressRows, pdfContents, attachmentTexts) {
function buildMainPrompt(progressRows, pdfContents, attachmentTexts, ragChunks, difficulty, conversation) {
let prompt = `Sos un tutor de estudio personal especializado. Tu objetivo es ayudar al usuario a aprender de forma eficiente y con seguimiento real de su progreso.
PROGRESO ACTUAL DEL USUARIO:
@@ -65,6 +65,29 @@ ${attachmentTexts.map((t, i) => `--- Adjunto ${i + 1} ---\n${t}`).join('\n\n')}
`;
}
if (ragChunks && ragChunks.length > 0) {
prompt += `
REFERENCE CONTEXT (fragmentos relevantes de PDFs):
${ragChunks.map((c, i) => `[${i + 1}] (PDF ${c.pdf_id}, chunk ${c.chunk_index})\n${c.content}`).join('\n\n')}
`;
}
if (difficulty && difficulty !== 'normal') {
const levelLabel = difficulty === 'easy' || difficulty === 'facil' ? 'FÁCIL' : difficulty === 'hard' || difficulty === 'dificil' ? 'DIFÍCIL' : 'NORMAL';
prompt += `
NIVEL: ${levelLabel} — adaptá la profundidad y el lenguaje al nivel.
`;
}
if (conversation && conversation.buddy_meta) {
const meta = typeof conversation.buddy_meta === 'string' ? JSON.parse(conversation.buddy_meta) : conversation.buddy_meta;
const a = meta.role_a || 'Estudiante A';
const b = meta.role_b || 'Estudiante B';
prompt += `
MODO COMPAÑERO DE ESTUDIO: hay 2 usuarios llamados "${a}" y "${b}". Dirigite a ambos.
`;
}
prompt += `
CAPACIDADES:
- Generar exámenes simulados adaptados al progreso