QueueMemberStatus
Estado de agente
idle: Disponibleinuse: Ocupadopaused: Pausadounavailable: No disponible
Extensión del panel web con dashboard de monitoreo de colas usando Server-Sent Events (SSE) y eventos AMI para control en tiempo real
La extensión del panel web seguirá una arquitectura orientada a eventos en tiempo real:
Frontend:
Backend:
Tiempo Real:
QueueMemberStatus
Estado de agente
idle: Disponibleinuse: Ocupadopaused: Pausadounavailable: No disponibleQueueCallerJoin
Llamada entra a cola
AgentCalled
Agente siendo contactado
AgentConnect
Agente contesta
AgentComplete
Llamada finaliza
QueueCallerAbandon
Llamante cuelga
Agregar en /etc/asterisk/manager.conf:
; === USUARIO ESPECIALIZADO PARA DASHBOARD DE COLAS ===[dashboard_colas]secret = DashboardColas2025!
; Permisos mínimos necesariosread = agent,callwrite = agent
; Filtros de eventos - SOLO eventos de colaseventfilter(action(include),name(QueueMemberStatus)) =eventfilter(action(include),name(AgentCalled)) =eventfilter(action(include),name(AgentConnect)) =eventfilter(action(include),name(AgentComplete)) =eventfilter(action(include),name(QueueCallerJoin)) =eventfilter(action(include),name(QueueCallerAbandon)) =eventfilter(action(include),name(QueueMemberAdded)) =eventfilter(action(include),name(QueueMemberRemoved)) =eventfilter(action(include),name(QueueMemberPause)) =
; Denegar otros eventos para reducir tráficoeventfilter(action(exclude),name(*)) =
; Acceso solo desde localhostdeny = 0.0.0.0/0.0.0.0permit = 127.0.0.1/255.255.255.0✅ Estado de Colas
Tiempo Real:
✅ Control de Agentes
Gestión Completa:
✅ Llamadas Activas
Monitoreo Live:
✅ Métricas del Día
KPIs en Tiempo Real:
✅ Notificaciones
Alertas Visuales:
✅ Gráficos Trend
Visualización Avanzada:
src/├── app/│ ├── dashboard/│ │ └── colas/│ │ ├── page.tsx # Página principal│ │ ├── components/│ │ │ ├── QueueCard.tsx # Tarjeta de cola│ │ │ ├── AgentList.tsx # Lista de agentes│ │ │ ├── MetricsPanel.tsx # Panel de métricas│ │ │ ├── CallsList.tsx # Llamadas activas│ │ │ ├── QueueChart.tsx # Gráficos trend│ │ │ └── AlertsPanel.tsx # Panel de alertas│ │ └── loading.tsx│ └── api/│ └── ami/│ ├── queue-events/│ │ └── route.ts # SSE endpoint│ ├── pause-agent/│ │ └── route.ts # Pausar/despausar│ ├── queue-status/│ │ └── route.ts # Estado actual│ └── add-remove-agent/│ └── route.ts # Agregar/quitar de cola├── stores/│ └── queueStore.ts # Estado global con Zustand├── hooks/│ ├── useSSE.ts # Hook para SSE│ ├── useQueueMetrics.ts # Hook para métricas│ └── useAMIActions.ts # Hook para acciones AMI└── types/ └── queue.ts # TypeScript typesinterface QueueStore { // Estado queues: Queue[] agents: Agent[] activeCalls: ActiveCall[] metrics: DayMetrics isConnected: boolean
// Acciones updateQueueStatus: (queueName: string, status: QueueStatus) => void updateAgentStatus: (agentId: string, status: AgentStatus) => void addActiveCall: (call: ActiveCall) => void removeActiveCall: (callId: string) => void updateMetrics: (metrics: Partial<DayMetrics>) => void
// AMI Actions pauseAgent: (agentId: string, queueName: string) => Promise<void> unpauseAgent: (agentId: string, queueName: string) => Promise<void> addAgentToQueue: (agentId: string, queueName: string) => Promise<void> removeAgentFromQueue: (agentId: string, queueName: string) => Promise<void>}Necesito agregar [FUNCIONALIDAD] al dashboard de colas de Asterisk.
Contexto:- Panel Next.js 15 con App Router- Zustand para estado global- SSE para eventos AMI en tiempo real- Ya implementado: estado de colas, agentes, pausar/despausar
Nueva funcionalidad:[DESCRIBIR REQUERIMIENTO ESPECÍFICO]
Tecnologías disponibles:- Recharts para gráficos- shadcn/ui para componentes UI- Zustand para manejo de estado- TanStack Query para caché- Lucide React para iconos
Estructura del proyecto:- API Routes: src/app/api/ami/- Componentes: src/components/- Store: src/stores/queueStore.ts- Página principal: src/app/dashboard/colas/page.tsx- Hooks: src/hooks/- Types: src/types/
Por favor genera:1. Código del componente React2. Modificaciones necesarias en queueStore.ts3. API route si es necesario4. TypeScript types5. Integración en página principal6. Hook personalizado si aplica
Estilo de código:- TypeScript strict- Componentes funcionales con hooks- shadcn/ui para UI consistency- Manejo de errores con toast- Loading states apropiados📊 Gráfico de Llamadas por Hora
Mostrar tendencia de llamadas entrantes en las últimas 24 horas con Recharts
🔔 Sistema de Alertas
Notificaciones push cuando una cola supera el umbral de espera
📱 Vista Móvil
Dashboard responsivo optimizado para tablets y móviles
🎯 SLA Monitor
Medidor visual del Service Level Agreement por cola
📋 Reportes Exportables
Generar reportes PDF/Excel de métricas del día
🌙 Modo Oscuro
Toggle entre tema claro y oscuro con persistencia
# 1. Verificar conexión SSEcurl -N http://localhost:3000/api/ami/queue-events
# 2. Monitorear eventos AMIsudo asterisk -rx "manager show connected"
# 3. Generar eventos de pruebasudo asterisk -rx "queue add member PJSIP/1001 to cola-ventas"sudo asterisk -rx "queue pause member PJSIP/1001 queue cola-ventas"
# 4. Verificar logs del panelpm2 logs panel-asterisk | grep AMI🔄 Reconexión Automática
Si se pierde conexión SSE, reintenta cada 5 segundos con backoff exponencial
💓 Heartbeat System
Ping cada 30 segundos para detectar conexiones zombie
🚨 Error Handling
Toast notifications para errores con botón de reintento
⚡ Optimistic Updates
UI actualiza inmediatamente, rollback si falla
💾 Caché Inteligente
React Query para cachear estado inicial y reducir llamadas
🐛 Debug Mode
Logs detallados de eventos AMI para troubleshooting
// Configuración por ambienteconst config = { development: { SSE_RETRY_INTERVAL: 1000, HEARTBEAT_INTERVAL: 10000, DEBUG_MODE: true }, production: { SSE_RETRY_INTERVAL: 5000, HEARTBEAT_INTERVAL: 30000, DEBUG_MODE: false }}📖 Asterisk AMI Events
Documentación oficial de eventos AMI disponibles
🌊 Server-Sent Events
Guía completa de SSE en Next.js App Router
🐻 Zustand Documentation
Estado global simple y eficiente para React
📊 Recharts Examples
Biblioteca de gráficos para React
🎓 Continuación del Aprendizaje
Una vez completado este taller, tendrás las bases para:
¡El ecosistema Asterisk + Web moderno está a tu disposición! 🚀