Skip to main content

Chat

El módulo de Chat es el sistema central de comunicación de Vivla Tools. Permite gestionar conversaciones con huéspedes, administrar canales de soporte, crear tickets y coordinar agentes de atención.

Arquitectura

El sistema se basa en Stream Chat como proveedor de mensajería en tiempo real. El backend actúa como orquestador: gestiona canales, usuarios, permisos y sincronización, mientras que Stream Chat maneja el transporte de mensajes y la presencia.
┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│   Frontend   │────▶│   Backend    │────▶│  Stream Chat │
│  (React SDK) │◀────│  (NestJS)    │◀────│   (SaaS)     │
└──────────────┘     └──────────────┘     └──────────────┘

                     ┌──────▼──────┐
                     │  Supabase   │
                     │  (metadata) │
                     └─────────────┘

Sub-módulos

El módulo de Chat está compuesto por 17 sub-módulos en el backend:
Sub-móduloDescripción
ChannelsCRUD de canales, operaciones batch (agente activo, moderadores, archivado, eliminación), filtros avanzados
MessagesRegistro de mensajes para analytics, consulta de historial por canal
BookingsCreación de canales por reserva, batch create/archive de canales de booking
TicketsSistema de tickets de soporte (campos, adjuntos, SLAs, actividad, sync con Zendesk). Ver la sección Tickets
ShiftsProgramación de turnos de agentes de soporte
InvitationsInvitaciones a canales con tokens y deep links
MobileAutenticación y endpoints específicos para vivla-mobile
UsersGestión de usuarios de chat
Quick RepliesRespuestas rápidas reutilizables por los agentes, organizadas en grupos (CRUD de grupos y respuestas bajo /chat/quick-replies)
NotificationsNotificaciones específicas del chat
AnalyticsMétricas de uso: canales, usuarios, mensajes
WebhooksRecepción de eventos de Stream.io, Zendesk e invitaciones
SyncSincronización de datos entre Supabase y Stream Chat
Property AssignmentsMapeo de propiedades a canales
Channel TypesDefinición de tipos de canal (configuración de templates)
IntegrationsIntegraciones con servicios externos
CopilotCimientos del copiloto de IA por agente (agent_key): sesiones de conversación (regla 24h), caché de sugerencias y config de agente. Detalle en AI → §6. El motor de generación llega en una fase posterior

Flujo principal

Creación de canales por booking

  1. Se reciben las reservas (bookings) desde el sistema externo
  2. Un agente o proceso automático crea canales asociados a cada booking
  3. Cada canal se vincula a una propiedad y un tipo de canal
  4. Se asignan agentes (activo y por defecto) y moderadores. Un canal de propiedad nunca se crea sin agente: si no se indica uno, el backend resuelve el agente por defecto desde la asignación chat_agent de la propiedad y, si no existe, desde el turno (shift) activo que la cubre; si tampoco hay turno, la creación falla con un 400 pidiendo asignar un agente en Configuración
  5. El huésped accede al canal desde la app mobile

Gestión de tickets

  1. Un agente selecciona mensajes de una conversación
  2. Crea un ticket con título, prioridad y los mensajes seleccionados
  3. El ticket se puede actualizar, agregar más mensajes y resolver
  4. Filtros por estado, prioridad, propiedad y agente asignado

Webhooks

El sistema recibe eventos externos en:
EndpointOrigenValidación
POST /api/chat/webhooks/streamStream.ioFirma de Stream
POST /api/chat/webhooks/zendeskZendeskHMAC-SHA256
POST /api/chat/webhooks/invitation-acceptedVivlaHMAC-SHA256 (X-Vivla-Signature)
Los webhooks son públicos (sin Bearer token) pero están protegidos por validación de firma criptográfica.