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

    💾 Límite de almacenamiento por usuario + modal de usuario con tabs

    Dos mejoras en el panel admin → Usuarios. (1) Nuevo límite de almacenamiento por usuario: un admin puede establecer un tope en MB (con presets 500MB/1GB/5GB o "sin límite"). El upload de archivos verifica el uso actual vs el límite y rechaza la subida si lo excede. El modal muestra una barra con el uso actual del usuario. (2) El modal de edición de usuario rediseñado: más grande (max-w-2xl) y organizado en 3 tabs — Perfil, Cuenta y seguridad, Permisos y límites — en vez de un scroll largo. La self-hosted Supabase (supabase.garbotgpt.com) pasa a ser la DB activa.

    Nuevo

    • 💾 Nuevo campo storage_limit_mb por usuario (migración 089)
    • 🚫 Enforcement en /api/files/upload: rechaza subida con 413 si supera el límite
    • 📊 Barra de uso de almacenamiento en el modal (verde/ámbar/rojo según %)
    • 🔐 GET /api/admin/users ahora devuelve storage_used_bytes (SUM de archivos) por usuario
    • 🗄 DB activa migrada a self-hosted supabase.garbotgpt.com

    Mejorado

    • 🎚 Presets rápidos de límite: 500 MB · 1 GB · 5 GB · Sin límite

    Seguridad

    • 🗂 Modal de usuario rediseñado con 3 tabs (Perfil · Cuenta y seguridad · Permisos y límites) y más grande
  2. v8.94.0

    👁 Visor de documentos in-app en "Mis Archivos"

    Antes, al clicar un archivo se abría una pestaña nueva que normalmente lo descargaba (sobre todo Office docs). Ahora se abre un visor full-screen integrado que previsualiza el documento según su tipo: imágenes, PDFs e iframe, vídeo/audio con reproductor, Office (.docx/.xlsx/.pptx) con el visor de Microsoft Office Online (vía URL firmada temporal), y texto/código/markdown/csv renderizado. Si un tipo no se puede previsualizar, ofrece descarga. Botones de Abrir en pestaña y Descargar en la toolbar, cierre con Esc.

    Nuevo

    • 👁 Visor full-screen con toolbar (Abrir / Descargar / Cerrar con Esc)
    • 🖼 Imágenes: render directo · 📄 PDF: iframe inline
    • 🎬 Vídeo y 🔊 audio: reproductor nativo embebido
    • 📊 Office (.docx/.xlsx/.pptx): visor de Microsoft Office Online vía URL firmada temporal (10 min)
    • 📝 Texto/código/markdown/csv: contenido renderizado (cap 200KB)
    • 🆕 Endpoint /api/files/[id]/signed-url para generar la URL firmada del visor Office

    Mejorado

    • ⬇ Fallback a descarga para tipos no previsualizables
  3. v8.93.0

    🎨 "Mis Archivos" rediseñada por completo

    Rediseño total de la página /my-files. Antes era una tabla plana y gris. Ahora tiene: hero con icono degradado, 4 stats cards (archivos, indexados, procesando, espacio), barra de almacenamiento usado (cuota visual 5GB), iconos coloreados por tipo de archivo (PDF rojo, imagen fucsia, docx azul, pptx naranja, xlsx verde, etc.), filas tipo card con hover lift, badges de estado mejorados y mejores empty states. Soporte dark mode completo.

    Nuevo

    • 📊 4 stats cards: Archivos · Indexados · Procesando · Espacio usado
    • 🌈 Iconos coloreados por tipo: PDF rojo, imagen fucsia, vídeo rosa, audio cian, docx azul, pptx naranja, xlsx verde, código slate, zip ámbar
    • 🃏 Filas tipo card con sombra + hover lift en vez de tabla plana
    • 🔍 Búsqueda con focus ring + filtros pill con degradado activo
    • ✨ Topbar sticky con blur, mejores empty/loading states, Enter para guardar rename

    Mejorado

    • 🎨 Hero con icono degradado violeta→fucsia + subtítulo descriptivo
    • 💾 Barra de almacenamiento usado (cuota visual 5GB, se pone roja >90%)
  4. v8.92.0

    📁 "Mis Archivos" añadido al menú de usuario (desktop + móvil)

    La sección "Mis Archivos" (/my-files) solo era accesible desde la sidebar. Ahora aparece también en el menú desplegable del avatar (desktop) y en el menú de acciones (móvil), junto a Calendario y Changelog.

    Nuevo

    • 📁 Link "Mis Archivos" en el dropdown del avatar (Header.tsx desktop)
    • 📱 Entrada "Mis Archivos" en el menú de acciones móvil (MobileHeader.tsx)

    Mejorado

    • 🎨 Icono FileText ámbar para consistencia visual
  5. v8.91.0

    🎙 Voz: fix DEFINITIVO de bubbles que desaparecían + fix doble bubble en tool calls

    Dos fixes críticos del modo voz. (1) Las bubbles del modo voz desaparecían tras un rato porque mergeServerMessagesWithOptimistic en chat-store.ts wipea cualquier mensaje local que NO tenga meta.optimistic_local=true cuando loadMessages se ejecuta. Marcamos todos los addMessage del modo voz como optimistic_local + persistimos optimistic_client_message_id en DB para matching robusto. (2) Cuando se activaba un tool aparecía una bubble "[Respuesta de voz sin transcripcion]" antes de la respuesta real. Causa: response.done se dispara también para el turn que solo contiene function_call (sin texto). Ahora detectamos isFunctionCallOnly y skipeamos el bubble — solo creamos uno con la respuesta tras sendToolOutput.

    Nuevo

    • 🔇 Eliminado log ruidoso "response.audio.delta received" (se disparaba cada frame de audio)

    Mejorado

    • 🔗 Persistimos optimistic_client_message_id en DB para que matchesOptimisticWithPersisted matchee perfectamente

    Arreglado

    • 🐛 Fix DEFINITIVO bubbles voz: meta.optimistic_local=true en todos los addMessage del modo voz (user placeholder, AI deltas, AI final, generated image)
    • 🐛 Fix doble bubble en tools: response.done con solo function_call items NO crea bubble (se espera el response.done del follow-up tras sendToolOutput)
  6. v8.90.0

    🎙 GarBotGPT-Voz: 4 tools nuevas + identidad reforzada + fix bubbles que desaparecían

    Dos mejoras grandes al modo voz: (1) Las burbujas del usuario que aparecían un segundo y desaparecían eran porque updateMessage ignora silenciosamente IDs no presentes en el store (FIX 7.11.0) — si un loadMessages se disparaba entre handleSpeechCommitted y handleTranscript, el placeholder se wipeaba y el bubble nunca volvía. Ahora si el placeholder ya no existe, se re-añade con addMessage. (2) Añadidas 4 herramientas nuevas a GarBotGPT-Voz: youtube_search, save_memory, get_current_datetime, generate_image. System prompt reescrito con identidad fuerte "GarBotGPT-Voz" y descripción completa de capacidades.

    Nuevo

    • 🆕 Tool youtube_search: busca videos en YouTube (scrape ligero, sin API key)
    • 🆕 Tool save_memory: el usuario dice "recuerda que..." y GarBotGPT-Voz lo persiste en la tabla memories (scope user)
    • 🆕 Tool get_current_datetime: handler local (sin fetch) para "qué hora es" / "qué día es hoy"
    • 🆕 Tool generate_image: genera imagen via /api/image/generate y la inserta como attachment en el chat
    • 🎭 System prompt v8.90 con identidad "GarBotGPT-Voz, asistente conversacional con acceso completo a las herramientas de GarBotGPT"
    • 📋 Reglas explícitas por tool en el prompt: cuándo usar cada una y cómo presentar resultados en voz
    • ✅ Total tools en voz: 7 (web_search, network_search, db_query, youtube_search, save_memory, get_current_datetime, generate_image)

    Arreglado

    • 🐛 Fix bubbles desapareciendo: handleTranscript verifica si el placeholder sigue en store y lo re-añade si no
  7. v8.89.0

    🎙 Voz: arreglada transcripción + bubble del usuario (eventos GA renombrados)

    El nuevo modelo `gpt-realtime-mini` (GA) envía eventos con nombres distintos al Beta: `response.audio_transcript.*` → `response.output_audio_transcript.*`, y el `session.update` GA anida `turn_detection` y `transcription` dentro de `audio.input`. Nuestro hook escuchaba los nombres viejos → no llegaba transcripción ni del usuario ni del asistente (síntoma: "[Respuesta de voz sin transcripcion]" en bucle y sin bubble del usuario). Arreglado migrando todos los handlers + payload a formato GA.

    Nuevo

    • 🔧 session.update migrado a formato GA: `output_modalities`, `audio.input.{transcription,turn_detection}`, `audio.output.voice`
    • ✅ Compat: los handlers Beta antiguos se mantienen (case fall-through) por si en algún momento revertimos
    • 👤 Ahora aparece la bubble del usuario inmediatamente al hablar + transcripción real al terminar
    • 🤖 Ahora aparece transcripción real del asistente en vez del fallback "[Respuesta de voz sin transcripcion]"

    Arreglado

    • 🐛 Eventos GA añadidos: response.output_audio.delta/done · response.output_audio_transcript.delta/done · response.output_text.delta/done · conversation.item.input_audio_transcription.delta
  8. v8.88.0

    🎙 Voz: migración a gpt-realtime-mini (GA) — el preview anterior está deprecado

    OpenAI deprecó la familia `*-realtime-preview`. Migrado el default del modo voz a `gpt-realtime-mini` (modelo GA oficial). Mismo precio (~$10/$20 por 1M tokens audio in/out), mejor latencia (~400ms) y soporte completo GA: interrupciones nativas, function calling estable, image input y mejor calidad de voz. La cuenta ahora tiene acceso a los 4 modelos GA (gpt-realtime, gpt-realtime-mini, gpt-realtime-1.5 y gpt-realtime-2 — verificado HTTP 200 en client_secrets).

    Nuevo

    • ✅ Default migrado: `gpt-4o-mini-realtime-preview` → `gpt-realtime-mini`
    • 🆕 Modelos GA accesibles: gpt-realtime · gpt-realtime-mini · gpt-realtime-1.5 · gpt-realtime-2
    • 💰 Mini sigue siendo 3× más barato que los full (~$10/$20 vs ~$32/$64 por 1M tokens audio)
    • 🔧 Cambio en src/app/api/voice/session/route.ts + src/hooks/useRealtimeVoice.ts

    Mejorado

    • ⚡ Latencia ~400ms (vs ~600ms del preview anterior)
  9. v8.87.0

    🔇 Botón mute arreglado + voice card en posición correcta en Welcome

    Dos fixes UX del modo voz: el botón mute no cambiaba visualmente (la lógica retornaba sin tocar state si el audio stream no estaba listo) y la voice card aparecía abajo en welcome (donde no hay composer). Ahora el mute siempre toggle el state + aplica al stream si está disponible, y la voice card en welcome se ancla encima del input centrado mediante CSS var --welcome-input-top expuesta por el WelcomeScreen.

    Nuevo

    • 📍 Voice card en welcome: top var(--welcome-input-top) + translateY(-100%) = justo encima del input centrado
    • 📏 WelcomeScreen expone posición Y del input vía useEffect + ResizeObserver

    Mejorado

    • ⬆ Cuando voiceModalOpen, el wrapper del input del welcome tiene mt-32 extra para empujar elementos arriba y dejar hueco visual

    Arreglado

    • 🐛 toggleMute: setIsMuted(prev => !prev) primero, aplica a stream solo si existe. Antes retornaba si stream era null y el state no cambiaba.
  10. v8.86.0

    🎙 Voz: modelo default cambiado a gpt-4o-mini-realtime-preview (gpt-realtime requería acceso)

    El endpoint GA /v1/realtime/calls funciona perfecto, pero el modelo `gpt-realtime` (unified GA) requiere acceso especial que esta API key no tiene. Probé los modelos disponibles y todos los `*-realtime-preview` SÍ funcionan. Cambiado default a `gpt-4o-mini-realtime-preview` (más barato).

    Nuevo

    • ✅ Probados con HTTP 200: gpt-4o-realtime-preview · gpt-4o-realtime-preview-2024-12-17 · gpt-4o-mini-realtime-preview · gpt-realtime-mini
    • 💰 Default a gpt-4o-mini-realtime-preview (más barato que la versión full)

    Mejorado

    • 🔧 Si quieres usar gpt-realtime (unificado), solicita acceso a OpenAI o cámbialo en la UI

    Arreglado

    • 🐛 Error 403 model_not_found con `gpt-realtime` → confirmado por curl directo
  11. v8.85.0

    🎙 Voz — endpoint WebRTC GA descubierto: /v1/realtime/calls

    OpenAI también deprecó el endpoint WebRTC Beta /v1/realtime?model=X (no solo /v1/realtime/sessions). El nuevo GA es /v1/realtime/calls (sin query model, el modelo va en el ephemeral key). Probado con curl: ya no devuelve "Beta API no longer supported" sino que acepta el SDP correctamente.

    Nuevo

    • ✅ Nuevo endpoint GA: POST https://api.openai.com/v1/realtime/calls
    • ✅ El modelo ya NO va en query string — viene dentro del ephemeral token
    • 🔧 useRealtimeVoice.ts línea ~648 actualizado

    Arreglado

    • 🐛 SDP exchange daba 400 con "beta_api_shape_disabled" porque el endpoint WebRTC también era Beta
  12. v8.84.0

    🎙 Voz: error real visible + voice "marin"→"alloy" client + acepta value en root

    Si la conexión voz falla, ahora muestra el error real de OpenAI/Vercel en la pantalla en vez del genérico "No se pudo conectar". También arregla 2 detalles del cliente: voice default "marin" (que ya no existe) cambiado a "alloy" en useRealtimeVoice, y el extractor de ephemeral key ahora acepta `value` en root (formato GA) además del legacy `client_secret.value`.

    Nuevo

    • 🔧 Ephemeral key extractor acepta `session.value` (GA) + `session.client_secret.value` (legacy)
    • ✨ stop() limpia errorMessage al cerrar el modal

    Mejorado

    • 📢 Hook expone errorMessage al UI

    Arreglado

    • 🐛 Voice default "marin" en useRealtimeVoice cambiado a "alloy" (sin la voz no existe ya)
    • 👁 Modal muestra el error real (con prefix "Session:" o "SDP NNN:") en vez del genérico
    • 🗒 Console log con detail del error real para debug en DevTools
  13. v8.83.0

    🎙 Modo voz arreglado de verdad — OpenAI deprecó la Beta API

    OpenAI deprecó completamente el endpoint Beta /v1/realtime/sessions con error "The Realtime Beta API is no longer supported". Migrado al nuevo endpoint GA /v1/realtime/client_secrets con nueva forma del body. Modelo default actualizado a gpt-realtime (unificado GA). Mi fix anterior (v8.74.0) solo cambiaba modelo dentro del mismo endpoint Beta deprecated.

    Nuevo

    • ✅ Nuevo endpoint: POST /v1/realtime/client_secrets
    • ✅ Nuevo body: { session: { type: "realtime", model, audio: { output: { voice } } } }
    • ✅ Nuevo response: { value, expires_at, session: {...} } en lugar de { client_secret: { value, expires_at } }
    • 🔧 Response adapter: mantengo backward-compat exponiendo client_secret.value para el hook cliente
    • 🤖 Modelo default: gpt-realtime (GA unificado) en lugar de gpt-4o-mini-realtime-preview-2024-12-17
    • 🔇 Voice default: alloy (sigue funcionando)
    • 📡 useRealtimeVoice.ts actualizado a gpt-realtime en 3 lugares

    Arreglado

    • 🐛 Root cause: OpenAI deprecó /v1/realtime/sessions (no era el modelo, era el endpoint entero)
  14. v8.82.0

    🎨 Landing rediseñada estilo corporativo geeconomics (blanco + azul)

    Landing rehecha 100% con estilo institucional moderno tipo geeconomics.com: blanco + azul corporativo #0066CC + numeración editorial 01/02/03 + sin gradientes flashy. Layout, navbar y footer también actualizados al nuevo estilo. Reemplaza la versión navy+dorado anterior.

    Nuevo

    • 📐 Layout sobrio: sin gradientes ni glow, mucho espacio en blanco, tipografía sans light/medium
    • 🔢 Numeración estilo editorial — 01/02/03/04/05/06 antes de cada sección
    • 🧭 Navbar nuevo: blanco sticky, links con underline azul al activo, mobile con números
    • 🦶 Footer 4 columnas con icons contacto + numeración en columnas + DPA/GDPR links
    • 📰 Hero editorial 2 columnas: headline italic+regular + sub + CTAs + 4 stats inline
    • ✍ Sección "Desde 2026" estilo "Desde 1989" institucional con texto largo + CTA underline
    • 🛠 Servicios: 3 columnas grid divididas por líneas zinc-200, hover ArrowUpRight
    • 🏢 Modelos: 6 cards proveedores (OpenAI/Anthropic/Google/Meta/Mistral/DeepSeek)
    • 📋 Casos de uso: tabla editorial con 5 filas hover, num·área·título·tools
    • 💬 Quote editorial centrada con líneas separadoras y comillas azules
    • 📞 Contacto: 3 items (mail/phone/office) en grid divided

    Mejorado

    • 🎨 Paleta: bg white + #fafafa + text #1f1f1f + accent #0066CC (azul corporativo)
    • 🎨 Light theme completo — sin dark mode en landing (el chat sigue independiente)

    Seguridad

    • 🔒 Seguridad: split 2 columnas con 4 facts grid + CTA underline
  15. v8.81.0

    ✨ Landing rediseñada completa — paleta navy + dorado, estilo premium

    Landing principal /landing reescrita 100% con nueva paleta navy oscuro + dorado y estructura totalmente nueva (12 secciones). Estilo elegante tipo Stripe/Apple/Linear pero con touch premium dorado. Aurora background, mockup de chat realista, 3 pilares, tool groups, casos de uso editoriales, audit log showcase, stats grandes, pricing 3 tiers, FAQ y CTA final.

    Nuevo

    • 🚀 Hero: eyebrow + headline 2 líneas (white + gradient gold) + CTAs duales + trust badges
    • 💼 Modelo strip: social proof con providers (OpenAI, Anthropic, Google, Meta, Mistral, DeepSeek)
    • 🎯 3 Pilares: Unifica stack · Conecta tu mundo · Tuyo de verdad (con números 01-03)
    • 🛠 4 grupos de tools categorizadas: Conocimiento · Creación · Documentos · Datos&Código
    • 📰 4 Use Cases formato editorial con pasos numerados (Operaciones · Comercial · Soporte · Producto)
    • 📊 Stats band gigante: 20+ modelos · 23 tools · 8 OAuth · ∞ self-host
    • 🔌 IntegrationPill hover dorado para las 10 plataformas
    • ❓ FAQ con 6 preguntas (gratis, training, claves propias, self-host, GDPR, app móvil)
    • 🎯 CTA final con icono dorado + headline + 2 botones

    Mejorado

    • 🎨 Paleta nueva: navy oscuro (#050a14 → #0a1628) + dorado (#d4af37, #f5d97a)
    • 🌅 NavyAuroraBackground: gradiente base + orbs azul/dorado + grid sutil
    • 💎 Pricing 3 tarjetas: Free · Pro (highlighted gold) · Empresa
    • 🎬 Hero mockup chat: cards de tools + respuesta con file generado descargable

    Seguridad

    • 🛡 Security Showcase mockup: audit log en vivo + 3 badges (RLS · EU only · Status 99.9%)
  16. v8.80.0

    🌐 /landing/features actualizado con TODAS las tools y funciones (50+ items)

    Página de features reescrita con todo lo real: 23 tools (chat normal + nuevas), 8 integraciones OAuth, colaboración en vivo, agentes autónomos, empresa/admin/seguridad, UX y multi-idioma. 7 categorías, 50+ tarjetas. Anclas por sección, paletas extendidas (indigo/lime/teal/orange).

    Nuevo

    • 🤖 Chat: añadidos Auto modelo (router), Artifacts, edición + versiones
    • 🛠 Tools: lista completa de 22 herramientas (web/research/imagen/video/OCR/RAG/network/Excel/BD/code/browser/voz/docgen/PPTX/mindmap/quiz/music/app-builder/img-to-code/youtube)
    • 🔌 Integraciones: las 8 OAuth (Gmail, Drive, Calendar, Analytics, AdSense, Microsoft 365, Spotify, GitHub, Monday)
    • 👥 Colaboración nueva: chats compartidos, comentarios, asignaciones, presencia, canales, calendario
    • 🤖 Agentes nuevos: autónomos con scheduler + event triggers + toolchain unificada
    • ✨ UX/idiomas: 8 idiomas, sugerencias proactivas, online status, Spotify now-playing, themes, browser notifications, reescribir para, fast mode

    Mejorado

    • 🎨 Paletas accent extendidas: + indigo + lime + teal + orange

    Seguridad

    • 🏢 Empresa nuevo: roles+permisos, audit log, onboarding por dominio, status page, self-hosting, RLS, modo mantenimiento, Mis archivos
  17. v8.79.0

    🐛 Banner fix definitivo + landing extendida (empresas, self-hosting, stack)

    Encontrado el root cause del banner solapado: .desktop-minimal-header es position:absolute top:14px y mi fix anterior de orden DOM no era suficiente. Ahora el banner tiene pt-16/pt-20 dentro de su wrapper para empujarlo debajo del header flotante. Landing extendida con 3 secciones nuevas (Para empresas, Stack técnico) que mencionan self-hosting, roles avanzados, audit log, agentes, status page, artifacts, doc generation.

    Nuevo

    • 🔁 ChatShell: orden DOM revertido a Header→BannerDisplay (el padding ahora hace el offset)
    • 🆕 Landing: nueva sección "Stack técnico" con 6 tarjetas (Next.js 16, Supabase, pgvector, OpenAI, Anthropic, Vercel fra1)

    Arreglado

    • 🐛 Banner: pt-16 md:pt-20 + z-[35] dentro del wrapper inline (resuelve solape con header position:absolute)

    Seguridad

    • 🆕 Landing: nueva sección "Para empresas" con 6 cards (Self-hosting, Roles+permisos, Status page, Agentes autónomos, Artifacts/Canvas, Generar Word/Excel/PDF/PPT)
    • 📝 Privacy section ampliada con audit log, RLS, OAuth providers
  18. v8.78.0

    📺 Resumir YouTube añadido al menú de tools del chat (+ móvil)

    El toggle youtube_summary estaba en el store pero faltaba en el menú "+" del input. Añadido en el dropdown desktop (después de "Generar Quiz") y en el menú mobile estilo ChatGPT. Body del fetch envía `youtube_summary` al /api/chat y se cuenta en activeToolsCount.

    Nuevo

    • 📺 Item "Resumir YouTube" en menú desktop (+) del input
    • 📺 Mismo item en menú mobile bottom-sheet
    • 🔌 youtubeSummary destructurado del useChatStore
    • 🎬 Icon Youtube importado de lucide-react
    • 📡 body del fetch ahora envía youtube_summary: youtubeSummary
    • 🔢 activeToolsCount actualizado para incluir youtubeSummary
  19. v8.77.0

    🛠 Tab Herramientas: +10 tools que faltaban (video gen/analysis, OCR, slides, quiz, etc.)

    Tab Herramientas tenía solo 13 cards pero el código real soporta 23. Añadidas: Generar Video (Runway/Sora/Veo), Analizar Video, OCR documentos, Generar Presentación, Mapa Mental, Crear Quiz, Reproductor música, App Builder, Imagen→Código, Resumir YouTube. Mismo grid bonito, mismas bulk actions.

    Nuevo

    • 🎬 video_generation (Runway, Sora, Veo, Luma)
    • 🎞 video_analysis (transcript Whisper + 6 frames + resumen vision)
    • 📷 ocr_mode (Tesseract.js — fotos, escaneos, tickets)
    • 🖼 slides_generation (.pptx con maquetación automática)
    • 🧠 mind_map (Mermaid mindmap inline)
    • 📝 quiz_generation (cuestionarios con explicación)
    • 🎵 music_player (reproductor cinemático embebido)
    • 🚀 app_builder (mini-apps HTML como artifact)
    • 📸 image_to_code (screenshot → React + Tailwind)
    • 📺 youtube_summary (URL → transcript + resumen + capítulos)
    • 🛡 toolMap en /api/chat actualizado con las 23 tools para enforcement server-side

    Seguridad

    • 🆕 ALL_TOOL_IDS y TOOL_LABELS en UserRoleManagement actualizados (modal permisos por user incluye las nuevas)
  20. v8.76.0

    🌐 Landing actualizada con features reales (artifacts · agentes · self-hosting · status)

    Bento grid de la landing extendido con todo lo añadido v8.70-v8.75: Artifacts tipo Canvas, Document Generation Card, Agentes autónomos con scheduler, Roles+permisos granulares, Mis Archivos, análisis vídeo/OCR, self-hosting completo (Supabase + NAS) y status page propio. Stats actualizados a 20+ modelos, 13 tools, 8 OAuth.

    Nuevo

    • 📊 Stats: 15+ → 20+ modelos, 14 → 13 tools (real count), 6 → 8 OAuth providers, +"Self-hosting disponible"
    • 🖼 Imports añadidos: Activity, HardDrive, Server, Shield (lucide-react)

    Mejorado

    • 🎨 Descripciones actualizadas: "13 tools en vivo", "20+ modelos", "OAuth Google/Microsoft/Spotify/GitHub/Monday — la IA actúa por ti"
    • 🌈 Nueva paleta indigo para BentoCard

    Seguridad

    • 🆕 Cards bento añadidas: Artifacts (Canvas), Generación de documentos, Agentes autónomos, Roles y permisos, Mis archivos, Self-hosting completo, Status page propio
  21. v8.75.0

    📄 DocumentGenerationCard — card desde el inicio (como ImageGenerationCard)

    Cuando activas generación de docx/pdf/xlsx/pptx, ya no ves todo el texto markdown seguido del archivo al final. Ahora aparece una card con animación desde el inicio del request, frases rotativas de progreso, y al terminar muestra el archivo final con botones Descargar / Abrir. El texto markdown queda oculto (el contenido está dentro del archivo descargable).

    Nuevo

    • 🆕 Tipos según formato: docx=azul, pdf=rosa, xlsx=verde, pptx=naranja, html=violeta, json=amber
    • 📡 MessageBubble intercepta el evento en el stream y actualiza el store
    • 💾 meta_json.generated_document persistido en el message para que la card se re-renderice al recargar conversation
    • 🙈 Cuando hay generatedDocMeta, displayContent se sobrescribe a un mensaje corto ("Aquí tienes tu X 👇") — el texto markdown completo NO se muestra (está dentro del archivo)

    Mejorado

    • 🆕 Store ui: DocumentGenerationRun + setDocumentGenerationRun + clearDocumentGenerationRun
    • 🎨 ChatArea muestra DocumentGenerationCard efímera durante el run, MessageBubble la persistente al recargar

    Arreglado

    • 🆕 Componente DocumentGenerationCard con states running/ready/error, frases rotativas, progress bar
    • 🛰 SSE event document_generation_event (running al inicio + ready/error al final) inyectado en /api/chat
  22. v8.74.0

    🔧 5 fixes: voz · banner · preview pptx · títulos IA · enforcement cuota/tools

    Lote de hotfixes: arregla modo voz roto (modelo deprecated), banner que se solapaba con el header, preview de pptx con UI clara, títulos de documentos generados con IA en vez del prompt literal, y enforcement server-side de cuota mensual de tokens y tools deshabilitadas.

    Nuevo

    • 📢 Banner: ahora se renderiza ENCIMA del header (era debajo y se solapaba con el selector de modelo)
    • 📊 Preview pptx/zip/binarios: card centrada con icono, info del archivo, botón Descargar prominente y Abrir en nueva pestaña
    • 🤖 Títulos de documentos generados con IA: nueva función generateSmartDocumentTitle() en document-export.ts (gpt-4o-mini, response_format json_object). Ej: "hazme presentación michael jackson" → título "Michael Jackson: Rey del Pop" + slug "michael-jackson-rey-del-pop"
    • 🛡 Enforcement server-side: /api/chat valida quotaProfile, bloquea suspended/pending con 423, devuelve 429 si supera monthly_token_limit del mes, fuerza false en tool flags que el user tiene en disabled_tools
    • 🆕 lib/server/quota.ts: helpers getUserMonthlyTokenUsage(), checkUserQuota(), userCanUseToolServer(), userCanUseModelServer()

    Arreglado

    • 🎙 Modo voz: modelo pinned a gpt-4o-mini-realtime-preview-2024-12-17, voice "marin" → "alloy", mejor reporting de error OpenAI
  23. v8.73.0

    🛠 Tab Roles+Permisos en admin · Tab Tools reescrito · Mis Archivos página propia

    Tres tabs nuevas/reescritas en panel admin y la página dedicada Mis Archivos en el menú de usuario. Roles y Permisos consolida la gestión completa del sistema RBAC nuevo (cambio de rol, suspensión con razón/fecha, permisos por feature, dominios permitidos, audit log global). Tools reescrito desde cero con grid visual y bulk actions. Mis Archivos da al usuario página propia para ver/descargar/renombrar/eliminar/reintentar sus archivos.

    Nuevo

    • 🔁 Tab admin "Herramientas" reescrita completa — grid de 13 tools con bulk actions (bloquear/desbloquear para todos)
    • 🆕 Endpoint GET /api/admin/tools con resumen + lista users bloqueados por tool
    • 🆕 Endpoint POST /api/admin/tools/[id]/bulk action=block_all|unblock_all
    • 📂 Página /my-files con filtros (todos/indexados/procesando/fallidos), búsqueda, polling auto
    • 🔧 Endpoints: GET /api/files (lista), DELETE /api/files/[id], PATCH /api/files/[id] (rename)
    • ➕ Links "Mis archivos" + "Admin" en ambos menús del sidebar (collapsed y full)
    • ✅ Signup totalmente abierto: cualquier email no listado → role=user automático (confirmado en v8.72.0)

    Seguridad

    • 🆕 Tab admin "Roles y Permisos" — sub-tabs Usuarios / Dominios permitidos / Audit log global
    • 🆕 Modales: cambiar rol, suspender (con razón y fecha hasta), permisos por feature (tools/models/cuota), audit log
  24. v8.72.0

    ⚡ Performance: Vercel→Frankfurt + polling reducido + índices + signup abierto

    Optimización de latencia tras migrar Supabase a self-hosted en NAS (Madrid). Vercel ahora despliega en Frankfurt (fra1) para estar cerca del NAS. Polling de presencia reducido 50%. Cache HTTP en /api/tools/permissions. Índices estratégicos en mensajes/conversations/token_usage. Signup ahora abierto: cualquier email se da de alta como user (los dominios listados siguen forzando rol específico).

    Nuevo

    • ⏱ use-user-activity: heartbeat 30s→60s, check 15s→30s, idle 2min→3min, gap 8s→15s (-50% requests)
    • 🗂 Migración 088: índices en conversations(user_id, updated_at), messages(conv, created), token_usage(user, created), status_checks(service, checked), user_activity_sessions(user, last)
    • 🧹 VACUUM ANALYZE en messages/message_versions/token_usage/conversations/user_activity_sessions
    • 🌐 Signup abierto: trigger handle_new_user_with_domain_check ahora asigna user por defecto (no pending) para dominios no listados

    Mejorado

    • 🌍 Vercel region → fra1 (Frankfurt) — reduce latencia Vercel↔NAS de ~150ms a ~30ms
    • 🔍 Diagnóstico: DB es minúscula (1.5MB tabla más grande), problema era latencia red US↔EU + cold starts Vercel

    Seguridad

    • 💾 /api/tools/permissions: Cache-Control private max-age=60 (era no-cache)
  25. v8.71.0

    🔐 Roles v2 — audit log + dominios + permisos por feature + middleware admin

    Sobre el sistema simple v8.70.0 (profiles.role admin|user), añadimos: rol pending, auto-aprobación por dominio email, audit log trazable, permisos por user (disabled_tools, disabled_models, monthly_token_limit), middleware que bloquea /admin/* a no-admins y a usuarios suspendidos o pending.

    Nuevo

    • 🆕 Rol pending para usuarios cuyo email no está en la lista blanca de dominios
    • 🌐 Tabla allowed_email_domains: signup auto-asigna role (o pending) según el dominio
    • 🛡 Middleware bloquea /admin/* y /api/admin/* si role!=admin; bloquea todo para suspended/pending
    • 🔧 verifyAdmin() ahora también valida suspended y devuelve profile completo
    • 🆕 verifyActiveUser() helper para endpoints no-admin
    • 🆕 Endpoints: GET /api/admin/users/[id]/audit, GET/POST/PATCH/DELETE /api/admin/email-domains
    • 🆕 PATCH /api/admin/users acepta disabled_tools/disabled_models/monthly_token_limit y registra audit
    • 🧹 getUserModelAccessScope respeta disabled_models (lista negra)
    • ✅ Migración 087 aplicada en NAS + cloud, seed gesem.es y garbotgpt.com como dominios permitidos

    Seguridad

    • 📝 Tabla role_audit_log + función log_role_action: trazabilidad de cambios de rol/suspensión/permisos
    • 🛠 Permisos por feature en profiles: disabled_tools[], disabled_models[], monthly_token_limit
    • 🧹 /api/tools/permissions respeta disabled_tools del profile del user
  26. v8.70.0

    🔐 Sistema de roles simplificado — fuente única profiles.role

    Eliminado por completo el RBAC granular (roles, user_roles, role_permissions) que coexistía sin sincronización con profiles.role y generaba huecos de seguridad. Ahora la única fuente de verdad es profiles.role enum (admin | user). Admin tiene acceso total; user accede a todo excepto el panel admin.

    Nuevo

    • 🚮 Borrados 4 endpoints /api/admin/roles/* + componente RolesManagement.tsx
    • 🧹 model-configs.ts: simplificado getUserModelAccessScope (admin = todo, user = todo)
    • 🧹 /api/admin/users/create: dejó de insertar en user_roles, sólo profiles.role
    • 🛡️ Restaurado CHECK constraint en profiles.role (sólo admin o user) + default user
    • ✅ Migración 086_drop_rbac_system aplicada en NAS + cloud

    Seguridad

    • 🚮 Borradas 3 tablas (roles, user_roles, role_permissions) + 2 funciones PG (user_has_permission, get_user_accessible_resources)
    • 🚮 Quitada tab "Roles y Permisos" del panel admin (AdminPageClient + ModernAdminPageClient + ModernAdminLayout)
    • 🧹 /api/tools/permissions: ahora cualquier user autenticado ve todas las tools
  27. v8.69.1

    🩺 Status page: arreglados falsos positivos de Supabase Auth/Storage + threshold web

    Los checks de Supabase Auth y Storage estaban marcados como caídos siendo falsos positivos (faltaba el header apikey en el ping). El cron ahora lo inyecta automáticamente para URLs *.supabase.co, Storage usa /storage/v1/version (público) y el threshold de la app web sube a 3000ms degraded / 10000ms down para no penalizar cold-starts de Vercel.

    Nuevo

    • 🔑 Cron auto-inyecta header apikey + Authorization Bearer para URLs *.supabase.co usando NEXT_PUBLIC_SUPABASE_ANON_KEY
    • 🛠 Supabase Storage URL: /storage/v1/bucket → /storage/v1/version (público, sin auth)
    • 🛠 Supabase Auth expected_status: [200] → [200, 401] (defensivo si la anon key no está en env)
    • ⏱ Web app threshold: degraded 1500ms → 3000ms, down 5000ms → 10000ms (Vercel cold start típico)
    • 🧹 Migration 085 auto-resuelve los incidents falsos abiertos sobre estos 3 servicios
  28. v8.69.0

    🤖 Sistema de Agentes — refactor completo (planner + toolchain real)

    Reescritura completa del executor de agentes: planner con JSON validado, toolchain real (web_search + browse_url + db_query), límites de pasos y timeout configurables, traza estructurada por step, y summarizer dinámico sin hardcoding.

    Nuevo

    • 🚮 Quitado prompt hardcoded "FC Barcelona" del summarizer — ahora 100% genérico basado en agent.goal
    • 🛡️ Plan JSON validado con schema + fallback a single-step summary si falla el planner
    • ⏱️ max_steps (default 10, hard cap 25) y step_timeout_ms (default 20s) configurables vía agent.config_json
    • 🚫 code_interpreter explícito como "no soportado en serverless" en vez de stub silencioso
    • 🤖 Summarizer dinámico — instruido por agent.goal + step.text, formato pedido por el usuario (tabla/lista/JSON/informe)
    • 🛡️ db_query con lista blanca de tablas + force-filter user_id (incluso con service role) — nunca puede leer otros usuarios

    Mejorado

    • ⚡ JSON mode en OpenAI planner para garantizar parseo limpio

    Arreglado

    • ✅ Try/catch por step — un fallo en un paso no aborta toda la ejecución, continúa
    • 📋 Trace estructurado (acción, ms, ok/error, preview) guardado en agent_executions.result como <details> colapsable

    Seguridad

    • 🔧 Tools reales en agentes: web_search (Tavily), browse_url (HTML fetch+strip), db_query (SELECT con safelist + RLS por user_id)
  29. v8.68.1

    🐛 Hotfix: build Vercel fallaba por className multi-línea en RewriteMenu

    Turbopack no parseaba el className multi-línea del dropdown combinado con <style jsx global>. Colapsado a una sola línea.

    Nuevo

    • ✅ Collapsed className del dropdown a una sola línea — mismas clases, mismo render

    Arreglado

    • 🐛 Turbopack (Next.js 16.1.6) no parseaba className multi-línea junto con <style jsx global>
  30. v8.68.0

    🐛 Fix: header "Reescribir para…" mostraba barra rara

    Bug visual reportado por el usuario: el header del dropdown "Reescribir para…" se veía mal — aparecía como una barra vertical extraña al lado del texto, parecía que faltaba la primera letra. Causa: el emoji ✨ (U+2728 SPARKLES) combinado con CSS `uppercase` + `tracking-wider` + `text-[10px]` se renderizaba con un glifo "compacto" raro en algunos sistemas/fuentes, parecido a una barra. Fix: reemplazar el emoji por un icono Lucide `<Sparkles>` que se renderiza limpio en todos los sistemas (es SVG, no depende de fuente emoji). De paso aplicado el styling premium de los otros dropdowns (rounded-[18px] + liquid glass + sombra multicapa + items con rounded interno + animación cubic-bezier de Apple).

    Nuevo

    • ✨ rounded-[18px] (antes rounded-xl) + sombra multicapa con highlight superior
    • ✨ Items con mx-1.5 + rounded-[10px] hover + active:scale-[0.98] (consistente con sidebar)
    • ✨ Animación 160ms cubic-bezier(0.22,0.9,0.24,1) (antes 150ms ease-out)

    Mejorado

    • ✨ Dropdown rediseñado con liquid glass (backdrop-blur-2xl saturate-150)
    • 🎨 Dark mode con bg-zinc-900/85 + border-white/[0.08]
    • 🎨 Hover violet (bg-violet-50/80 light, bg-violet-500/15 dark)

    Arreglado

    • 🐛 Emoji ✨ + uppercase + tracking-wider se renderizaba como barra rara — reemplazado por <Sparkles> Lucide

1346 versiones publicadas · página 38 de 45. Míralo dentro de la app.