Novedades · Changelog

Cada semana, un poco mejor.

Mejoramos GarBotGPT casi a diario. Estas son las novedades más recientes: nuevas herramientas, mejoras de velocidad y arreglos, contadas en claro.

  1. v9.4.40

    ⚡ Rendimiento: menos latencia en el chat, navegación y carga de imágenes

    Optimizaciones de la auditoría (P1–P5). (P1) El chat leía el perfil del usuario varias veces antes de responder; ahora se lee una sola vez y se reutiliza → una ida menos a la base de datos por mensaje. (P2) El middleware consultaba el perfil (rol/suspensión) en CADA petición; ahora se cachea unos segundos por instancia → menos latencia en toda la navegación. (P3/P4) Añadidos índices en la base de datos que faltaban (claves foráneas de canales/incidentes y la tabla de actividad). (P5) Las miniaturas de un mensaje con varias imágenes se firman en UNA sola llamada en vez de una por imagen. Sin cambios de comportamiento.

    Nuevo

    • 🗂️ Índices BD añadidos (FKs de canales/incidentes + tabla de actividad)
    • 🖼️ Firma de imágenes en lote (una llamada por mensaje, no por imagen)

    Mejorado

    • ⚡ Perfil del usuario leído una sola vez por mensaje (−1 consulta) + caché de rol en el middleware
  2. v9.4.39

    🛡️ Auditoría: corregidos los errores y agujeros de seguridad detectados

    Tras una auditoría a fondo del proyecto, se han corregido todos los errores encontrados (de crítico a bajo). Seguridad: (CRÍTICO) un usuario ya no puede sobrescribir mensajes de otra conversación al "regenerar" (se valida que el mensaje pertenece a la conversación); (ALTO) ya no se pueden adjuntar archivos a proyectos ajenos (se exige rol de editor); (ALTO) el resumen de chat vuelve a funcionar para participantes de chats compartidos; las consultas SQL del asistente bloquean sentencias apiladas y comentarios; y se limita el tamaño del mensaje. Robustez: las fotos de chats compartidos vuelven a verse (firma vía servidor con permiso verificado); borrar una conversación es ahora atómico; el contador de vistas de enlaces compartidos es atómico; el listado de chats ya no carga toda la tabla de participantes; y se evita el solapamiento al enviar mensajes en cola.

    Nuevo

    • 🛡️ CRÍTICO: cerrado IDOR de "regenerar" (no se pueden reescribir mensajes ajenos)
    • 🧱 SQL del asistente endurecido (sin sentencias apiladas/comentarios) + límite de tamaño de entrada
    • 🖼️ Fotos de chats compartidos visibles de nuevo; borrado y contador de vistas atómicos

    Seguridad

    • 🔒 ALTO: adjuntar a un proyecto exige rol de editor; resumen de chats compartidos restaurado
  3. v9.4.38

    🩹 Arreglado "Conversation not found": el mensaje ya no se pierde si el chat activo no existe

    Si al abrir la app se restauraba un chat "último activo" que ya no existía (un chat borrado, o una sesión de invitado anterior), al escribir y enviar el mensaje fallaba con "Conversation not found" y no había respuesta de la IA (reutilizaba ese id muerto sin crear la conversación). Ahora, si /api/chat responde 404, la app crea la conversación con ese id y reintenta el envío una vez automáticamente, así el mensaje llega y la IA responde. Detectado probando la app en el navegador.

    Nuevo

    • 🤖 La IA responde aunque el "último chat" restaurado fuera obsoleto

    Arreglado

    • 🩹 Enviar en un chat cuyo id ya no existe ya no falla: se crea y reintenta solo
  4. v9.4.37

    🐞 Posible arreglo del error React #185 al enviar (solo en producción)

    En producción, al enviar un mensaje, la consola mostraba el error React #185 ("Maximum update depth": un bucle de re-render que React corta solo, no fatal, pero ensuciaba la consola). Solo ocurría en producción (no en desarrollo), lo que apunta al React Compiler. Se ha aplicado la puerta de escape oficial ("use no memo") al componente del cuadro de escritura (ChatInput) para que el compilador no lo transforme y vuelva al comportamiento estándar de React. El resto de la app mantiene las optimizaciones del compilador. Pendiente de confirmar en producción.

    Nuevo

    • 🐞 ChatInput excluido del React Compiler ("use no memo") para cortar el bucle de #185

    Mejorado

    • ⚙️ El resto de la app conserva las optimizaciones del compilador
  5. v9.4.36

    🔊 Leer en voz alta por mensaje · ⌨️ atajos de teclado · 🔁 regenerar con otro modelo

    Tres mejoras de productividad. (1) Cada respuesta del asistente tiene ahora un botón 🔊 para leerla en voz alta (y pararla); solo suena un mensaje a la vez. (2) Atajos de teclado: Ctrl/Cmd+J abre un chat nuevo, "/" enfoca el cuadro de escritura, Esc detiene la respuesta en curso, y Ctrl/Cmd+M abre el selector de modelo. (3) En cualquier respuesta puedes pulsar el "▾" junto a Regenerar para "Regenerar con otro modelo": rehace esa respuesta con el modelo que elijas sin tener que reescribir el mensaje (y respeta exactamente ese modelo, sin AutoModel).

    Nuevo

    • 🔊 Botón de leer en voz alta en cada respuesta de la IA
    • ⌨️ Atajos: Ctrl/Cmd+J nuevo chat · "/" enfocar input · Esc detener · Ctrl/Cmd+M modelo
    • 🔁 "Regenerar con otro modelo" sin reescribir el prompt
  6. v9.4.35

    🌐 El idioma se guarda en tu cuenta y se sincroniza entre dispositivos

    Antes el idioma (Català/Castellano) se guardaba solo en el navegador (localStorage), así que al entrar desde otro PC salía en castellano aunque tú lo tuvieras en catalán. Ahora se guarda en tu cuenta (en la base de datos): al iniciar sesión en cualquier dispositivo se aplica tu idioma, y al cambiarlo se actualiza para todos. La preferencia que ya tenías en este equipo se migra automáticamente la primera vez. El navegador sigue usándose como caché para el primer pintado.

    Nuevo

    • 🌐 Idioma guardado en la cuenta (profiles.language), no solo en el navegador
    • 🔄 Sincroniza entre dispositivos al iniciar sesión
    • ⤴️ Migra automáticamente tu idioma actual la primera vez
  7. v9.4.34

    ✨ Welcome más bonita (Quiz + cards rediseñadas) y subida de imágenes más rápida

    Tres cosas. (1) En las acciones rápidas de la pantalla de bienvenida, "Unidad de red" se sustituye por "Quiz" (el generador interactivo). (2) Las cards de esas acciones se han rediseñado: icono con color propio por herramienta, estado activo con acento y punto indicador, hover con elevación y subtítulo (Activado / Tocar para activar). (3) Las imágenes ahora se comprimen/redimensionan en el navegador ANTES de subirse (máx ~1600px, JPEG): una foto de móvil de 3-4 MB pasa a ~300-700 KB, así la subida es mucho más rápida y la visión más ágil. Si la compresión no es posible (formato raro), se sube el original.

    Mejorado

    • ✨ Cards de la welcome rediseñadas (color por herramienta, activo con acento, hover elevado)
    • 🎯 "Quiz" reemplaza a "Unidad de red" en las acciones rápidas de la welcome
    • ⚡ Imágenes comprimidas en el cliente antes de subir → subida mucho más rápida
  8. v9.4.33

    🆚 Comparador de modelos: respuestas lado a lado + consumo de cada modelo

    La comparativa multi-modelo ya no muestra las respuestas apiladas una debajo de otra. Ahora salen en COLUMNAS, a la misma altura (2 modelos lado a lado; con 3-4 se desliza en horizontal). Cada columna lleva su cabecera con el nombre del modelo y, abajo, su CONSUMO: tokens (entrada→salida = total) y latencia. La información estaba ya guardada pero no se mostraba; ahora se ve por cada modelo. (Las comparativas antiguas siguen viéndose en el formato anterior.)

    Nuevo

    • 🆚 Respuestas de los modelos en columnas a la misma altura (no apiladas)
    • ↔️ Con 3-4 modelos, las columnas se deslizan en horizontal

    Mejorado

    • 📊 Consumo por modelo: tokens (entrada/salida/total) + latencia
  9. v9.4.32

    🎯 Quiz interactivo: responde pregunta a pregunta y ve tu nota al final

    El Generador de Quiz ya no muestra un bloque de texto con respuestas colapsables (que además salían como etiquetas <details> sin renderizar). Ahora es una tarjeta INTERACTIVA: cada pregunta con sus opciones seleccionables, botón Siguiente/Anterior y barra de progreso; al terminar ves tu nota (aciertos/total y %), qué preguntas fallaste, tu respuesta y la correcta con su explicación, y un botón para reintentar. Internamente el modelo genera el quiz en un formato estructurado que la app pinta como componente.

    Nuevo

    • 🎯 Quiz como tarjeta interactiva: elige opción → Siguiente → resultados
    • 🔁 Botón "Reintentar"; ya no aparecen etiquetas <details> sin formato

    Arreglado

    • 📊 Al final: nota, aciertos/fallos, tu respuesta vs la correcta + explicación
  10. v9.4.31

    🧹 Arreglado el "data: {...}" raro que salía en las respuestas con imagen

    Al analizar imágenes (con OCR) aparecía una línea técnica fea encima de la respuesta: data: {"type":"tool_timeline_event",...}. Era un evento interno del stream que no se filtraba bien cuando quedaba pegado al texto. Ahora se elimina aunque no esté en su propia línea, y además el contenido FINAL del mensaje del asistente se limpia de estos eventos al pintarlo (no solo durante el streaming), sin afectar a artifacts ni código.

    Nuevo

    • 🧹 Ya no se cuela el "data: {tool_timeline_event…}" encima de las respuestas

    Arreglado

    • 🛡️ Limpieza robusta: pilla el evento aunque venga pegado al texto, y también en el mensaje ya guardado
  11. v9.4.30

    ⚡ Menos latencia: lecturas de BD en paralelo al preparar la respuesta

    Primer paso (conservador) para reducir el tiempo que tarda el chat en arrancar la respuesta. Antes de llamar al modelo se hacían varias consultas a la base de datos de forma secuencial; ahora se lanzan en paralelo las que son independientes: el perfil del usuario junto con sus memorias, y (en proyectos) los datos del proyecto junto con las memorias del proyecto. La sección de carpetas ya iba en paralelo. Cada par ahorra una ida y vuelta a la BD (~50-150 ms con la BD en el NAS). Sin cambios de comportamiento.

    Nuevo

    • ✅ Cambio conservador en la ruta crítica del chat: misma lógica, menos esperas

    Mejorado

    • ⚡ Perfil + memorias del usuario se cargan en paralelo (antes secuencial)
    • ⚡ En proyectos: datos del proyecto + memorias del proyecto en paralelo
  12. v9.4.29

    🏷️ La insignia muestra el modelo REAL que respondió + modelo de visión configurable

    Dos mejoras. (1) Hasta ahora la insignia del mensaje mostraba el modelo que TENÍAS seleccionado, aunque el servidor lo cambiara (AutoModel o el forzado de visión a 5.5). Ahora el servidor avisa por el stream del modelo realmente usado y la insignia lo refleja al instante, sin esperar a recargar. (2) El modelo que analiza las imágenes ya no está fijo en el código: hay un ajuste nuevo en el panel admin (Modelos → "Modelo para análisis de imagen") con un desplegable de los modelos con visión; si no se configura, se usa GarBotGPT-5.5 por defecto.

    Nuevo

    • 🏷️ La insignia del mensaje refleja el modelo que de verdad respondió (no el seleccionado)
    • ⚙️ Panel admin: elige el modelo para análisis de imagen (desplegable de modelos con visión)
    • 🔁 Por defecto sigue siendo GarBotGPT-5.5 si no se configura nada
  13. v9.4.28

    🖼️ Fotos sin tarjeta (solo la imagen) + análisis de imagen siempre con GarBotGPT-5.5

    Dos ajustes pedidos. (1) Las imágenes en el chat se muestran ahora SOLO como la foto: se quitó la tarjeta azul con borde, el nombre del archivo, el tamaño y el icono; además ya no se recorta (se conserva la imagen entera, no cuadrada forzada). Sigue siendo pulsable para abrir la vista grande. (2) El análisis de imagen ya no lo hace el modelo Mini: cuando hay una foto adjunta, el servidor fuerza GarBotGPT-5.5 (el mejor en visión), por encima del AutoModel y del modelo seleccionado. Si por permisos 5.5 no estuviera disponible para ese usuario, se cae al AutoModel/modelo normal.

    Nuevo

    • 🖼️ Las fotos del chat se ven solo como imagen (sin tarjeta, sin borde, sin recortar)
    • 🧠 Con foto adjunta se usa SIEMPRE GarBotGPT-5.5 para analizarla (no el Mini)
  14. v9.4.27

    🖼️ Las fotos vuelven a verse en el chat (miniaturas) y en cuadrícula compacta

    Dos arreglos para los adjuntos de imagen en el chat. (1) Las fotos no se veían: salía una tarjeta con icono de clip en vez de la miniatura. Causa: el bucket privado user-files tenía RLS activado pero SIN políticas, así que el navegador no podía firmar la URL de tus propias imágenes (todo denegado por defecto); solo el servidor, con clave de servicio, podía. Se han añadido las políticas estándar para que cada usuario acceda a SUS archivos (carpeta = su id), de forma segura: un usuario no puede ver los de otro. (2) Las imágenes se apilaban a lo ancho (220px) una debajo de otra, obligando a hacer scroll; ahora se muestran como miniaturas cuadradas compactas que se colocan varias por fila. Los archivos no-imagen (PDF, hojas, docs) mantienen su tarjeta.

    Nuevo

    • 🖼️ Las fotos del chat se ven de nuevo como miniatura (no el icono de clip)
    • 🧱 Imágenes en cuadrícula compacta (varias por fila) en vez de apiladas → menos scroll

    Seguridad

    • 🔐 Políticas RLS del bucket user-files: cada quien ve solo SUS archivos (seguro)
  15. v9.4.26

    🖼️ Arreglado: editar un mensaje con fotos ya no pide volver a subirlas

    Al editar (o regenerar) un mensaje que tenía imágenes, el modelo se quedaba sin ellas y pedía que las subieras otra vez. La causa: al reenviar la petición, los adjuntos solo se incluían si había una herramienta de documentos activa (unidad de red, hoja de cálculo, generación de documentos, intérprete de código o RAG estricto); las imágenes, que usan visión y no dependen de ninguna herramienta, se descartaban. Ahora las imágenes se reenvían SIEMPRE al editar/regenerar, así la visión sigue funcionando. Los adjuntos no-imagen (documentos/hojas) mantienen su condición anterior.

    Nuevo

    • 🖼️ Editar/regenerar un mensaje con fotos conserva las imágenes (visión sigue activa)
    • 🔧 Las imágenes se reenvían siempre; los documentos/hojas siguen ligados a su herramienta
  16. v9.4.25

    💬 Chats independientes: varias conversaciones respondiendo a la vez

    Antes el estado de "respondiendo" era único y global: si un chat estaba generando respuesta y te ibas a otro, el segundo se bloqueaba (tu mensaje quedaba en cola). Ahora el streaming es POR conversación: cada chat tiene su propio buffer, su propio indicador y su propio botón de detener. Puedes lanzar una respuesta en un chat, cambiarte a otro y escribir/enviar allí inmediatamente, mientras el primero sigue respondiendo en segundo plano; al volver, ves su texto en vivo. Un mensaje encolado siempre se envía a SU conversación de origen aunque hayas cambiado de chat. Los campos que ve la UI siguen reflejando el chat que estás mirando, así que el resto de la app (indicadores, sugerencias, voz, artifacts) no cambia. Si borras un chat que estaba respondiendo, su stream se aborta limpiamente.

    Nuevo

    • 💬 Streaming POR conversación: ya no se bloquea enviar en otro chat mientras uno responde
    • 🔀 Cambia de chat libremente: el de origen sigue respondiendo en segundo plano
    • 📨 La cola de mensajes recuerda su conversación: cada mensaje va a SU chat
    • 🧹 Borrar un chat en curso aborta su respuesta sin afectar a los demás
  17. v9.4.24

    🧭 AutoModel inteligente: ahora elige el MEJOR modelo para cada tarea (sube y baja)

    Reescrito el motor de selección automática de modelo. Antes solo BAJABA a un modelo más barato cuando la pregunta era trivial (ahorro), nunca mejoraba las respuestas difíciles. Ahora clasifica la tarea (trivial · simple · código · razonamiento/matemáticas · creativo · texto largo · visión) y, leyendo tu catálogo REAL de modelos habilitados (con sus capacidades: visión, herramientas, ventana de contexto, reasoning_effort), elige el mejor encaje: BAJA a un modelo rápido para saludos/preguntas cortas y SUBE a uno más capaz (p. ej. un Codex para programar, el modelo de mayor razonamiento para matemáticas, uno con visión para imágenes) cuando la tarea lo pide. Estrategia equilibrada: calidad cuando hace falta, ahorro cuando no. Si una imagen requiere visión y tu modelo no la tiene, cambia solo a uno que sí. Robusto: ante cualquier error o catálogo vacío respeta tu modelo. Solo afecta al modo AutoModel; los invitados siguen en GarBotGPT-5-Mini.

    Nuevo

    • 🧭 Enrutado BIDIRECCIONAL: baja en triviales y SUBE en tareas duras (código, mates, análisis largo)
    • 🎯 Consciente de la tarea: código → modelo coder; razonamiento → mayor reasoning_effort; imagen → modelo con visión
    • 🗂️ Usa el catálogo real de model_configs (capacidades reales), no listas fijas — nunca apunta a un modelo inexistente

    Arreglado

    • 🛡️ A prueba de fallos: ante error o sin catálogo, se respeta el modelo que elegiste; invitados sin cambios
  18. v9.4.23

    🧹 Limpieza del AutoModel: fuera el código muerto de "tipo de tarea"

    El auto-routing de modelo arrastraba código que se ejecutaba en CADA mensaje pero no tenía ningún efecto: detectTaskType() clasificaba el input (code/reasoning/creative/...) y el resultado se guardaba en globalThis.__lastTaskType y en un log, pero nunca se leía en ninguna parte. También quedaban un mapa TASK_PREFERRED_FAMILY y una lista FAST_MODELS sin usar. Se ha eliminado todo (≈90 líneas) para que el router solo haga lo que realmente decide: el downgrade conservador a un modelo más rápido cuando la pregunta es trivial. Sin cambios de comportamiento para el usuario; menos cómputo por mensaje y código más claro.

    Nuevo

    • 🧹 Eliminado detectTaskType() + patrones CODE/REASONING/CREATIVE (no se leía su salida)
    • 🧹 Fuera el mapa TASK_PREFERRED_FAMILY, la lista FAST_MODELS y globalThis.__lastTaskType (código muerto)

    Mejorado

    • ⚙️ El downgrade conservador (pregunta trivial → modelo rápido) sigue intacto y verificado por tipos
  19. v9.4.22

    🩹 Causa raíz del "typing failed": FK de conversación optimista (arreglado en el endpoint)

    Tras reproducirlo contra la BD: el endpoint /api/conversations/[id]/typing devolvía 500 "Failed to update typing state" cuando el chat se acababa de crear de forma OPTIMISTA y aún no estaba persistido en la tabla conversations → el upsert violaba la foreign key (code 23503). La base de datos está correcta (la constraint UNIQUE existe). Ahora el endpoint trata ese caso como lo que es —no crítico— y responde 200 no-op en lugar de 500. Junto con el backoff del cliente (v9.4.21), el indicador de "escribiendo" deja de generar errores por completo.

    Nuevo

    • 🔎 Diagnóstico confirmado reproduciendo el upsert contra la BD real
    • ✅ La tabla conversation_typing y su constraint UNIQUE están correctas (no requería migración)

    Arreglado

    • 🩹 /typing ya no devuelve 500 cuando la conversación aún no existe (FK 23503 → 200 no-op)
  20. v9.4.21

    🔇 Fin de la tormenta de errores "typing heartbeat failed"

    El composer enviaba un "heartbeat" de escritura a /api/conversations/[id]/typing cada 1,2s mientras escribías; si el endpoint fallaba, registraba el error CADA vez → la consola se inundaba de "[ChatInput] typing heartbeat failed". Ahora, al primer fallo, se DEJA de llamar al endpoint para esa conversación (no se reintenta cada 1,2s) y se registra un solo aviso. El indicador de "escribiendo" es no crítico y el broadcast en tiempo real (el que usan los chats compartidos) sigue funcionando aparte del endpoint.

    Nuevo

    • 📡 El broadcast realtime de "escribiendo" sigue activo (chats compartidos OK)

    Arreglado

    • 🔇 El heartbeat de typing para al primer fallo (no más spam cada 1,2s)
    • 🧹 Consola limpia: un solo aviso en vez de error continuo
  21. v9.4.20

    🟢 Tu propio estado siempre "En línea" + nombres de modelo legibles

    Pulido tras una prueba completa de la app. (1) El pill de presencia de tu propio usuario a veces mostraba "Desconnectat" (dependía del último ping de actividad); ahora el usuario actual se ve SIEMPRE "En línea" (si estás usando la app, estás conectado). (2) Se mostraban ids crudos de modelo ("gpt-5-5", "gpt-5.2") en el modal de Custom GPT ("modelo por defecto") y en el "Coste por modelo" del dashboard admin; ahora se resuelven al nombre del panel (ej. "GarBotGPT-5.5").

    Nuevo

    • 🟢 Tu propio estado siempre "En línea" (no "Desconnectat")
    • 🏷️ Modal Custom GPT: nombre de modelo legible en "modelo por defecto"
    • 🏷️ Dashboard admin: "Coste por modelo" con nombre del panel, no el id crudo
  22. v9.4.19

    🔓 Botón "Iniciar sesión" para invitados + arreglado login desde invitado

    Dos cosas. (1) En la cabecera de invitado ahora hay botón de "Iniciar sesión"/"Entrar" además de "Regístrate" (escritorio y móvil). (2) BUG: la página de login redirigía a /chat nada más entrar si había una sesión de invitado (anónima) activa, así que era imposible loguearse desde el modo invitado. Ahora la auto-redirección solo ocurre con un usuario REAL; si la sesión es anónima, se muestra el formulario de login con normalidad.

    Nuevo

    • 🔓 Botón "Iniciar sesión"/"Entrar" para invitados (escritorio + móvil)
    • ✅ La auto-redirección de /auth/login solo aplica a usuarios reales, no a invitados

    Arreglado

    • 🐛 Arreglado: login imposible desde invitado (redirigía a /chat por la sesión anónima)
  23. v9.4.18

    📱 Envío instantáneo desde welcome también en MÓVIL

    El envío optimista de v9.4.17 hacía instantánea la transición welcome→chat en escritorio (la vista cambia con activeConversationId), pero en móvil el cambio depende de NAVEGAR a /chat/[id], y esa navegación se hacía tras crear la conversación (~3s) → en móvil seguía lento. Ahora la navegación a /chat/[id] también es optimista (al instante), porque esa ruta es client-only y renderiza el chat desde el store sin consultar al servidor. Resultado: en móvil pulsar enviar también salta al chat al momento, con el mensaje y "Pensant…" visibles.

    Nuevo

    • 🧭 Navegación a /chat/[id] optimista (ruta client-only, sin 404)
    • ↩️ Si falla crear la conversación, vuelve a welcome y restaura el texto

    Mejorado

    • 📱 Móvil: clic enviar → vista de chat instantánea (antes esperaba ~3s)
  24. v9.4.17

    ⚡ Envío instantáneo desde welcome (de ~2,6 s a ~0 s percibidos)

    Medido en directo: al enviar el primer mensaje desde la pantalla de bienvenida, pasaban ~2.609 ms (2,6 s) hasta que cambiaba a la vista de chat, porque el cliente ESPERABA a crear la conversación en el servidor (round-trip a la BD) antes de cambiar de pantalla y mostrar el mensaje. Ahora el envío es OPTIMISTA: se pre-genera el id de la conversación y se cambia a la vista de chat + se muestra tu mensaje y "Pensant…" AL INSTANTE; la conversación se crea en el servidor en segundo plano (con ese mismo id, sin saltos). La respuesta del modelo sigue tardando lo suyo (latencia BD+modelo), pero la app reacciona al momento. Si la creación fallara, se revierte y se restaura el texto.

    Nuevo

    • 🟦 Tu mensaje y "Pensant…" aparecen al momento, sin esperar al servidor
    • 🆔 La conversación se crea en segundo plano con id pre-generado (sin swap ni remontaje)

    Mejorado

    • ⚡ Clic enviar → vista de chat: de ~2.609 ms a ~16 ms (instantáneo)
  25. v9.4.16

    ⚡ Arreglados los parpadeos/tirones del chat (tormenta de 403 + re-animación)

    Se cazaron en directo (navegador + instrumentación del DOM) las causas de los parpadeos. (1) Los hooks de colaboración (TypingIndicator y useConversationCollaboration) reconsultaban sus endpoints cada 1,5s/30s y, para invitados o conversaciones sin acceso, recibían 401/403 y REINTENTABAN sin parar → tormenta de errores + re-renders que llegaban a congelar la página (React #185 "Maximum update depth"). Ahora paran al primer 401/403 y se reinician solo al cambiar de conversación. (2) La animación de entrada de las burbujas (message-in) se re-disparaba al terminar el stream porque la burbuja se remonta con el id de BD; ahora solo se anima en mensajes recién creados (<2s) — adiós flash, y también desaparece la cascada de animaciones al abrir un chat.

    Nuevo

    • ⛔ TypingIndicator y colaboración dejan de reintentar ante 401/403 (no más tormenta de 403)
    • 🧊 Adiós al congelamiento por bucle de re-render (React #185)
    • ✨ La animación de burbuja ya no parpadea al terminar de responder ni al abrir un chat
  26. v9.4.15

    🔁 Invitados ahora usan GarBotGPT-5-Mini (antes 5.2)

    Se cambió el modelo disponible para invitados (no logueados) de GarBotGPT-5.2 a GarBotGPT-5-Mini (gpt-5-mini). Ahora GarBotGPT-5-Mini es el único modelo seleccionable para invitados y GarBotGPT-5.2 aparece bloqueado con candado como el resto. Forzado también server-side en /api/chat.

    Nuevo

    • 🔁 Modelo de invitado: GarBotGPT-5-Mini (gpt-5-mini)
    • 🛡️ Enforcement server-side actualizado a gpt-5-mini

    Seguridad

    • 🔒 GarBotGPT-5.2 pasa a estar bloqueado para invitados
  27. v9.4.14

    📱 Composer del welcome bajado para invitados + saludo sin IP

    Dos arreglos para invitados (no afecta a logueados). (1) En la pantalla de bienvenida, el cuadro de escribir aparecía flotando demasiado arriba (sobre las tarjetas de accesos rápidos) dejando un hueco abajo: pasaba porque la barra de navegación inferior no se renderiza para invitados, pero su altura (~56px) seguía reservada. Ahora se trata como altura 0 y el composer baja al fondo. (2) El saludo mostraba la IP del invitado ("Invitado · 104.x.x.x"); ahora muestra siempre el alias amigable (ej. "Invitado Zorro Curioso 482"). Además, los nombres antiguos con IP se migran al alias en el siguiente mensaje.

    Nuevo

    • 📱 Composer del welcome ya no flota arriba para invitados (nav inferior cuenta como 0)
    • 🏷️ Saludo de invitado sin IP: alias amigable y estable
    • 🧹 Migración automática de nombres antiguos "Invitado · <ip>" → alias
  28. v9.4.13

    🔒 Menú de modelos con candados para invitados + 🧰 Herramientas por modelo (admin)

    Tres cosas. (1) Invitados (no logueados): el menú de modelos vuelve a mostrarse, pero todos los modelos salen bloqueados con candado y solo GarBotGPT-5.2 es seleccionable; un aviso invita a registrarse para desbloquear el resto. (2) El nombre que se asigna a un invitado ya NO es su IP, sino un alias amigable y estable (ej. "Invitado Zorro Curioso 482"), más legible en el panel admin y sin exponer la IP. (3) NUEVA pestaña "Herramientas" en el editor de modelos del admin: permite habilitar/deshabilitar por modelo qué herramientas aparecen en el menú del chat (búsqueda web, deep research, código, imágenes, documentos, hojas de cálculo, conocimiento, integraciones). Por defecto todas habilitadas, así que los modelos existentes no cambian.

    Nuevo

    • 🏷️ Nombre de invitado amigable y estable (no la IP)
    • 🧰 Admin: pestaña "Herramientas" para activar/desactivar tools por modelo (afecta al menú del input)

    Seguridad

    • 🔒 Invitados: todos los modelos visibles pero bloqueados (candado); solo GarBotGPT-5.2 usable

    Invitados

    • El selector de modelo se muestra de nuevo en escritorio y móvil, con todos los modelos en gris + candado salvo GarBotGPT-5.2.
    • Aviso "Regístrate gratis para desbloquear todos los modelos" dentro del menú.
    • El modo automático se oculta para invitados (solo pueden usar un modelo).
    • Nombre de invitado generado de forma estable a partir del id de usuario, sin usar la IP.

    Admin · Modelos

    • Nueva pestaña "Herramientas" en el editor de cada modelo.
    • Cada herramienta tiene su interruptor; lo desactivado no aparece en el menú del chat para ese modelo.
    • Se guarda en model_configs.tool_config (JSON). Por defecto todo habilitado.
  29. v9.4.12

    📱 Header móvil de invitado arreglado + invitados solo usan GarBotGPT-5.2

    Dos cosas para invitados (no afecta a logueados). (1) En móvil el header se desbordaba (el botón "Regístrate" quedaba cortado) por tener demasiados elementos. Como los invitados solo pueden usar un modelo, se quita el selector de modelo y se muestra una etiqueta estática "GarBotGPT-5.2"; eso libera espacio y el header entra bien (también compactado el botón Regístrate). (2) Los invitados solo pueden usar el modelo gpt-5.2 (= GarBotGPT-5.2): forzado server-side en /api/chat (se ignora auto-route y cualquier otro modelo) y sin selector en el cliente.

    Nuevo

    • 📱 Header móvil de invitado ya no se desborda (selector de modelo oculto + Regístrate compacto)
    • 🏷️ Sin selector de modelo para invitados (etiqueta estática)

    Seguridad

    • 🔒 Invitados forzados a gpt-5.2 (GarBotGPT-5.2) server-side
  30. v9.4.11

    🔒 Invitados: herramientas se bloquean y desactivan al llegar al límite

    Cuando un invitado agota sus usos de herramientas (3), las herramientas se bloquean: la que tuviera activa se desactiva automáticamente y en el menú aparece un candado con "Límite de herramientas alcanzado · Regístrate". Combinado con el bloqueo del servidor (por IP), las tools quedan inutilizables hasta registrarse. No afecta a usuarios logueados.

    Nuevo

    • ⏏️ La herramienta activa se desactiva automáticamente al llegar al límite

    Mejorado

    • 🪝 Hook useGuestUsage (uso real por IP) para la UI

    Seguridad

    • 🔒 Candado + "Límite alcanzado · Regístrate" en el menú de herramientas

1434 versiones publicadas · página 39 de 48. Míralo dentro de la app.