Drawer IA (Asistente Pedagogico)
- Impacto -- Tema: Override
standard_after_main_region_html()encore_renderer, plantillaaitutor_drawer.mustache, modulo AMDaitutor.js, SCSS.aitutor-*, override deembedded.mustache(SCORM player) - Impacto -- Plugin: Funcion externa
send_messageenlocal_pccntr8203403_aitutor(proxy al servicio externo) - Requisito: Definicion de alcance integracion IA-Moodle (docx) . Figma:
19561-5832. Estado: Implementado
Proposito
Panel lateral de chat que permite al estudiante conversar con un tutor IA directamente desde cualquier pagina de curso o actividad de Moodle. El tutor recibe automaticamente el contexto academico del estudiante (curso, actividad, seccion, progreso, datos SCORM) para generar respuestas pedagogicas contextualizadas.
Funcionalidades
- Boton flotante ("launcher") con avatar del tutor, visible en todas las paginas de curso.
- Panel lateral (drawer) con area de mensajes, indicador de escritura animado y campo de entrada.
- Enriquecimiento automatico del contexto: nombre del curso, actividad actual (nombre y tipo), seccion, porcentaje de completacion.
- Lectura de datos SCORM CMI cuando el drawer se usa dentro del reproductor SCORM (compatibilidad con SCORM 1.2 y SCORM 2004).
- Respuestas del tutor en HTML enriquecido (sanitizado por HTMLPurifier de Moodle).
- Rate limiting configurable por usuario.
- Accesibilidad:
aria-label,aria-expanded,aria-hidden,role="log",aria-live="polite", cierre con tecla Escape.
Donde aparece
El drawer se inyecta en todas las paginas que cumplen estas condiciones:
- El usuario esta autenticado y no es invitado.
- La pagina pertenece a un curso (no es la pagina del sitio).
- El usuario tiene la capacidad
local/pccntr8203403_aitutor:useen el contexto del curso. - El plugin
local_pccntr8203403_aitutoresta configurado (URL del servidor y token no vacios).
Para paginas con layout estandar (columns2, drawers), la inyeccion se realiza via standard_after_main_region_html(). Para el reproductor SCORM (layout embedded), se usa un override del template theme_boost/embedded.mustache.
Arquitectura
El drawer es un componente repartido entre theme_cdigital (presentacion) y local_pccntr8203403_aitutor (logica y comunicacion con el servicio externo). Esta separacion sigue el patron establecido por ADR-002 y su justificacion especifica se documenta en ADR-003.
Flujo de una interaccion
- El estudiante escribe un mensaje y presiona Enviar (o Enter).
- El modulo AMD
aitutor.jscaptura el texto, lee los datos SCORM si aplica, y hace una llamada AJAX alocal_pccntr8203403_aitutor_send_message. - El plugin PHP enriquece el contexto (nombre de actividad, tipo, seccion, progreso) y envia un
POSTcURL al servicio externo con el payload completo. - El servicio externo responde con
reply_html. - El plugin sanitiza el HTML con
clean_text()y lo retorna al navegador. - El modulo AMD renderiza la respuesta como burbuja del bot con
innerHTML.
Archivos del tema involucrados
| Archivo | Funcion |
|---|---|
classes/output/core_renderer.php | Override de standard_after_main_region_html(): evalua condiciones de visibilidad, construye el contexto y renderiza la plantilla |
templates/aitutor_drawer.mustache | Markup del launcher, panel, area de mensajes, campo de entrada |
templates/theme_boost/embedded.mustache | Override del layout embedded (SCORM player) que incluye el drawer |
amd/src/aitutor.js | Logica del cliente: toggle open/close, envio de mensajes, render de respuestas, lectura de SCORM CMI |
scss/preset/cdigital.scss | Estilos del drawer (seccion .aitutor-*) |
pix/aitutor/avatar.png | Avatar del tutor (48x48 en launcher, 54x54 en header del drawer) |
pix/aitutor/icon-send.svg | Icono del boton de envio |
lang/{en,es}/theme_cdigital.php | Sin cadenas propias; las cadenas del drawer provienen de local_pccntr8203403_aitutor |
Dependencias
- Plugin local_pccntr8203403_aitutor (funcion externa
send_message). - Servicio externo de tutoria IA configurado y accesible.
- Capacidad
local/pccntr8203403_aitutor:useotorgada al usuario.
Historial de cambios
Ver CHANGELOG.md en la raiz del sitio de documentacion.