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.44.0

    📌 Pin messages · ✨ Reescribir para… · 📋 Auto-resumen

    Tres nuevas funciones de calidad de vida para el chat. (1) PIN MESSAGES: botón pin/unpin en cada mensaje. Los anclados aparecen en una barra sticky amber arriba del chat con preview clickeable que hace scroll smooth + flash. Útil para conversaciones de research largas. (2) REESCRIBIR PARA…: dropdown en respuestas IA con 8 audiencias: jefe, niño 8 años, experto, Twitter/X, email formal, casual, más corta, más detallada. Envía un nuevo prompt al chat con instrucciones de reformulación. (3) AUTO-RESUMEN: cuando el chat ≥50 mensajes, aparece icono FileText en el header. Click → modal con TL;DR estructurado (temas, decisiones, acciones pendientes) generado por gpt-4o-mini. Copy/regenerar/cerrar.

    Nuevo

    • 📌 meta_json.pinned guarda estado, optimistic update en store
    • 📌 PinnedMessagesBar: hasta 2 visibles + "+N más" expandible
    • 📌 Pin scroll-to-message con ring amber 1.5s flash al llegar
    • 📌 Ring amber permanente en mensajes anclados
    • RewriteMenu: dropdown con 8 opciones predefinidas + iconos
    • Custom event chatinput-send-prompt para comunicar con ChatInput
    • 📋 POST /api/conversations/[id]/summarize con gpt-4o-mini
    • 📋 ConversationSummaryModal con markdown structured (TL;DR/temas/decisiones/acciones)
    • 📋 Botón en header solo aparece cuando ≥50 mensajes
  2. v8.43.0

    🎯 Generación de presentaciones .pptx

    Nueva capacidad de generación de documentos: PowerPoint (.pptx). Junto a docx/pdf/xlsx/md/html/json/txt que ya teníamos. Detecta keywords "presentación, powerpoint, ppt, slides, diapositivas, deck, pitch deck" y genera un .pptx 16:9 con portada estilizada (gradient indigo→violeta lateral), slides H1/H2-driven, header bar de marca, footer con número de slide, paleta GarBotGPT consistente. El LLM recibe instrucciones específicas para estructurar el markdown por slides (cada ## es una slide, bullets cortos, 7-12 slides total).

    Nuevo

    • 📊 Librería pptxgenjs (4.0.1) para Node-compatible PPTX
    • 📊 GeneratedDocumentExt extendido con "pptx"
    • 📊 inferDocumentOutputFormat detecta presentación/powerpoint/ppt/slides/deck/pitch deck
    • 📊 Cada H1/H2 del markdown = nueva slide; bullets como bullets reales
    • 📊 Header bar "GarBotGPT" + footer con paginación
    • 📊 buildDocumentGenerationPrompt: instrucciones específicas para pptx
    • 📊 MessageBubble: icono Presentation naranja para .pptx

    Mejorado

    • 📊 buildPptxBufferFromMarkdown(): portada + slides 16:9, paleta indigo/violet/pink
  3. v8.42.2

    🎵 Spotify: cache 5min + cooldown global tras 429

    Los logs de Vercel confirmaron que el "no se encontró canciones" venía de Spotify devolviéndonos 429 Too Many Requests (rate-limit por app, compartido por todos los usuarios). El retry single-shot tampoco salvaba: ambos volvían 429. Ahora: (1) cache in-memory de 5min por búsqueda (query + filtro + count), evita hits repetidos cuando el usuario reintenta. (2) Cool-down global: cuando vemos 429 dos veces seguidas, marcamos RATE_LIMITED_UNTIL = now + Retry-After (o 60s default) y todas las búsquedas siguientes se cortocircuitan devolviendo [] sin pegarle a Spotify. (3) El mensaje al usuario diferencia: si fue rate-limit, dice "Spotify saturado, prueba en Xs"; si fue 0 resultados real, sugiere otro nombre. (4) Logs diagnósticos de v8.42.1 limpiados.

    Nuevo

    • RATE_LIMITED_UNTIL global, respeta Retry-After del header
    • Si search devuelve 429 dos veces, marca cooldown y devuelve []
    • isSpotifyRateLimited() expuesto al spotify tool
    • 💬 Mensaje al usuario diferencia rate-limit vs no-results
    • 💬 Mensaje rate-limit dice "Cooldown: Xs" con tiempo real restante
    • 🧹 Logs diagnósticos de v8.42.1 limpiados

    Mejorado

    • Cache LRU lite (max 100 entries, TTL 5min) en SEARCH_CACHE
  4. v8.42.1

    🔍 Spotify: logging diagnóstico temporal

    Logs temporales en searchSpotifyTracks para identificar por qué la búsqueda devolvía 0 tracks. Logs revelaron que era 429 Too Many Requests de Spotify. Limpiado en v8.42.2.

    Arreglado

    • 🔍 console.log + warn + error en fetchPage
  5. v8.42.0

    🧠 Spotify: LLM extrae artista/query/cantidad (sin depender de palabras clave)

    El clasificador LLM (gpt-4o-mini) ya devolvía la intención create/read/none, pero el regex de extracción de artista en deriveSpotifySearchIntent() seguía siendo el que decidía la búsqueda real. Eso fallaba con fraseología natural ("ponme algo de Rosalía", "música para correr", "mix de Bad Bunny en español"). Ahora el LLM extrae en la MISMA llamada: artist (nombre exacto capitalizado), searchQuery (semántico, traducido a inglés cuando no hay artista), y requestedCount. El spotify tool USA estos parámetros con prioridad absoluta. Fallback al regex solo si el LLM no extrajo nada o falla la llamada. Coste +1KB tokens output, ~$0.00005 por llamada.

    Nuevo

    • 🧠 Prompt LLM extiende JSON: action + confidence + artist + searchQuery + requestedCount
    • 🧠 LLM capitaliza ("michael jackson" → "Michael Jackson") y traduce queries a inglés
    • 🧠 SpotifyToolContext: nuevos llmArtist, llmSearchQuery, llmRequestedCount
    • 🧠 tools/spotify.ts: si hay llmArtist → query=`artist:"X"`; si solo llmSearchQuery → query libre
    • 🧠 Fallback automático al regex deriveSpotifySearchIntent() si LLM no aportó nada
    • 🧠 Ya no depende de palabras clave para fraseología natural
  6. v8.41.2

    🎵 Spotify: regex acepta "album/álbum/mix" como trigger

    Cambio MINIMAL sobre el revert de v8.41.1. El regex artistAfterDe en deriveSpotifySearchIntent() solo reconocía "playlist|lista|música|canciones|temas" como palabras que disparan la extracción del artista. Para "hazme un album de Michael Jackson" fallaba: no extraía el artista, caía al cleaned path con query="un Michael Jackson" sin artistFilter, Spotify devolvía mezcla rara o 0 tracks, y no aparecía la card. Ahora añadidas como triggers: album/albumes/álbum/álbumes/mix/recopilatorio/selección. NO se reintroduce el cache ni el 429 handling de la v8.33.26 anterior.

    Nuevo

    • 🎵 1 línea cambiada en deriveSpotifySearchIntent() (regex)
    • 🎵 "hazme un álbum de X" → ahora extrae X correctamente

    Mejorado

    • 🎵 Sin cache, sin rate-limit handling (lo demás sigue revertido)
  7. v8.41.1

    ↩️ Revert: Spotify a estado pre-v8.33.17

    A petición del usuario: Spotify revertido a su estado anterior a los cambios de v8.33.17 (estrategia artist-ID + top-tracks + albums). spotify-helpers.ts restaurado al commit 653fc80 (v8.33.15) y la reordenación de v8.40.0 en route.ts (effectiveSpotifyRead vs Create) deshecha. Resto del proyecto intacto.

    Nuevo

    • ↩️ spotify-helpers.ts: -439 líneas (vuelve a la implementación original)
    • ↩️ route.ts: effectiveSpotifyRead y Create vuelven a la lógica original

    Mejorado

    • ↩️ Sin ALBUM_CACHE, sin RATE_LIMITED_UNTIL, sin regex extendido de "album"

    Arreglado

    • ↩️ Resto del codebase intacto (artifacts, /ios showcase, bug fixes de edit, etc.)
  8. v8.41.0

    🎥 Fondo de vídeo en /ios + 🍎 v9 Apple iOS 26 (port oficial)

    Dos extensiones al showcase /ios para evaluar el liquid glass en condiciones reales: (1) nueva opción de fondo "Vídeo (movimiento real)" que usa el hero-bg.mp4 de la web para que la refracción se vea sobre contenido en movimiento. (2) Nueva variante v9 "Apple iOS 26" — port del repositorio liquid-glass-main de @lucasromerodb, con refracción física real usando SVG feDisplacementMap + perfil de refracción IOR calculado en canvas + specular highlights pre-renderizados. La card es ARRASTRABLE sobre el fondo para ver cómo refracta. Solo Chromium (Chrome/Edge); en Firefox/Safari fallback a blur normal.

    Nuevo

    • 🎥 Bg "Vídeo" usa <video> autoplay loop con hero-bg.mp4
    • 🎥 Overlay sutil top/bottom para legibilidad sin tapar movimiento
    • 🍎 v9 Apple iOS 26: AppleLiquidGlassCard.tsx (port de index.html)
    • 🍎 calculateRefractionProfile() con IOR + bezel + glass thickness
    • 🍎 generateDisplacementMap + generateSpecularMap en canvas
    • 🍎 SVG filter inyectado dynamically con dangerouslySetInnerHTML
    • 🍎 Drag handler: pointer events con clamp a parent bounds
    • 🍎 Sección "Destacado" propia antes del grid v1-v8
    • 🍎 Fallback elegante para navegadores sin backdrop-filter: url()
  9. v8.40.0

    🐛 Spotify "album de X" + Bug solapamiento mensaje editado

    Dos bugs corregidos: (1) "hazme un album de Michael Jackson" devolvía la lista de TUS playlists existentes en lugar de crear el álbum. Causa: el regex fallback de SpotifyRead capturaba la palabra "album" aunque el LLM ya hubiera clasificado la intención como CREATE, y AMBOS flujos (read + create) corrían en paralelo. Ahora el fallback de read solo se activa si NO hay create. (2) Al editar un mensaje con herramientas activas, la respuesta vieja del asistente quedaba visible arriba mientras la nueva se generaba abajo. Causa: race condition con Realtime que re-insertaba el mensaje viejo durante el streaming. Ahora se guarda pendingRegenAfterMessageId en el store y ChatArea oculta cualquier mensaje del asistente con created_at posterior hasta que termina la regeneración.

    Nuevo

    • 🎵 "album de X" ahora va al flujo de creación correctamente
    • ✏️ Edit + tools: nuevo pendingRegenAfterMessageId en chat-store
    • ✏️ MessageBubble: set/clear flag alrededor de regenerateFromHere
    • ✏️ ChatArea: filtro oculta assistant.created_at > edited_user.created_at

    Arreglado

    • 🎵 Fix Spotify: read fallback solo activa si !effectiveSpotifyCreate
    • ✏️ Cleanup en finally — también limpia si error/abort
  10. v8.39.0

    🖼️ /logos eliminada · /ios showcase · 🔍 Fullscreen artifact

    Tres cambios: (1) página /logos eliminada (LogosGallery + animaciones). (2) Nueva página /ios con 8 variantes de liquid glass Apple-style — frosted, specular reactive, SVG refraction, chromatic aberration, iridescent, mercurial, bubble lens, clean flat. Cada una sobre 4 fondos distintos (gradiente animado, cálido, frío, mesh oscuro) para evaluar comportamiento. Permite "elegir" una. (3) Nuevo botón de pantalla completa en el panel de artifacts: en desktop expande el panel a 100vw tapando el chat, con animación clip-path desde el lateral. Se restaura al cambiar de artifact.

    Nuevo

    • 🗑️ /logos, LogosGallery, _animated.ts → eliminados (rama git rm)
    • 🆕 /ios + LiquidGlassShowcase + liquid-glass-showcase.css
    • 🆕 8 variantes: frosted, specular, SVG refraction, chromatic, iridescent, mercurial, bubble lens, clean flat
    • 🆕 Background switcher 4 modos: gradient (animado), warm, cool, mesh
    • 🆕 Pointer-reactive: variante specular sigue al cursor con radial-gradient en --px/--py
    • 🆕 SVG filters: feTurbulence + feDisplacementMap para refracción real
    • 🔍 ArtifactPanel: nuevo botón Maximize2/Minimize2 entre Share y X
    • 🔍 Fullscreen toggle: 100vw + clip-path animation desde el lateral
    • 🔍 Auto-restore al cambiar de artifact
  11. v8.38.0

    🔍 Share full-screen + 💧 Liquid glass más neutro y reactivo

    Dos mejoras: (1) la página /share/artifact/{token} ahora muestra el artifact EDGE-TO-EDGE (sin padding ni card alrededor), ocupando todo el espacio entre header compacto y footer mínimo. Mucho más profesional para compartir. (2) Liquid glass del móvil rediseñado: saturación bajada de 1.8 a 1.4 para evitar reflejos "Aero" eléctricos sobre fondos coloridos, y añadido el ghost reflection: cuando presionas un control, el rim-light se desplaza al lado opuesto con inset shadows que simulan compresión física del cristal (tipo iOS 26).

    Nuevo

    • 🔍 SharedArtifactView: h-screen + flex-col, sin padding alrededor del preview
    • 🔍 Header y footer compactos (shrink-0) para maximizar el artifact area
    • 🔍 Code tab mantiene max-w-6xl para legibilidad en monitores wide
    • 💧 mobile-header-floating-control: saturate 1.8 → 1.4, brightness 1.2 → 1.1
    • 💧 mobile-header-title-lens: saturate 1.9 → 1.45, contrast 0.64 → 0.72
    • 💧 mobile-bottom-nav-shell + composer: saturación reducida proporcionalmente
    • 💧 Ghost reflection en :active de controles flotantes (shift, tilt, stretch)
    • 💧 mobile-bottom-nav-item:active con inset shadows que simulan compresión
  12. v8.37.2

    📏 Input del welcome más ancho en desktop

    El contenedor central del WelcomeScreen pasa de max-w-2xl (672px) a max-w-3xl (768px) para alinear el ancho del input inline con el del ChatInput dentro de un chat ya en curso. Las starter-prompts mantienen su max-w propio (sin cambio visual).

    Nuevo

    • 📏 WelcomeScreen container: max-w-2xl → max-w-3xl
    • 📏 Coherente con el max-w-3xl que ya tenía ChatInput por dentro
  13. v8.37.1

    🗑️ Herramienta "Base de datos" fuera del menú

    En v8.33.28 se desactivó efectivamente la herramienta de Base de Datos (effectiveToolPermissions.dbQuery = false) pero las entradas del menú de herramientas (desktop + móvil) seguían condicionadas a `toolPermissions.dbQuery` (raw permission del perfil), no a la efectiva. Resultado: si el usuario tenía la permission en BD, la entrada del menú aparecía aunque al clicar no hiciera nada. Ahora se gate por `effectiveToolPermissions.dbQuery`, así que desaparece para todos.

    Nuevo

    • 🗑️ Menú desktop: entrada "Base de datos" ya no aparece
    • 🗑️ Menú móvil: idem
    • 🗑️ Chip activo de DB tampoco se muestra (por sesiones viejas que lo tenían true)
    • 🗑️ Separador de sección recalculado para no quedar huérfano
  14. v8.37.0

    ⚡ Artifacts en vivo: panel se abre desde el primer token

    Mejora UX: el panel lateral ahora se abre AUTOMÁTICAMENTE en cuanto el LLM emite la primera etiqueta <artifact>, mostrando el código en tab "Código" mientras se escribe en tiempo real (con auto-scroll al fondo). Cuando detecta </artifact> al cerrar, cambia AUTO a tab "Preview" para mostrar el resultado renderizado. La card sigue apareciendo en el mensaje para re-abrir luego. Banner pulsante violeta "Generando en vivo…" mientras dura. Si el usuario cierra el panel manualmente durante el stream, se respeta y no se reabre. Para tipos que no toleran contenido parcial (react/mermaid/svg), la tab Preview muestra placeholder "Esperando a que termine…" con CTA al código.

    Mejorado

    • Panel abre desde el primer <artifact ...> detectado en el stream
    • Tab Código en vivo, auto-scroll al fondo mientras llegan tokens
    • Auto-switch a Preview cuando se detecta </artifact>
    • Banner pulsante "Generando en vivo…" mientras dura
    • Placeholder para react/mermaid/svg (no parsean contenido parcial)
    • Cierre manual durante stream respetado (no reabre)
    • parseStreamingArtifact() tolera tags abiertos sin cerrar
    • useArtifactStreamingSync() hook montado globalmente en ChatShell
  15. v8.36.0

    🚀 Artifacts Fase 3: React/Mermaid renderers + Share público

    Cierre del Canvas. (1) REACT en vivo: el LLM puede emitir <artifact type="react"> con JSX/TSX y se renderiza compilado con Sucrase en un iframe sandboxed con React 18 desde esm.sh. Soporta hooks, imports de react/react-dom, JSX runtime automático. (2) MERMAID: diagramas reales (no source code) renderizados con la librería oficial mermaid, lazy-loaded (~600KB solo cuando hay uno abierto). Maneja errores del parser. (3) SHARE PÚBLICO: botón "Compartir" en el panel genera un link UUID (/share/artifact/{token}) accesible sin login. La página pública tiene preview/code tabs, copy/download, contador de vistas y CTA a GarBotGPT. Snapshot completo en jsonb (sobrevive si el chat se borra). Límite 500KB por share.

    Nuevo

    • React live: Sucrase transpila JSX → iframe con React 18 (esm.sh) + importmap
    • React: hooks completos, export default detection, errores capturados
    • 📊 Mermaid: render real con librería oficial, lazy-loaded ~600KB
    • 🔗 API: POST /api/artifacts/share + GET /api/artifacts/share/[token]
    • 🔗 Página pública /share/artifact/{token} sin auth, view counter
    • 🔗 Snapshot jsonb del artifact (sobrevive si el chat origen se borra)
    • 🔗 Botón Share en el panel con dialog modal (UUID + copy + abrir)
    • 🔗 Open Graph metadata para previews enriquecidos al compartir

    Arreglado

    • 📊 Mermaid: muestra error del parser con código fuente si falla

    Seguridad

    • 🔗 Share público: tabla public_artifact_shares con RLS owner-only
  16. v8.35.0

    📚 Artifacts Fase 2: Versionado + Galería del chat

    Continuación del Canvas de v8.34.0. (1) VERSIONADO: cuando el usuario itera sobre un artifact ("ahora cámbialo a azul", "añade un botón") y la IA reutiliza el mismo id, ahora se guardan TODAS las iteraciones. En el panel aparece un navegador ◄ N/M ► con badges v1/v2/v3 — los históricos se ven con un banner amber "viendo versión anterior". El server recorre la conversación buscando artifacts con el mismo id en mensajes previos y los enlaza como historial. (2) GALERÍA: nuevo botón Boxes en el header (con badge contador) y entrada en el menú móvil → abre un modal con grid de TODOS los artifacts del chat actual. Búsqueda por título/tipo/lenguaje. Click en una card → se abre el panel.

    Nuevo

    • 📚 Versionado: panel muestra ◄ N/M ► cuando hay múltiples iteraciones del mismo id
    • 📚 Banner amber "viendo versión anterior" en históricas
    • 📚 Server: attachPriorVersions() consulta mensajes previos del chat
    • 📚 Instrucciones al LLM actualizadas: reutiliza el mismo id al iterar
    • 📚 Copy + Download usan la versión visible (no siempre la última)
    • 📚 Galería: nuevo botón en Header (desktop) con badge contador
    • 📚 Galería: entrada "Artifacts" en menú móvil (solo si hay)
    • 📚 Modal con grid, búsqueda por título/tipo/lenguaje, badge v2/v3 si tiene versiones
    • 📚 Hook useConversationArtifacts() recorre messages del store
  17. v8.34.0

    🎨 Artifacts (Canvas): panel lateral con preview en vivo

    Nueva feature mayor estilo Claude Canvas / ChatGPT Canvas. Cuando la IA genera contenido sustancial (HTML, código largo, SVG, documentos), aparece una card en el mensaje que abre un panel lateral con dos tabs: Preview (renderizado en vivo) y Código (con syntax highlight). En móvil se abre como modal full-screen. Soporta HTML (iframe sandboxed), Código (todos los lenguajes), Markdown (renderizado), SVG (inline sanitizado) y React (placeholder en MVP). El parser usa tags <artifact id type title language> emitidas por el LLM y las almacena en meta_json.artifacts para persistir entre sesiones.

    Mejorado

    • 🎨 Panel lateral split-pane (desktop) / modal full-screen (mobile)
    • 🎨 Tabs Preview / Código con switching instantáneo
    • 🎨 HTML preview en iframe sandbox (allow-scripts sin same-origin)
    • 🎨 SVG inline sanitizado (sin <script>, sin on* handlers, sin javascript:)
    • 🎨 Markdown renderizado con GFM + syntax highlight
    • 🎨 Acciones: copiar contenido + descargar con extensión correcta por lenguaje
    • 🎨 Card inline en el mensaje con icono por tipo, badge, líneas y caracteres
    • 🎨 Persistencia en meta_json.artifacts (sobrevive a reload)
    • 🎨 Durante streaming, los tags <artifact> se ocultan con placeholder "Generando artifact…"
    • 🎨 ESC cierra el panel
  18. v8.33.28

    🔄 Modelos: sync entre pestañas · 🗄️ Database tool eliminada

    Dos cambios: (1) El selector de modelos ahora se actualiza al INSTANTE entre pestañas — antes solo funcionaba si admin y chat estaban en la misma navegación. Añadido BroadcastChannel "garbotgpt:models" que emite cuando admin edita y los listeners en otras pestañas recargan automáticamente. (2) Herramienta "Base de datos" desactivada globalmente del chat (mismo patrón que Network Drive en v8.33.22). Pestaña "Conexiones BD" oculta del admin.

    Nuevo

    • 🔄 Throttle 500ms para evitar loops
    • 🔄 broadcast:false en listener para no re-emitir
    • 🗄️ Pestaña "Conexiones BD" oculta del admin (código intacto, descomentando se reactiva)

    Mejorado

    • 🔄 BroadcastChannel cross-tab: edita en pestaña admin → chat se actualiza al instante

    Seguridad

    • 🗄️ effectiveToolPermissions.dbQuery = false (no aparece en menú ni chips)
  19. v8.33.27

    ⚡ Cambios en modelos admin se aplican AL INSTANTE

    Bug: al editar el nombre de un modelo en /admin, el selector del chat tardaba hasta 5 minutos en mostrar el cambio. Causa: cache server-side de 5min en /api/models + flag loaded:true en Zustand store que bloqueaba el re-fetch. Fix: TTL bajado a 30s + invalidación instantánea desde admin (server clear + client reloadModels()) al crear/editar/eliminar/toggle visibility/bulk operations.

    Nuevo

    • Resultado: cambios visibles en el selector ANTES de 1 segundo

    Mejorado

    • /api/models cache: 5min → 30s + función exportada invalidateModelsCache()
    • /api/admin/models PATCH/POST/DELETE llaman invalidateModelsCache() tras éxito
    • models-store: nuevo método reloadModels() que ignora flag `loaded`
    • AdminPageClient: reloadModels() tras guardar (saveModel, deleteModel, toggleVisibility, bulkSet, bulkDelete)
  20. v8.33.26

    🎵 Spotify: bug "album de X" + cache + rate-limit handling

    Tres fixes Spotify: (1) "hazme un album de Michael Jackson" extraía 0 canciones porque la regex artistAfterDe no incluía "album" como keyword — solo aceptaba playlist/lista/musica/canciones/temas. Añadido album/álbum/mix/recopilatorio/selección. (2) Cache de búsqueda de álbumes por artista (TTL 30min) para reducir llamadas a Spotify. (3) Detección de rate-limit (429) con flag global por proceso (60s cooldown) y mensaje claro al usuario "Spotify saturado, espera 1 min" en lugar del genérico "no se encontraron canciones".

    Nuevo

    • 🎵 artistAfterDe regex incluye album/álbum/mix/recopilatorio/selección
    • 🚨 RATE_LIMITED_UNTIL flag por proceso (60s cooldown tras 429 doble)
    • 💬 Tool surface "Spotify saturado, espera ~1 min" cuando 429 detectado
    • 🧹 Reset debug array al inicio de cada runSpotifyTool

    Mejorado

    • 🎵 Fallback cleaned strip mejorado: un/una/el/la/los/las + más verbos
    • Cache global ALBUM_CACHE (Map) con TTL 30 min
    • Retry-After header respect en 429 (max 5s wait)
  21. v8.33.25

    🎨 NewLogoV2 G transparente · GarBotGPT capitalizado · 15 animados pro · Marca propia

    Cambios visuales y de marca: (1) NewLogoV2.png integrado con script remove-bg.cjs que elimina fondo blanco usando algoritmo saturation-based. Regenerados todos los favicons + android-chrome. (2) Todos los logos del wordmark ahora muestran "GarBotGPT" con capitales correctas (antes "garbotgpt" lowercase). (3) Añadidos 15 nuevos logos animados pro con texto "GarBotGPT": gradient flow, stagger fade, underline draw, orbit text, shimmer plata, neón GPT, wave ondulando, G rotando, breath, loading side, marquee infinito, terminal cursor, 3D flip, sparkles, mask reveal. (4) Landing rebrandeada: modelos GarBotGPT 5/Pro/Mini/Voice/Vision/Code en lugar de GPT/Claude/Gemini.

    Nuevo

    • 🎬 15 nuevos animados pro: 31-45 en _animated.ts (gradient flow, neón, shimmer, mask reveal, marquee, terminal, 3D flip, sparkles, etc.)
    • 🏷️ Landing actualizada: ModelChipGrid + ModelShowcase + features + pricing usan modelos propios
    • 🏷️ Play Store screenshots regenerados con chips de modelos propios

    Mejorado

    • 🎨 scripts/remove-bg.cjs: algoritmo saturation-based + luminance threshold
    • 🎨 NewLogoV2-transparent.png: fondo blanco eliminado limpio
    • 🎨 favicon + android-chrome regenerados con la nueva G
    • 🏷️ Marca propia: GarBotGPT 5 (top), Pro (balanceado), Mini (rápido), Voice (audio), Vision (imagen), Code (programación)

    Arreglado

    • ✍️ Wordmark "GarBotGPT" con capitales en TODOS los logos (22 ocurrencias arregladas)
  22. v8.33.24

    🎨 Liquid glass refinado · 📱 Play Store assets generados

    Refinamiento del estilo liquid glass: saturación bajada (1.6/1.7 → 1.10/1.12) para look "Apple optical" en vez de "glossy plastic", chromatic fringing sutil (cyan/amber) en bordes para simular refracción real, brightness más sutil. Script generador de assets para Google Play Store: feature graphic 1024×500 + 4 screenshots 1080×2400.

    Nuevo

    • 📱 scripts/generate-play-assets.cjs: feature-graphic 1024×500 + 4 screenshots 1080×2400
    • 📱 play-assets/ con todos los gráficos listos para subir

    Mejorado

    • 🎨 Liquid glass: saturate(1.6→1.10) / saturate(1.7→1.12) — más refinado, menos vibrante
    • 🎨 Brightness bajado de 1.03/1.04 a 1.01 (más sutil)
    • 🎨 Chromatic fringing: rgba(90,200,250) cyan + rgba(255,180,80) amber en bordes (sutil refracción)
    • 🎨 Blur dropdown: 16px → 20px para más profundidad
  23. v8.33.23

    🛠️ Input expandible · 🛡️ Privacy/Terms pro · 🎨 +36 logos nuevos · 🚫 Barça out

    Cuatro mejoras: (1) El composer del chat ahora se expande verticalmente igual que cuando se activan herramientas — el texto largo ya no se sale del contenedor. (2) Privacy y Terms rediseñadas con sticky TOC, jerarquía visual mejorada, tabla de procesadores con badges UE, email actualizado a garbot@garbotgpt.com. Splash deshabilitado en estas páginas + /landing + /maintenance. (3) Eliminado el componente BarcaChampions completamente (archivo + import + JSX). (4) Galería /logos: 12 nuevos con texto, 12 nuevos solo icono, 18 nuevos animados — total ahora ~80 logos.

    Nuevo

    • 🛠️ ChatInput: composer expande layout cuando multilínea (igual que has-tools)
    • 🛡️ /privacy: sticky TOC, hero gradient, 11 secciones con iconos, tabla de procesadores con badges UE/USA
    • 🛡️ /terms: sticky TOC, hero blue, 12 secciones (aceptación, uso aceptable, IA disclaimer, ley)
    • 📧 Email contacto actualizado: garbot@garbotgpt.com en ambas páginas
    • 🚫 Splash NO aparece en /privacy /terms /landing/* /maintenance
    • 🗑️ BarcaChampions eliminado: componente, import en layout.tsx, JSX
    • 🎬 /logos animados: +18 nuevos (Loading dots, Bouncing ball, Ripple multi, Rotating square, Progress bar, Eye blink, Sound emit, DNA helix, Lightning strike, Particle field, Typewriter, Pulse wordmark, Color shift, Morphing blob, Scanning line, Bouncing letters, Live network, Modern spinner)

    Mejorado

    • 🎨 /logos con texto: +12 nuevos (Condensed caps, Pixel perfect, Gradient fill, Thin italic, Asterisco, Glow pill, Outline stroke, Monograma círculo, Handwritten, Stacked bar, Arrow up, Bullet divider)
    • 🎨 /logos solo icono: +12 nuevos (Spark bold, Orb gradient profundo, Eye iris, Curl wave, Neural denso, Pacman bite, Cube stacked, Flame gradient, Chat cluster, Aperture, Compass, Quote marks)
  24. v8.33.22

    📚 Conocimientos mejorados + 🛑 Unidad de Red OFF + 🔓 Registro libre

    Tres mejoras grandes: (1) Sistema de conocimientos enriquecido con panel de métricas en vivo (chunks indexados, duplicados, idiomas, errores, última sync), búsqueda + filtros por estado en la lista, endpoint /stats y /reingest para reintentar items con error de un golpe. Paginación añadida al endpoint de items. (2) Tool de Unidad de Red desactivada globalmente — no aparece en el menú ni como chip activo (código intacto para reactivar). (3) Verificación de invitación al registrarse desactivada — cualquier email puede crear cuenta durante la beta.

    Nuevo

    • 🔍 Búsqueda por nombre de archivo + filtros (Todos / Errores / Duplicados / OK)
    • 🚀 Nuevo endpoint GET /api/admin/knowledge/[id]/stats con métricas completas
    • 🚀 Nuevo endpoint POST /api/admin/knowledge/[id]/reingest (scope: errors/duplicates/all)
    • 📄 Paginación en /api/admin/knowledge/[id]/items (limit, offset, q, status, duplicates filters)
    • 🔓 Register sin verificación: check-invitation comentado — cualquier email entra directo

    Arreglado

    • 📊 KnowledgeManagement: panel de stats (4 tiles + idiomas + última sync + tasa de error)
    • ♻️ Botón "Reintentar errores" reingiere automáticamente los items con sync_status=error

    Seguridad

    • 🚫 Tool Network Drive desactivada en ChatInput (effectiveToolPermissions.networkDriveRag → false)
  25. v8.33.20

    🛠️ Fix textareas: strings sin espacios desbordaban el input

    Strings largos sin espacios (ej. "fffffff...") rompían los textareas porque CSS por defecto no parte palabras a mitad. Resultado: el texto se extendía fuera del input visualmente. Fix: añadidas reglas break-words + [overflow-wrap:anywhere] en chat input (mobile + desktop), modales de carpeta (crear + ajustes) y plantillas.

    Nuevo

    • 🛠️ ChatInput (chat principal + welcome) — break-words + overflow-wrap:anywhere
    • 🛠️ CreateFolderModal — textarea de indicaciones con word-break
    • 🛠️ FolderSettingsModal — textareas de indicaciones del sistema y descripción de plantilla
    • Strings tipo "ffffff...." ahora se parten en cualquier carácter, no desbordan
    • assetlinks.json (v8.33.19): añadida huella SHA-256 de Play App Signing (Google) junto a la upload key
  26. v8.33.18

    🎵 Spotify: bug crítico — playlist mezclaba canciones de otros artistas

    Bug crítico de Spotify: al pedir "playlist de Michael Jackson" aparecían canciones de OTROS artistas para completar el número pedido. El código tenía un padding-with-allTracks que rellenaba con resultados generales cuando el filtro de artista no llegaba al count solicitado. Fix: cuando hay filtro de artista, NUNCA rellenar con tracks de otros — mejor devolver menos canciones correctas que el número exacto mezclado. Diagnóstico previo: Spotify deprecó /artists/{id}/top-tracks y /albums en nov 2024 (403/429). Estrategia actualizada usa /search?type=album + /albums/{id}/tracks.

    Nuevo

    • 🎵 Si pides 20 canciones de MJ y solo hay 9 únicas, recibes 9 correctas (no 20 mezcladas)
    • 🛠️ Nuevo endpoint admin /api/admin/spotify-test para diagnóstico (con debug bypass temporal)
    • 🛠️ Acumulación de errores en globalThis.__spotifyDebugErr para depurar Spotify API
    • 📌 Diagnosticado: /artists/{id}/top-tracks devuelve 403 desde nov 2024 (Spotify API policy)
    • 📌 Diagnosticado: /artists/{id}/albums devuelve 429 (rate limit estricto)
    • 🔧 Estrategia: usar /search?type=album (limit=20 max) + /albums/{id}/tracks

    Arreglado

    • 🎵 FIX crítico: artist-filter ya NO contamina con tracks de otros artistas
  27. v8.33.17

    🎵 Spotify intent: estrategia artist-ID + investigación

    Bug diagnosticado: search?q=artist:"X" devolvía mayoritariamente los mismos hits repetidos como remasters/lives. Dedup por nombre reducía 250 candidatos a ~9 únicos. Intentamos pivotar a /artists/{id}/top-tracks + /artists/{id}/albums pero descubrimos que están deprecados desde nov 2024 (403/429). Endpoint debug admin añadido.

    Nuevo

    • 🔍 normalizeTrackName quita variantes (Remaster/Live/Edit/Remix)
    • 🔍 Endpoint /api/admin/spotify-test para diagnóstico interno
    • 🔍 Logs detallados con console.info en cada paso
  28. v8.33.16

    🌐 Landing rehecha con datos reales (sin precios inventados)

    Las páginas de /landing tenían precios inventados (€19/€49) y certificaciones que no existen (SOC2 inflado). Reescritas con datos honestos: el producto está en beta abierta, 100% gratis, sin Stripe. Features listadas son las que están realmente cableadas en el código. Aesthetic upgrade general: bento grid, mejor tipografía, mejor hero, modelos reales, integraciones reales.

    Nuevo

    • 💸 Pricing: una sola card "€0 gratis durante la beta" + roadmap honesto de planes futuros
    • 🚫 Eliminados los planes €19/€49 ficticios (no hay Stripe ni billing)
    • Features solo reales: 14 tools cableadas (web search, RAG, código, imagen, vídeo, voz, BD, OCR, etc.)
    • Integraciones solo reales: Gmail, Outlook, Drive, OneDrive, Calendar, Spotify, GitHub, Monday
    • Modelos reales: GPT-5/4o, Claude 4.7, Gemini 2, Mistral, Llama, DeepSeek
    • 🛡️ Security: "honestos sobre lo que protegemos" — GDPR sí, SOC2 todavía no, sin inflar
    • 📖 About: manifesto auténtico + principios reales + sin VC

    Mejorado

    • 🎨 Bento grid de features con tamaños mixtos (más visual)
    • 🎨 Hero más grande (88px), badge "Beta abierta" en emerald
    • 🎨 Chat mock con tools chips reales y modelo Claude 4.7
    • 🎨 Background orbs + grid sutil + máscaras radiales en todas las páginas
  29. v8.33.15

    🎵 Spotify devuelve N pedidas · 🎨 /logos x3 tabs · 📂 carpetas recuerdan estado

    Cuatro mejoras: (1) Spotify ya entrega el número exacto de canciones pedidas — antes pedir 20 a veces devolvía 10 porque dedup por nombre y filtro de artista eran demasiado agresivos. (2) /logos ahora tiene 3 tabs: "Con texto" (38 lockups), "Solo icono" (38 símbolos), "Con movimiento" (12 logos animados con SMIL). Las versiones anteriores se mantienen — todo coexiste. (3) Las carpetas del sidebar recuerdan si estaban colapsadas al recargar la página. (4) Versión 8.33.15.

    Nuevo

    • 🎵 Spotify: 3 → 5 páginas (250 candidatos), padding con allTracks cuando artista no llega al needed
    • 🎵 Si pides 20 canciones, ahora recibes 20 (siempre que existan en Spotify)
    • 📂 Sidebar: carpetas colapsadas persisten en localStorage ("garbotgpt:sidebar:collapsedFolders")

    Mejorado

    • 🎨 /logos: 3 tabs activos — Con texto / Solo icono / Con movimiento
    • 🎨 38 lockups con texto (14 designer + 24 playful — no se borró nada)
    • 🎨 38 símbolos sin texto (14 designer + 24 playful)
    • 🎨 12 logos animados (SMIL <animate>): orbit, pulse, typing dots, soundwave, spinner G, heartbeat, aurora, quantum, glitch, sparkle, wave bars, breathing
  30. v8.33.14

    🛠️ Fix input vertical + 🌐 /landing multi-página + 🎵 Spotify LLM intent

    Tres mejoras: (1) Arreglado el bug donde al activar una herramienta el textarea del chat se reducía a 44px y el texto se renderizaba 1 char por línea — el wrapper no tenía grid-column asignado. (2) Nueva landing pública en /landing con 5 subpáginas (inicio, funciones, precios, seguridad, sobre, contacto), no aplicada como home. (3) Spotify: regex sustituido por clasificador LLM (gpt-4o-mini) que entiende cualquier fraseología.

    Nuevo

    • 🌐 /landing — landing page enterprise con hero, stats, features grid, integrations, testimonial, CTA
    • 🌐 /landing/features — 12 funciones detalladas con bullets
    • 🌐 /landing/pricing — 4 planes (Free/Pro/Business/Enterprise) + FAQ
    • 🌐 /landing/security — 6 pilares + tabla de compliance (GDPR, SOC2, ISO27001…)
    • 🌐 /landing/about — historia, principios, equipo
    • 🌐 /landing/contact — form decorativo + datos de contacto
    • 🎵 Spotify intent ahora por LLM (gpt-4o-mini): entiende "ponme algo para correr", "necesito música chill", etc., sin necesidad de palabras clave específicas
    • 🎵 Coste por clasificación: <$0.00003 — despreciable

    Arreglado

    • 🛠️ Fix textarea desktop: wrapper "composer-textarea-wrap" con grid-column 1/-1 correcto
    • 🎵 Fallback a regex si LLM falla — robustez total

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