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. v8.60.0

    🎬 Análisis de vídeo (multimodal in)

    La IA ahora puede ENTENDER vídeos subidos (antes solo generaba). Sube un mp4/mov de hasta 30MB y 5min — el backend extrae 6 keyframes evenly-spaced con ffmpeg, transcribe el audio con Whisper (con timestamps por segmento), describe cada frame con gpt-4o-mini visión usando el transcript como contexto, y genera un resumen + 3-5 key moments con timestamps. Todo se inyecta como contexto en el system prompt para que el AI pueda responder cualquier pregunta sobre el vídeo (reuniones grabadas, tutoriales, vídeos de clientes, screencast de bugs). Auto-detección: con solo subir un vídeo se dispara el análisis, sin toggle nuevo.

    Nuevo

    • 🎬 Nuevo helper: src/lib/server/chat/tools/video-analysis.ts
    • 🎬 Endpoint dedicado: POST /api/video/analyze (file_id → análisis JSON)
    • 🎬 Bundlea @ffmpeg-installer/ffmpeg + fluent-ffmpeg (binarios para Linux serverless)
    • 🎬 Pipeline: descarga storage → audio mp3 → Whisper verbose_json → 6 frames JPG → gpt-4o-mini vision → resumen+moments
    • 🎬 Integrado en /api/chat: auto-detecta video/* mime en attachments y activa el análisis
    • 🎬 maxDuration 300s para procesar vídeos cortos sincrónicamente (Vercel Pro)
    • 🎬 Resultado se inyecta como contexto en system prompt + se guarda en meta_json.video_analyses
    • 🎬 Límites: 30MB / 5min / 6 frames / 2 vídeos por turno
  2. v8.59.2

    💾 Rescate de mensajes del asistente "desaparecidos"

    Bug: en chats dentro de carpetas (y otros casos), el usuario veía la respuesta del AI durante el streaming pero a los pocos segundos desaparecía. Causa: el INSERT del mensaje del asistente al final del streaming fallaba o se interrumpía (timeout, error de DB, cliente desconectado antes del INSERT), y aunque el cliente tenía el contenido en memoria, al refrescar o cambiar de chat se perdía porque el mensaje optimista solo vive en estado de React. Verificado en DB del usuario: conversación con user_msg pero asst_count=0 a pesar de respuesta vista. Fix: nuevo endpoint /api/messages/save-assistant-recovery que persiste el contenido huérfano cuando el INSERT principal falló. El frontend lo llama automáticamente cuando, tras 3 reintentos de loadMessages, no aparece el assistant en DB. Anti-duplicado: si el INSERT del stream sí persistió tarde, el endpoint detecta el contenido similar y skipea.

    Nuevo

    • 💾 Nuevo endpoint: /api/messages/save-assistant-recovery
    • 💾 Anti-duplicado: chequea assistants de los últimos 5min con mismo prefijo de contenido
    • 💾 Frontend (ChatInput.tsx) llama al recovery cuando el optimistic_local fallback se activa
    • 💾 Mensaje rescatado se marca con meta.recovery_insert para debugging
    • 🔍 Causa raíz: el optimistic_local solo vivía en estado de React, no persistía en DB
  3. v8.59.1

    🪞 /ios V11 iteración: más transparente + bordes con refracción visible

    Feedback: V11 quedaba demasiado gris/lechoso y no se veía cómo el cristal deformaba el fondo en los bordes. Dos bugs identificados y arreglados: (1) la recombinación de canales RGB usaba feComposite arithmetic (suma) que sobre-saturaba a gris/blanco — cambiado a feBlend mode="screen" que recombina correctamente sin engrisar. (2) Defaults demasiado tímidos en refracción y demasiado generosos en tint/highlights blancos — rebalanceados.

    Nuevo

    • 📐 scaleRatio 0.7 → 1.2 (refracción claramente visible en bordes)
    • 📐 glassThickness 6 → 12 (más profundidad de deformación)
    • 📐 bezelWidth 16 → 26 (zona de refracción más ancha)
    • 🪟 tintOpacity 0.10 → 0.03 (3% en vez de 10% — casi transparente)
    • 🪟 inner-shadow alpha 0.55 → 0.28 (menos blanqueo interno)
    • 🪟 top-highlight de 55% a 28% en el bezel superior
    • 🪟 pointer-specular opacity 0.85 → 0.7 + hot-spot 0.42 → 0.25
    • 🪟 backdrop background 0.02 → 0 (sin velo)
    • 🌈 aberrationStrength 0.015 → 0.018 (cromática un pelín más visible)

    Arreglado

    • 🐛 Fix crítico SVG: feComposite arithmetic → feBlend mode="screen" (no más saturación a gris)
  4. v8.59.0

    🪞 /ios v11: réplica fiel del Liquid Glass de Apple iOS 26

    Tras analizar la documentación de Apple, los repos open-source de referencia (liquid-glass-main, conor.fyi/liquid-glass-reference, nikdelvin/liquid-glass) y vídeos de WWDC 2025, añado la versión 11 del showcase /ios — la más fiel al cristal real de Apple. Mejoras concretas sobre V9/V10: aberración cromática real (3 displacement maps con IORs distintos por canal R/G/B), specular reactivo al puntero (la luz viaja siguiendo el cursor), press con bounce spring (scale 0.96 + cubic-bezier con overshoot), touch ripple (destello blanco desde el punto de click expandiéndose en 640ms), top edge highlight (luz cayendo desde arriba en el bezel, no en el centro). Defaults Apple-like: refracción mucho más sutil (scaleRatio 0.7, blur 0.6, glassThickness 6, bezelWidth 16) en vez de los V9/V10 exagerados.

    Nuevo

    • 🌈 Aberración cromática: SVG con 3 feDisplacementMap por canal RGB, IORs 1.515/1.500/1.485
    • 💡 Specular reactivo: radial-gradient hot-spot + halo amplio que siguen --v11-px/--v11-py via pointermove
    • 🎯 Press bounce: cubic-bezier(0.34, 1.56, 0.64, 1) — overshoot al soltar como SwiftUI .interactive()
    • 💫 Touch ripple: span expandiéndose scale(1→70) en 640ms con mix-blend-mode screen
    • Top edge highlight: linear-gradient(180deg, white 55% → transparent 30%) en el bezel superior
    • 📐 Defaults sutiles vs exagerados: scaleRatio 0.7 (era 1.0), blur 0.6 (era 1.5), glassThickness 6 (era 12)
    • 🏗️ Estructura por capas: backdrop → tint → pointer-specular → top-highlight → ripples → content
    • prefers-reduced-motion: ripple a 50ms y sin transform transitions
  5. v8.58.1

    🐛 Hotfix: "No se pudieron cargar los miembros" en Compartir carpeta

    Las policies RLS que añadí en la migración 078 sobre folder_shares hacían recursión infinita (un EXISTS sub-select sobre folder_shares dentro de la propia policy de folder_shares → Postgres lanza "infinite recursion detected in policy"). El usuario veía el toast "No se pudieron cargar los miembros" al abrir la tab de Compartir en FolderSettingsModal. Fix: usar la función SECURITY DEFINER folder_shared_role (bypasea RLS internamente) para chequear el rol admin en vez del sub-select recursivo. La migración 078 del repo ya está corregida para deploys desde cero, y la 080 arregla entornos donde la 078 antigua ya se aplicó.

    Nuevo

    • 🛡️ Migración 080 aplicada en producción (project GEIA / iuuuhhrwbteerxecxhlu)

    Arreglado

    • 🐛 Causa: EXISTS sub-select sobre folder_shares dentro de policy de folder_shares
    • 🔧 Fix: usar folder_shared_role() SECURITY DEFINER (no recursivo)
    • 📁 Migración 078 actualizada en el repo para que deploys desde cero no caigan en el bug
  6. v8.58.0

    📁 Sistema de carpetas: gran auditoría y arreglos

    Auditoría completa al sistema de carpetas con varios bugs serios resueltos y mejoras de UX. Lo más importante: las "columnas fantasma" (accent_color, is_favorite, parent_folder_id, banner_url, smart_filters_json, tablas folder_shares y folder_templates) ahora tienen migración SQL real (078) — antes existían solo en la base de datos creada a mano y cualquier deploy nuevo habría petado. Las carpetas compartidas ahora funcionan end-to-end (antes la UI permitía compartir pero el backend ignoraba al invitado). Las queries de contexto de carpeta van en paralelo. El inventario de archivos cap por tokens, no por filas. Modelo por defecto por carpeta. Toggle para aislar conocimientos. Multi-select + bulk move. Endpoint de búsqueda cross-folder.

    Nuevo

    • 🤝 Carpetas compartidas funcionan de verdad: instrucciones, memorias y archivos llegan al invitado
    • 🧠 Modelo por defecto por carpeta (default_model_slug) con picker en settings
    • ✂️ Dedup de archivos entre carpeta-RAG y knowledge-RAG (no más chunks duplicados)
    • 📐 Inventario de archivos: cap por tokens (~3500), no por filas — antes podía empujar fuera el contexto
    • 🌳 Carpetas anidadas: el sidebar ya tenía render-tree pero faltaba la columna parent_folder_id en la migración
    • 🔍 Endpoint /api/folders/search: busca carpetas, chats y archivos a través de TODAS las carpetas (propias + compartidas)
    • Multi-select + bulk move en FolderWelcomeScreen — botón "Seleccionar" + bar flotante "Mover a…"
    • 🗒️ Auto-cap de folder_memories: cuando una carpeta pasa de 80 memorias activas, las 20 más antiguas se desactivan (no se borran)

    Mejorado

    • 4 queries de contexto de carpeta paralelizadas (Promise.all, ahorra 60-150ms/mensaje)

    Seguridad

    • 🛡️ Migración 078: columnas fantasma + folder_shares + folder_templates + RLS completas
    • 🔒 Toggle inherit_model_knowledge para aislar carpetas del modelo global
  7. v8.57.0

    🧠 Conocimientos: clasificador LLM de intent (sin palabras clave)

    Mejora encima de v8.56.0. Antes el detector de "el usuario pide listar archivos" funcionaba con regex (lista cerrada de palabras: archivos, documentos, pdf, nóminas, facturas, etc.). Frágil con frases idiomáticas raras, otros idiomas o tipos de documento nuevos. Ahora hay un mini-LLM clasificador (gpt-4o-mini) paralelo al de Spotify intent: cuando la conversación tiene colección de conocimientos vinculada y el regex no matcheó, llama al LLM para decidir entre "list" (inyectar inventario) y "search" (búsqueda semántica). Coste despreciable (~$0.00005/llamada) y el regex sigue como fast path: el 80% de mensajes ni lo tocan. Cache 5 min en memoria por mensaje normalizado.

    Nuevo

    • 🧠 Nuevo helper: src/lib/server/chat/helpers/knowledge-intent-llm.ts
    • 🧠 gpt-4o-mini, timeout 4s, response_format JSON, temperature 0
    • 🧠 Gate doble: solo se llama si hay colección vinculada Y el regex no matcheó
    • 🧠 Soporta español, catalán e inglés de forma nativa
    • 🧠 Fallback silencioso a regex si el LLM falla/timeoutea

    Mejorado

    • 🧠 Cache 5 min en memoria (max 500 entradas, LRU básico)
  8. v8.56.0

    📚 Conocimientos: ahora enumera TODOS los archivos de la colección

    Bug: con una colección de conocimientos de 16 nóminas vinculada a una carpeta, al pedir "dime todas mis nóminas" solo aparecían 9 de 16 documentos. Causa: la búsqueda vectorial usaba p_match_count=8 (fallback 10) y la deduplicación de chunks→archivos ocurría DESPUÉS del límite, así que 16 PDFs casi idénticos colapsaban a ~9 docs únicos. Fix triple: (1) regex de "intent listar" ampliado para detectar nóminas/facturas/recibos/sueldos/contratos/etc., (2) cuando se detecta intent de listado y la conversación tiene colección de conocimientos, se inyecta el inventario COMPLETO de archivos en el system prompt (paralelo al patrón que ya teníamos para archivos de carpeta), (3) p_match_count escalado dinámicamente al nº de archivos (16 archivos → 32/48 en vez de 8/10).

    Nuevo

    • 📚 Regex ampliado: nóminas/facturas/recibos/sueldos/contratos/albaranes/tickets
    • 📚 Inventario completo de la colección inyectado como fuente autorizada cuando se pide listar/contar/enumerar
    • 📚 match_count dinámico: min(40, files×2) primario · min(48, files×3) fallback
    • 📚 Preview de primer chunk por archivo para que el modelo distinga cada nómina

    Arreglado

    • 📚 Bug resuelto: ahora salen los 16 archivos en lugar de 9 al listar nóminas
  9. v8.55.0

    🧩 Extensión Chrome: iconos actualizados con el nuevo logo

    La extensión Chrome "GarBotGPT — Web Capture" tenía sus iconos generados procedurally con canvas (gradient + G glyph dibujado a mano). Ahora usan el logo oficial NewLogoV2 (mismo source que /logo.png y todos los favicons). generate-icons.cjs reescrito de canvas a sharp con el mismo pipeline trim + padding 4% que usamos para los favicons. Iconos 16/32/48/128 regenerados. manifest.json version 1.0.0 → 1.1.0.

    Nuevo

    • 🧩 Source: scripts/NewLogoV2-source.png (mismo que favicons/logo)
    • 🧩 sharp con kernel lanczos3 + trim alpha + padding 4%
    • 🧩 Iconos 16/32/48/128 regenerados (~92% del canvas vs ~55% del dibujado anterior)
    • 🧩 manifest.json version 1.0.0 → 1.1.0 (para forzar update al reinstalar)

    Mejorado

    • 🧩 Coherencia visual: extensión + favicons + iconos PWA usan el mismo logo
  10. v8.54.1

    🔍 Favicons: logo más grande (trim del padding alpha)

    El PNG source NewLogoV2 (2).png tenía un padding alpha generoso alrededor del logo (visible: 683×704, archivo: 1254×1254 — el 45% era espacio transparente). Al hacer resize directamente, ese padding se escalaba también y el logo se veía pequeño en el favicon. Ahora con sharp.trim({ threshold: 10 }) se eliminan los bordes transparentes antes del resize y se añade un padding visual del 4% para no tocar bordes. Resultado: el logo ocupa ~92% del canvas (antes ~55%). Más visible en pestañas del navegador, home screen iOS/Android y todos los favicons.

    Nuevo

    • 🔍 sharp.trim({ threshold: 10 }) elimina padding alpha del PNG
    • 🔍 Logo ahora ocupa ~92% del canvas (antes ~55%)
    • 🔍 favicon.ico multi-size regenerado con el logo más grande

    Mejorado

    • 🔍 Padding visual del 4% del lado para balance visual
    • 🔍 Mejora visible en pestaña navegador + apple-touch-icon + android-chrome
  11. v8.54.0

    🖼️ Nuevo logo + favicons regenerados

    Reemplazado el logo de toda la app (sidebar, chat avatar, splash, login, etc.) con NewLogoV2 (2).png. Square 1254×1254 RGBA con alpha. Regenerados todos los assets de marca + favicons usando sharp con kernel lanczos3 (anti-aliasing premium): logo.png, logo-mark.png, logo-mark-transparent.png, logo-transparent.png, logo-square.png. Favicons 16/32/96/180/192/512. favicon.ico multi-size con png-to-ico. Source guardado en scripts/NewLogoV2-source.png para futuras regeneraciones. Nuevo script reutilizable scripts/generate-favicons-v3.cjs.

    Nuevo

    • 🖼️ Logo nuevo en TODAS las superficies (sidebar/chat/splash/login/menus)
    • 🖼️ 5 variantes generadas: logo, logo-mark, logo-mark-transparent, logo-transparent, logo-square
    • 🖼️ 6 favicons: 16/32/96/180 + android-chrome 192 + 512
    • 🖼️ favicon.ico multi-resolución (16+32+96) con png-to-ico
    • 🖼️ Resize con sharp kernel lanczos3 (mejor anti-aliasing)
    • 🖼️ PNG quality 95 + compressionLevel 9 (peso reducido)
    • 📝 scripts/generate-favicons-v3.cjs reutilizable para futuras actualizaciones
    • 📝 +png-to-ico ^3.0.0 devDependency
  12. v8.53.1

    🐛 Login: versión actualizada + logo nuevo

    Dos fixes en /auth/login. (1) El badge de versión arriba a la derecha mostraba "6.3.0" HARDCODED. La constante APP_VERSION existía y se actualizaba en cada release, pero el badge no la usaba. Ahora muestra "v{APP_VERSION}" dinámico. (2) El logo cargaba desde un WordPress externo (tecnofgb.com), inestable y lento. Cambiado a /logo.png local. Cuadrado 128-160px con drop-shadow violet sutil. Eliminada la versión duplicada del footer del card.

    Nuevo

    • 🖼️ Logo: WordPress externo → /logo.png local
    • 🖼️ Logo container w-32 h-32 (mobile) / w-40 h-40 (desktop), aspect 1:1
    • 🖼️ Drop-shadow violet (99,102,241,0.4) para resaltar sobre fondo oscuro
    • 🧹 Versión duplicada en el footer del card eliminada (ya estaba en el badge top)

    Arreglado

    • 🐛 Badge top-right: "6.3.0" hardcoded → v{APP_VERSION} dinámico
  13. v8.53.0

    ✨ SplashScreen rediseñado — premium pro

    Rediseño completo del splash al estilo de apps premium (Linear / Cron / Vercel). Antes: fondo blanco con un mesh sutil + logo + spinner. Ahora: fondo oscuro #0b0b14 con mesh gradient ANIMADO (3 orbs grandes con paths sinusoidales 8-10s), grain texture SVG, 12 partículas flotantes con animation paths, logo en card de liquid glass con halo pulsante + shine sweep diagonal que cruza cada 2.6s, wordmark "GarBotGPT" que aparece letra a letra con cascading + gradient text, tagline aleatorio de 4 opciones, progress bar real (0%→100%) con gradient indigo/violet/pink, version badge + skip hint en footer. Duración subida a 2.6s. Tap anywhere para saltar. Exit smoother con scale-down del logo + bg fade.

    Nuevo

    • Background dark #0b0b14 con vignette radial
    • 3 orbs mesh gradient (indigo/pink/orange) con paths animados
    • Grain texture SVG turbulence sutil (opacity 0.04)
    • 12 partículas flotantes con animation paths individuales
    • Logo card con liquid glass + border + halo pulsante
    • Shine sweep diagonal que cruza el logo cada 2.6s
    • Wordmark cascading: cada letra entrada con blur(4px)→0 + translateY
    • Gradient text en el wordmark (white → 70% white)
    • Tagline aleatorio de 4 ("Asistente IA empresarial" / "Tu segundo cerebro" / "Más que un chat" / "Inteligencia que crea")
    • Progress bar gradient indigo→violet→pink (no spinner)
    • Version + skip hint en footer con safe-area-inset-bottom
    • Tap/click anywhere → skip + exit animation
    • Duración 2s → 2.6s para apreciar la animación
    • prefers-reduced-motion: todo se desactiva
  14. v8.52.3

    🎬 Menú contextual: misma animación que el menú de 3 puntos del header

    Aplicada la animación mobile-header-menu-in al menú contextual de burbujas de chat. Es la misma que tiene el menú de 3 puntos del header móvil: bloom desde la esquina superior con clip-path round 999px → round 30px (efecto "burbuja que se expande"), scale 0.98→1.01→1, filter blur(3px)→0, total 340ms con cubic-bezier(0.2, 0.92, 0.22, 1). transform-origin: top right para que crezca desde la esquina del lado de la burbuja. Cada item dentro tiene stagger animation con delays 140/180/220/260ms para que aparezcan en cascada.

    Nuevo

    • 🎬 Clase mobile-header-popover aplicada al menú
    • 🎬 mobile-header-menu-in 0.34s con clip-path + scale + blur
    • 🎬 transform-origin: top right (lado de la burbuja propia)
    • 🎬 Contenido con animación mobile-header-menu-content-in (140ms delay)
    • 🎬 Cada item con mobile-header-menu-row-in (stagger 140-260ms)
    • 🎬 Mismo lenguaje cinético que el resto de overlays móviles
  15. v8.52.2

    📐 Menú contextual móvil: usar CSS right/left + margin 6px

    Sigue v8.52.1: el menú aún quedaba con espacio visible a la derecha. Cambio de estrategia: en lugar de calcular `left = viewportWidth - menuWidth - margin` (que depende de window.innerWidth correcto), uso CSS `right: 6px` o `left: 6px` directamente. Esto ancla el menú al edge de forma 100% fiable independientemente de viewport, zoom o safe areas. Margen reducido de 12px → 6px para quedar casi pegado al borde.

    Nuevo

    • 📐 Estrategia cambiada: CSS right/left directo en vez de cálculo aritmético
    • 📐 sideMargin 12 → 6px para casi tocar el borde
    • 📐 isOwnUserMessage: { right: 6px, left: auto }
    • 📐 !isOwnUserMessage: { left: 6px, right: auto }

    Arreglado

    • 📐 Independiente de bugs/inconsistencias de window.innerWidth
  16. v8.52.1

    💧 Menú contextual móvil: liquid glass + alineamiento al edge

    Dos refinamientos sobre v8.52.0. (1) Alineamiento: antes el menú se anclaba al borde de la burbuja, dejando un hueco en blanco entre el menú y el borde derecho del viewport si la burbuja no llegaba al edge. Ahora se ancla al BORDE DEL VIEWPORT (con margen 12px) — el menú siempre toca el lado del que viene la burbuja. (2) Aplicado liquid glass real con la nueva clase mobile-message-context-glass: gradientes radiales + lineales, backdrop-filter blur(28px) saturate(1.4) brightness(1.08) contrast(0.82), inset shadows con highlights blancos y subtle tinte violeta, edge highlight 95% white, sheen interno con linear-gradient para volumen. Mismo lenguaje que mobile-header-floating-control / bottom-nav-shell.

    Nuevo

    • 📐 left = viewportWidth - menuWidth - margin (para burbujas right-aligned)
    • 📐 Margen horizontal 16 → 12px
    • 💧 Nueva clase .mobile-message-context-glass en globals.css
    • 💧 Gradientes radial + linear apilados
    • 💧 backdrop-filter blur(28px) saturate(1.4) brightness(1.08) contrast(0.82)
    • 💧 Edge highlight 95% white + inset shadows con tinte violeta sutil
    • 💧 Pseudo-elementos ::before (sheen vertical) y ::after (rim light)
  17. v8.52.0

    📱 Menú contextual móvil estilo ChatGPT

    Rediseñado el menú de acciones que aparece al long-press en mensajes del usuario en móvil. Antes: aparecía un menú flotante + DUPLICADO de la burbuja en una posición arbitraria del touch, dejando la original borrosa detrás. Look raro. Ahora estilo ChatGPT mobile: la burbuja ORIGINAL se queda en su sitio (con un leve scale + ring blanco como destaque), aparece un scrim translúcido detrás, y el menú de acciones se ancla DEBAJO (o ENCIMA si no cabe) pegado al borde de la burbuja, alineado horizontalmente con ella. Sin duplicados.

    Nuevo

    • 📱 useRef en la burbuja del user para capturar getBoundingClientRect
    • 📱 mobileUserMenuPosition calcula left/top relativos a la burbuja
    • 📱 Espacio below vs above: elige el lado con más espacio
    • 📱 Right-aligned bubbles → menu alineado a la derecha; left → left
    • 📱 Burbuja sube z-[146] cuando menú abierto (encima del scrim)
    • 📱 Burbuja gana ring-2 white/40 + scale 1.005 + shadow elevated
    • 📱 Scrim bg-black/20 con blur-[2px] sutil
    • 📱 Eliminado el duplicado mobileUserMenuPreviewText y referencias
    • 📱 Animations mctx-fade + mctx-pop con cubic-bezier(0.22, 0.9, 0.24, 1)
    • 📱 Menu width 280px (antes 328px) más compacto
  18. v8.51.1

    ↩️ Revert: Sidebar vuelve al diseño anterior

    A petición del usuario, revertido el rediseño del sidebar de v8.51.0 al estado anterior (v8.50.0). El bug fix de clearActiveTools (la X que cerraba herramientas activas) SE MANTIENE — eso no se revierte porque resuelve un bug real. Solo se vuelve atrás el cambio visual del sidebar: buscar separado de filter, Apps section arriba, footer con email visible, ChatRow sin avatares ni preview.

    Nuevo

    • ↩️ git checkout 31a1398 -- SidebarSleek.tsx
    • ↩️ Vuelven: Buscar (botón) + Filter (input) separados
    • ↩️ Vuelve: Imágenes/Canales/Apps en el top
    • ↩️ Vuelve: footer con email visible debajo del nombre
    • ↩️ Vuelve: ChatRow compacto (h-9) con pin button + título

    Arreglado

    • Se MANTIENE el fix de clearActiveTools (no es regresión)
  19. v8.51.0

    🎨 Sidebar rediseñado · 🐛 Fix X tool no cerraba

    Dos paquetes. (1) BUG FIX: la X que limpia herramientas activas del composer no funcionaba cuando tenías App Builder/PPT/Imagen→Código/Mapa Mental/Quiz activos. clearActiveTools() no incluía los setters de las herramientas nuevas. (2) SIDEBAR rediseñado: buscar + filter unificados en un solo input con búsqueda inline + Enter para modal completa; Imágenes/Canales/Apps movidos al BOTTOM para dar espacio vertical a chats; footer compacto (solo avatar+nombre, email se ve en dropdown); avatares auto-generados por chat (hash del título → color HSL pastel + letra) en lugar de pin button. Preview opcional con context_summary o relative time bajo el título.

    Mejorado

    • 🎨 Sidebar: input buscar + filter unificados (placeholder "Buscar chats…")
    • 🎨 Enter en input → abre modal de búsqueda completa
    • 🎨 ⌘K hint visible dentro del input
    • 🎨 Apps section movida al footer (encima del user card)
    • 🎨 Footer compacto: avatar + nombre solo. Email visible en el dropdown
    • 🎨 ChatRow con avatar auto-generado (hash → HSL pastel + letra)
    • 🎨 Pin overlay 14×14 en esquina inferior derecha del avatar cuando anclado
    • 🎨 Row height 36px → 44px para dar espacio a título + sub-text
    • 🎨 Sub-text con context_summary (si existe) o relative time short (ahora/5m/2h/ayer)
    • 🎨 Mini-bar colapsado al hacer click en PanelLeftClose (ya existía, verificado)

    Arreglado

    • 🐛 clearActiveTools incluye setAppBuilder, setSlidesGeneration, setImageToCode, setMindMap, setQuizGeneration
  20. v8.50.0

    🧠 3 nuevas herramientas: Imagen→Código · Mapa Mental · Quiz

    Tres nuevas herramientas en el menú GENERAR del ChatInput. (1) IMAGEN → CÓDIGO: subes una screenshot/wireframe/mockup → la IA reproduce el diseño en React+Tailwind como artifact html. Killer para devs que quieren prototipar rápido (lo que hace v0.dev). (2) MAPA MENTAL: cualquier respuesta se devuelve como mindmap Mermaid en artifact navegable con jerarquía visual. Ideal para research y aprendizaje. (3) GENERADOR DE QUIZ: cualquier tema → 10 preguntas tipo test con 4 opciones y respuesta colapsable en <details>. Útil para estudiantes y profesores.

    Nuevo

    • 📸 Imagen → Código: usa GPT-4o vision con prompt específico → artifact html React+Tailwind via htm
    • 📸 Chip cyan en composer + icono ScanLine
    • 🧠 Mapa Mental: artifact type=mermaid con sintaxis mindmap → render SVG navegable
    • 🧠 Chip emerald + icono Network. 4-7 ramas, 8-30 nodos máx para legibilidad
    • 🎓 Quiz: markdown estructurado con 10 preguntas tipo test, respuestas en <details>
    • 🎓 Chip amber + icono GraduationCap. Dificultad progresiva, explicaciones
    • ⚙️ Pattern idéntico a App Builder/PPT: state + chip + body flag + system prompt
  21. v8.49.1

    🐛 Submenú "Más": fix clipping superior en viewports pequeños

    El submenú "Más" del ChatInput está anclado al bottom del trigger (bottom-0) y crece hacia arriba. Con las 4 secciones nuevas + 11 items, en viewports cortos los items de la sección "GENERAR" (los del tope) se salían por encima del viewport. Fix: useEffect que mide bounding rect del trigger y calcula maxHeight dinámico = rect.bottom - 16px. Si el contenido excede, scroll interno con scrollbar fino.

    Arreglado

    • 🐛 useRef + getBoundingClientRect del trigger "Más"
    • 🐛 useEffect recalcula maxHeight al abrir + en resize del viewport
    • 🐛 maxHeight = max(220, rect.bottom - 16) — siempre 220px mínimo
    • 🐛 overflow-y-auto + scrollbar fino + overscroll-contain
    • 🐛 Resultado: en cualquier viewport, todos los items del submenú visibles
  22. v8.49.0

    🧰 Menú de herramientas reorganizado por secciones

    El submenú "Más" del ChatInput desktop estaba desordenado — mezcla de items de generación, datos, avanzado e integraciones sin ningún agrupamiento visual. Ahora reorganizado en 4 secciones temáticas con cabeceras pequeñas en mayúsculas: GENERAR, DATOS Y ARCHIVOS, AVANZADO, INTEGRACIONES. Items relacionados juntos. Width 274px → 296px para más comodidad. Separadores 1px más finos.

    Nuevo

    • 🧰 4 secciones con cabeceras uppercase tracking-wider
    • 🧰 GENERAR: Documento, Presentación PPT, App Builder
    • 🧰 DATOS Y ARCHIVOS: Conocimientos, Hoja cálculo, Unidad red, BD
    • 🧰 AVANZADO: Modo agente, Reproductor música
    • 🧰 INTEGRACIONES: Google, Spotify, Microsoft
    • 🧰 Width submenú 274 → 296px, padding más cómodo (1.5 → 2)
    • 🧰 Separadores condicionales: solo aparecen si hay items en la sección
    • 🧰 "Más" button highlight cuando cualquier item de submenú activo
  23. v8.48.3

    🐛 Parser de artifacts tolera <artifact> sin cerrar

    Bug detectado en producción: el LLM (sobre todo App Builder con HTML largo) a veces emite la apertura <artifact id="..." type="html"> pero NO cierra con </artifact> al final (se queda corto en tokens, se trunca, o simplemente lo olvida). El parser regex strict no matcheaba sin closing tag → todo el HTML quedaba como texto crudo en el chat. Nuevo extractor extractArtifactBlocks() basado en índices: encuentra todas las aperturas, para cada una busca el </artifact> más cercano antes de la siguiente apertura o del fin del texto; si NO hay cierre, captura igual el contenido. Replaza de atrás hacia adelante para mantener índices válidos.

    Arreglado

    • 🐛 extractArtifactBlocks(): index-based scanner que tolera tags abiertas
    • 🐛 Si </artifact> no aparece, captura hasta siguiente <artifact ...> o EOF
    • 🐛 Case-insensitive en el closing tag
    • 🐛 Replace en orden reverso para que los índices no se descuadren
    • 🐛 Resultado: incluso si el LLM trunca/olvida el closing, no se filtra HTML al chat
  24. v8.48.2

    🐛 App Builder: HTML ya no se cuela en el chat (solo en artifact)

    Bug: cuando el usuario usaba el toggle App Builder, el LLM a veces ignoraba las tags <artifact> y envolvía el HTML completo en ```html ``` markdown, lo que hacía que TODO el código apareciera como bloque gigante en el chat además de (o en vez de) la card del artifact. Causa: el prompt usaba un ejemplo con ```html``` fence como ilustración y el LLM lo copiaba literalmente. Fix doble: (1) prompt rediseñado con ❌/✅ explícitos, ejemplos WITH <artifact> tags, sin ```html``` en ningún sitio. (2) Fallback parser server-side: si detecta un ```html``` fence con documento HTML completo (DOCTYPE/&lt;html&gt;) y NO hay <artifact> tag, lo convierte automáticamente en artifact. Igual para SVG. Cleanup stream-side actualizado para ocultar también ```html``` durante el streaming.

    Arreglado

    • 🐛 prompt-builders.ts: App Builder prompt rediseñado con ❌ MAL / ✅ BIEN explícito
    • 🐛 artifact-parser.ts: pass 2 fallback que detecta ```html``` con doc completo → auto artifact
    • 🐛 Idem para ```svg``` fences con SVGs completos
    • 🐛 MessageBubble cleanAssistantStreamContent oculta ```html``` durante stream con placeholder "Generando aplicación…"
    • 🐛 Resultado: con App Builder activo, el chat solo muestra el texto presentación + card, nunca el código
  25. v8.48.1

    📊 Toggle dedicado "Generar PPT" en el menú

    Nueva herramienta independiente "Generar PPT" en el menú de herramientas. Antes había que escribir keywords ("presentación", "powerpoint", "ppt", "slides", etc.) para que la IA generara un .pptx. Ahora basta con activar el toggle y la siguiente respuesta de la IA se exporta como .pptx automáticamente, da igual el wording del prompt. Chip naranja con icono Presentation.

    Nuevo

    • 📊 Store: nuevo slidesGeneration flag + setter
    • 📊 ChatInput: menu desktop + móvil con icono Presentation
    • 📊 Chip activo naranja con etiqueta "PPT"
    • 📊 Body request envía slides_generation: boolean
    • 📊 Route: cuando true → fuerza requestedDocumentFormat=pptx + effectiveDocumentGeneration=true sin importar keywords del mensaje
    • 📊 Útil para "hazme algo sobre el café" + toggle PPT → genera ppt aunque no digas "presentación"
  26. v8.48.0

    🚀 App Builder + Deploy a Vercel 1-click

    Nueva herramienta en el menú: App Builder. Activas el toggle, describes una app, y la IA genera una mini-aplicación web COMPLETA en un solo archivo HTML (React 18 desde esm.sh + Tailwind via CDN + cualquier librería ESM). Aparece como artifact tipo html, se renderiza inmediatamente en el panel lateral, totalmente funcional. Iteras con mensajes ("añade dark mode", "cambia el azul a verde"). NUEVO botón Rocket en el panel: "Deploy to Vercel" sube el HTML como sitio estático y devuelve URL pública real tipo nombre-xxxx.vercel.app en ~30s. Requiere VERCEL_TOKEN en env.

    Nuevo

    • 🚀 Nueva herramienta "App Builder" en el menú (chip violet con Wrench)
    • 🚀 buildAppBuilderPrompt(): instrucciones específicas para single-file React+Tailwind+htm
    • 🚀 La app es funcional desde el primer render (no placeholders)
    • 🚀 Iteración chat-based — IA reusa el mismo artifact id → versionado automático
    • 🚀 POST /api/deploy/vercel: usa Vercel API v13 con proyecto compartido garbotgpt-apps
    • 🚀 Validación de tamaño 800KB max + auth gate
    • 🚀 Botón Rocket en ArtifactPanel solo cuando type=html
    • ⚙️ Env vars: VERCEL_TOKEN (required), VERCEL_TEAM_ID, VERCEL_DEPLOY_PROJECT_NAME (defaults garbotgpt-apps)

    Arreglado

    • 🚀 DeployVercelDialog: loading/error/success con copy URL + abrir
  27. v8.47.0

    🧪 /ios v10: Playground completo de Apple Liquid Glass

    Nueva variante v10 en /ios — port DEL TODO del index.html de liquid-glass-main con TODOS los controles editables en vivo. v9 (preset) sigue ahí. La v10 incluye: panel lateral collapsible con sliders para width/height/border-radius, glass thickness, bezel width, refractive index, scale ratio, blur, specular opacity/saturation, inner shadow (color/blur/spread), glass tint (color/opacity), outer shadow blur. 5 backgrounds preset (cielo/flores/bosque/vivo/mosaico) + opción de pegar URL custom. Glass arrastrable. Botón reset. Solo Chromium para refracción SVG real; en otros navegadores la card seguirá pero sin la refracción física.

    Nuevo

    • 🧪 AppleLiquidGlassCard extendido con 7 props nuevas (scaleRatio, tintColor, tintOpacity, innerShadowColor/Blur/Spread, outerShadowBlur)
    • 🧪 hexToRgb helper para convertir colores a CSS vars rgba
    • 🧪 AppleLiquidGlassPlayground: state local con ~15 sliders + 2 color pickers
    • 🧪 Panel collapsible (toggle button cuando cerrado)
    • 🧪 Botón reset que restaura los defaults de v9
    • 🧪 5 backgrounds preset con thumbnails + input URL custom
    • 🧪 Sliders accent-indigo, valor mostrado en mono font con tabular-nums
    • 🧪 Sección "Editor en vivo" propia antes del grid v1-v8
  28. v8.46.0

    ⚙️ Settings Modal: versión móvil nativa (estilo iOS Settings)

    Rediseño del SettingsModal para móvil. Antes: el modal usaba el mismo layout que desktop con tabs en scroll horizontal arriba (texto pequeño, mala UX). Ahora: estilo iOS Settings app. (1) BOTTOM SHEET 92vh con rounded-t-3xl + drag handle indicator + slide-up animation. (2) Lista de tabs FULL-SCREEN cuando entras (cards grandes con icono color + label + chevron right). (3) Click en tab → contenido full-screen con header back "← Ajustes" + título de la tab centrado. (4) Save button full-width grande con safe-area-inset-bottom. Desktop sin cambios.

    Nuevo

    • 📱 Bottom sheet 92dvh, rounded-t-3xl, animación slide-up cubic-bezier
    • 📱 Drag handle indicator estilo iOS
    • 📱 Tabs como cards verticales grandes (icono + label + chevron)
    • 📱 Drill-down: click tab → contenido full-screen + back button
    • 📱 Header centrado con título de tab (absolute left-1/2)
    • 📱 Save button full-width 3px padding + safe-area-inset-bottom
    • 📱 mobileTabSelected state controla la navegación
    • 🖥️ Desktop sin cambios (sidebar + content side-by-side)
  29. v8.45.0

    🔥 Racha + 📊 Stats + 🏆 Logros (3 nuevos tabs en Ajustes)

    Tres tabs nuevas en el modal de Ajustes para gamificación e insights personales. (1) RACHA: contador de días consecutivos activos, mejor racha, días totales activos. Estilo Duolingo con flama amber. (2) ESTADÍSTICAS: mensajes totales, conversaciones, imágenes/documentos/artifacts generados, hora más activa, tu chat más largo, modelos más usados con barras de progreso. (3) LOGROS: 22 achievements desbloqueables en 4 tiers (bronce/plata/oro/platino) cubriendo categorías: mensajes, imágenes, documentos, artifacts, voz, racha, conversaciones, días activos. Progress bar con % desbloqueado. Unlock automático en cada visita.

    Nuevo

    • 🔥 GET /api/user-stats agrega mensajes, calcula streak, dispara unlocks
    • 🔥 22 achievements definidos en lib/achievements.ts
    • 📊 Top conversation + top hour + model usage ranking con barras
    • 📊 Streak: día actual / longest / total active days / last active date
    • 🏆 Auto-unlock de achievements en cada GET /api/user-stats
    • 🏆 Progress bar global con % de logros desbloqueados
    • ⚙️ 3 nuevas tabs en SettingsModal con iconos Flame/BarChart3/Trophy

    Mejorado

    • 🔥 4 tiers: bronze, silver, gold, platinum (paleta distinta cada uno)

    Seguridad

    • 🔥 DB: user_streaks + user_achievements tables con RLS
  30. v8.44.1

    ⌨️ Inline autocomplete (ghost text) en el textarea

    Mientras escribes, una sugerencia gris aparece después del cursor con el final probable de tu frase. Tab para aceptar. Tipo Cursor / GitHub Copilot pero en el input del chat. Usa gpt-4o-mini con contexto de los últimos 4 mensajes de la conversación. Debounce 450ms. Solo cuando el input cabe en una línea. Toggle por usuario via localStorage. Coste ~$0.00002 por sugerencia, despreciable.

    Nuevo

    • ⌨️ POST /api/chat/autocomplete con gpt-4o-mini
    • ⌨️ Hook useInlineAutocomplete con debounce 450ms + AbortController
    • ⌨️ Mirror div con texto invisible + suggestion gris + chip "Tab"
    • ⌨️ Tab key handler en handleKeyDown intercepta antes de Enter
    • ⌨️ Auto-cancela peticiones obsoletas al seguir tipeando
    • ⌨️ No completa si frase termina en puntuación (.!?)
    • ⌨️ Toggle via localStorage garbotgpt:autocomplete

1036 versiones publicadas · página 29 de 35. Míralo dentro de la app.