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.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
  2. 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
  3. 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)
  4. 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
  5. 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
  6. 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)
  7. 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)
  8. 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)
  9. 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
  10. 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
  11. 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
  12. 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.
  13. 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
  14. 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
  15. v9.4.10

    🔐 Límite de invitados REAL: por IP (ya no se salta cerrando incógnito)

    PRIORITARIO: el límite de invitados se podía saltar cerrando y reabriendo el navegador (incógnito) → cada sesión anónima nueva reseteaba el contador → acceso ilimitado. Ahora el límite es POR IP y día (tabla guest_usage + RPC atómica consume_guest_usage en la DB): 10 mensajes y 3 usos de herramientas por IP/día. Cerrar/reabrir el navegador NO resetea nada. Los contadores del chat y del menú de herramientas leen el uso real por IP. Fail-closed si la comprobación falla.

    Nuevo

    • 🔐 Límite por IP/día (10 mensajes, 3 herramientas) — no se salta con incógnito
    • ⚛️ Consumo atómico en la DB (consume_guest_usage) → sin condiciones de carrera
    • 📊 Contadores reales por IP en chat y menú de herramientas
  16. v9.4.9

    🏷️ El nombre del modelo nunca muestra el id crudo: siempre "GarBotGPT"

    Definitivo: en las burbujas, si el nombre del modelo no se resuelve al del panel (config aún no cargada, id desconocido, etc.) ya NO se muestra el id crudo (gpt-5.2). Se muestra el nombre del panel cuando se conoce (GarBotGPT-5.2) y, si no, la marca "GarBotGPT". Nunca el identificador técnico.

    Nuevo

    • 🏷️ Nunca el id crudo del modelo en las burbujas
    • Muestra "GarBotGPT-5.2" cuando se conoce; "GarBotGPT" como mínimo
  17. v9.4.8

    🛡️ PRIORITARIO: unidad de red nunca se llama si está desactivada + nombre del modelo + invitados con IP

    Tres arreglos. (1) PRIORITARIO: la unidad de red se llamaba aunque estuviera desactivada/oculta, porque el servidor la reactivaba por "intención inferida del texto" o por referencias a ficheros de la conversación reciente, ignorando el permiso/toggle. Ahora SOLO se activa con el toggle explícito del usuario (y con permiso): eliminada toda la inferencia y la reactivación por ficheros recientes; gate por permiso en varios puntos (defensa en profundidad). Si está oculta/desactivada, no se llama jamás. (2) El nombre del modelo salía como id crudo (gpt-5.2 / gpt-5-2): los mensajes guardan el id con punto o con guion, pero el mapa de nombres solo tenía una variante; ahora mapea ambas → siempre el nombre del panel. (3) Los invitados (sin login) ahora reciben nombre "Invitado · <IP>" para poder identificarlos en el panel admin.

    Nuevo

    • 🛡️ Unidad de red: solo se activa con el toggle explícito; nunca por inferencia ni ficheros recientes
    • 🏷️ Nombre del modelo resuelve variantes punto/guion (gpt-5.2 = gpt-5-2 = GarBotGPT-5.2)
    • 👤 Invitados identificados como "Invitado · <IP>" en el panel admin

    Seguridad

    • 🔒 Gate por permiso en varios puntos (no se llama si el usuario no puede usarla)
  18. v9.4.7

    🧹 Invitados: "Regístrate" visible, sin "En línea" y con acceso a Ajustes

    Tres ajustes del modo invitado (no afectan a usuarios logueados). (1) El botón "Regístrate" del header no se veía (el fondo degradado no se renderizaba); ahora es sólido (violeta) y bien visible, en header de escritorio y móvil. (2) En la pantalla de bienvenida se ocultaba mal el indicador "En línea" para invitados; ahora no aparece. (3) Como a los invitados se les ocultó el menú de usuario, no tenían forma de abrir Ajustes; añadido un botón de engranaje (Ajustes) en el header para invitados.

    Nuevo

    • 🔘 "Regístrate" sólido y visible (header escritorio y móvil)
    • 🙈 Pill "En línea" oculto para invitados en la welcome
    • ⚙️ Botón de Ajustes para invitados en el header (al ocultar el menú de usuario)

    Seguridad

    • 🔒 Sin cambios para usuarios logueados
  19. v9.4.6

    🛠️ Fix: contador de herramientas de invitado + imágenes de búsqueda web solo si son relevantes

    Dos arreglos. (1) El contador de usos de herramientas de invitado se quedaba en "3 de 3" aunque se usara una tool: el incremento de profiles.guest_tool_uses era fire-and-forget (void) y en Vercel las promesas no esperadas se cancelan al terminar la respuesta, así que nunca persistía. Ahora se hace con await (en la fase de preparación, sin latencia perceptible). (2) La búsqueda web a veces mostraba imágenes sin relación (logos, banderas, capturas de la página): el selector forzaba un mínimo de imágenes rellenando con candidatas de baja relevancia e incluso screenshots. Ahora solo muestra imágenes que superan un umbral de confianza; si ninguna lo supera, no muestra ninguna (mejor ninguna que irrelevante).

    Nuevo

    • 🔢 El contador de herramientas de invitado ahora baja al usar una tool (await del incremento)
    • 🖼️ Búsqueda web: solo imágenes relevantes; eliminado el relleno forzado y las capturas de página
    • 🙅 Si ninguna imagen es de fiar, no se muestra ninguna
  20. v9.4.5

    🏷️ Fix: el nombre del modelo salía como id crudo unos segundos

    En las burbujas, el modelo aparecía primero como id crudo (p.ej. "gpt-5.2") y, unos segundos después, ya con el nombre del panel admin ("GarBotGPT-5.2"). Causa: el store de modelos arrancaba con los nombres fallback estáticos (= id) y solo tras cargar /api/models (config del admin, con latencia) tenía el nombre real. Ahora la config de modelos se cachea en localStorage, así el primer render ya muestra el nombre del panel y se refresca en segundo plano. Sin flicker de nombre.

    Nuevo

    • 🏷️ El nombre del modelo se muestra ya correcto desde el primer render (sin pasar por el id crudo)

    Mejorado

    • 💾 Config de modelos cacheada en localStorage; refresco en segundo plano
    • 🛠️ Al guardar modelos en el panel, la cache se actualiza (reloadModels)
  21. v9.4.4

    🧹 Invitados: ocultar también la tarjeta de usuario del sidebar

    Para los invitados (sin login) quedaba visible la tarjeta de usuario al pie del sidebar mostrando "? Cargando…". Ahora también se oculta para invitados, igual que el menú de usuario del header y la barra inferior. Los usuarios logueados la siguen viendo.

    Nuevo

    • 🧹 Sidebar: tarjeta de usuario ("? Cargando…") oculta para invitados

    Seguridad

    • 🔒 Usuarios logueados: sin cambios
  22. v9.4.3

    🐛 Fix: el invitado entraba al login en vez de al chat

    El acceso directo de invitados no funcionaba: al entrar te mandaba a /auth/login en vez de al chat. Causa: el proxy/middleware (Next 16) redirigía a /auth/login a cualquier visitante SIN sesión en rutas no públicas, incluido /chat — antes de que el layout pudiera crear la sesión anónima. Solución: el middleware ahora permite /chat (y subrutas) sin sesión, así el GuestBootstrap crea la sesión anónima y muestra el chat. Además, los invitados (anónimos) ya pueden abrir /auth/register y /auth/login para "subir" a una cuenta real (antes el middleware los expulsaba de las páginas de auth por estar técnicamente autenticados).

    Nuevo

    • 🔓 Invitados anónimos pueden acceder a /auth/register y /auth/login para registrarse

    Arreglado

    • 🐛 Middleware: /chat accesible sin sesión → el invitado entra directo (no al login)

    Seguridad

    • 🔒 Resto de rutas privadas (ajustes, mis archivos, admin…) siguen pidiendo login
  23. v9.4.2

    🚪 Invitados: entra directo al chat + límites visibles (sin login)

    Mejora del acceso público. (1) Abrir la app ya NO lleva al login: crea una sesión de invitado y entra directo al chat. En el header, los invitados ven "Regístrate" (los logueados, su menú normal). (2) Para invitados se ocultan el menú de usuario y la barra inferior de navegación; los logueados ven todo igual. (3) Los invitados pueden usar herramientas pero con un tope de 3 usos (server-side), y se muestran contadores en vivo: en el chat los mensajes restantes (de 10) y en el menú de herramientas los usos restantes (de 3), que bajan al usarlos. Nada de esto afecta a los usuarios con cuenta.

    Nuevo

    • 🚪 Entrada directa al chat como invitado (sin pasar por login)
    • 🔘 Header: "Regístrate" para invitados; menú de usuario y barra inferior ocultos
    • 🛠️ Invitados: 3 usos de herramientas (server-side) + 10 mensajes
    • 🔢 Contadores en vivo: mensajes en el chat, usos de herramientas en su menú

    Seguridad

    • 🔒 Usuarios logueados: sin cambios, todo igual
  24. v9.4.1

    📎 Fix: subir archivos grandes (PDFs pesados) ya no falla

    Adjuntar un PDF/archivo grande daba "No se pudo subir el archivo". Causa: el archivo se subía como multipart a /api/files/upload, una función serverless de Vercel, y Vercel limita el body de las funciones a 4,5MB — cualquier archivo mayor era rechazado por la plataforma ANTES de llegar a nuestro código (que permitía hasta 30MB). Solución: los archivos ahora se suben DIRECTAMENTE a Supabase Storage mediante una signed upload URL (cliente → Supabase, sin pasar por Vercel), así que el límite de 4,5MB ya no aplica. Se valida auth, tipo, tamaño (30MB) y cuota de almacenamiento en el servidor ANTES de emitir la URL, y se registra el archivo + ingest después. Aplicado al composer del chat.

    Nuevo

    • 📎 Subida directa a Supabase Storage vía signed URL (evita el límite de 4,5MB de Vercel)
    • 🧩 Nuevos endpoints /api/files/sign-upload y /api/files/register; helper uploadFileViaSignedUrl

    Arreglado

    • PDFs y archivos grandes (hasta 30MB) ya suben sin error

    Seguridad

    • 🔒 Validación server-side (auth, tipo, tamaño, cuota) antes de emitir la URL; path acotado al user
  25. v9.4.0

    🚪 Acceso público sin registro: "Probar sin cuenta" (10 mensajes gratis)

    Ahora cualquiera puede probar GarBotGPT sin registrarse. En el login hay un botón "Probar sin cuenta" que crea una sesión anónima (Supabase anonymous sign-in) y deja chatear al instante, con un tope de 10 mensajes. Al llegar al límite se invita a crear una cuenta gratis. Los invitados son solo-chat (sin tools caras: imagen, vídeo, deep research, documentos, code interpreter…) para controlar coste. Todo el tope es server-side (no se puede saltar). Esto además resuelve el rechazo de Google Play (los revisores ya no necesitan credenciales: pulsan "Probar sin cuenta"). Se habilitó GOTRUE_EXTERNAL_ANONYMOUS_USERS_ENABLED en el Supabase autoalojado. RLS y datos siguen aislados por usuario (cada invitado tiene su user_id).

    Nuevo

    • 🚪 Botón "Probar sin cuenta" en /auth/login → sesión anónima y a chatear
    • 🔢 Tope de 10 mensajes por invitado (server-side, en /api/chat)
    • 💸 Invitados solo-chat: tools caras vetadas (imagen/vídeo/deep research/docs/code)
    • Resuelve el rechazo de Google Play (acceso sin credenciales para revisores)

    Seguridad

    • 🔒 RLS intacta: cada invitado tiene su propio user_id, datos aislados
  26. v9.3.3

    ⚡ Fin del "rato" con cursor al terminar la respuesta

    Al terminar la IA de responder, la respuesta se quedaba un rato con el cursor parpadeando (parecía colgada) y luego "actualizaba" al mensaje final. Causa: en el cierre del stream el código hacía varios round-trips lentos al NAS (recargar conversaciones, recargar mensajes y reintentos esperando a que el mensaje apareciera en la DB) ANTES de limpiar el estado de streaming, así que la burbuja con cursor se quedaba visible todo ese tiempo (latencia Vercel↔NAS). Ahora, en cuanto la IA termina, se pinta el mensaje final al instante (optimista) y se quita la burbuja de streaming; la confirmación contra la base de datos ocurre en segundo plano y reconcilia sin parpadeo (dedupe por contenido + user_id, ventana de 60s).

    Nuevo

    • 🔄 La confirmación en la DB (loadMessages/reintentos) ocurre en segundo plano
    • 🧩 Reusa el mismo id/meta que la reconciliación existente → no duplica

    Mejorado

    • El mensaje final aparece al instante al terminar la IA (sin "rato" con cursor)

    Seguridad

    • 🔒 Dedupe fiable por contenido + user_id (verificado: 306/306 mensajes con user_id)
  27. v9.3.2

    ⚡ Borrar chats al instante (borrado optimista)

    Eliminar un chat se sentía muy lento: el endpoint de borrado hace ~5-6 round-trips a la base de datos (auth, comprobar propiedad, preservar histórico de token_usage, borrar) y, al estar la app en Vercel y la DB en el NAS, cada salto cuesta ~150-300ms → el chat tardaba 1-2s en desaparecer porque la UI ESPERABA al servidor. Ahora el chat se quita de la lista al instante (optimista) y el borrado real ocurre en segundo plano; si el servidor fallara, el chat se restaura y se avisa con un toast. No tiene nada que ver con los chats compartidos.

    Nuevo

    • 🔄 Borrado real en segundo plano; rollback + aviso si el servidor falla
    • 🧭 El chat activo navega a la welcome sin esperar
    • 🔎 El log mostraba errores de colaboración/Realtime, pero el borrado lento era por los round-trips Vercel↔NAS, no por chats compartidos

    Mejorado

    • El chat desaparece de la lista al instante al eliminar (ya no espera al servidor)
  28. v9.3.1

    🐛 Fix: mensaje del asistente duplicado al terminar (burbuja de streaming solapada)

    A veces, al terminar de responder, se veían DOS burbujas del asistente con el mismo texto pero distinto modelo (p.ej. GarBotGPT-5.2 y GarBotGPT-5.5 en modo Auto). Causa: al cerrar el stream, loadMessages cargaba el mensaje persistido (con el modelo realmente usado, p.ej. el auto-routed 5.2) ANTES de limpiar streamingContent, así que durante esa ventana convivían el mensaje real y la burbuja de streaming (etiquetada con el modelo seleccionado, p.ej. 5.5). Confirmado por SSH que en la base de datos solo hay UN mensaje (no era duplicación real, solo de render). Solución: ocultar la burbuja de streaming en cuanto exista el mensaje persistido del asistente. Respeta regeneración y chats compartidos (no oculta mensajes en live_streaming).

    Nuevo

    • Se oculta la burbuja de streaming en cuanto el mensaje real está persistido
    • 🔬 Verificado por SSH: en la DB solo hay 1 mensaje (era solo render, no duplicación real)

    Arreglado

    • 🐛 Doble burbuja del asistente (mismo texto, modelos 5.2/5.5) al terminar el stream

    Seguridad

    • 🔒 No afecta a regeneración ni a chats compartidos (live_streaming protegido)
  29. v9.3.0

    📰 Landing rediseñada en estilo editorial premium cálido (revista de lujo)

    Cambio total de estilo de toda la landing: de dark premium a editorial premium cálido. Paleta crema/terracota/oliva, titulares serif grandes, layout de revista con numeración (01, 02…), reglas finas, drop-cap en el manifiesto, wordmark gigante en el footer y efectos suaves (reveal, parallax, contadores, marquee). Rehechas las 6 páginas (inicio, funciones, precios, seguridad, estudio, contacto), nav y footer. Datos 100% reales.

    Nuevo

    • 📰 Estilo editorial: crema cálido + acentos terracota/oliva + serif de revista
    • 🔢 Layout con numeración de secciones, reglas finas y drop-cap
    • ✒️ Wordmark gigante en el footer + nav editorial
    • 🎞 Efectos suaves: reveal-on-scroll, parallax tilt, contadores, marquee
    • 📄 Las 6 páginas rehechas con datos reales (20+ modelos, 23 tools, 8 OAuth)
  30. v9.2.1

    🔍 Fix: preview de documentos en chat ahora abre a pantalla completa

    El preview de pptx/docx desde la card del chat salía diminuto dentro de la propia card. Causa: la DocumentGenerationCard tiene backdrop-blur, que crea un "containing block" para position:fixed, así que el modal se quedaba atrapado dentro de la card en vez de ocupar la pantalla. Solución: renderizar el modal con un Portal a document.body para que escape y se abra a pantalla completa.

    Nuevo

    • Modal renderizado vía createPortal a document.body → pantalla completa

    Arreglado

    • 🐛 Preview del chat atrapado dentro de la card por el backdrop-blur (containing block de fixed)

1118 versiones publicadas · página 29 de 38. Míralo dentro de la app.