#+TITLE: meshmonitor-chat.el - Plan de desarrollo #+STARTUP: showall * Fase 1: Infraestructura base ** DONE Estructura del paquete y dependencias - Crear meshmonitor-chat.el con header, requires, defgroup, defcustom - Variables: host, port, token, user/pass - Dependencias: url.el (built-in) ** DONE Autenticación y conexión REST - Login con usuario/contraseña via POST + cookies de url.el - Soporte Bearer token alternativo - Funciones auxiliares para GET/POST con auth ** DONE Buffer base y major mode - meshmonitor-chat-mode derivado de fundamental-mode - Prompt al final del buffer (estilo rcirc) - Markers para separar contenido de input - Keybindings: RET para enviar, M-p/M-n historial * Fase 2: Listados (buffers exclusivos) ** DONE Listado de canales - GET /api/v1/channels - Buffer *MeshMonitor: Channels* con tabulated-list-mode - Acción RET para abrir canal - Refresh con g ** DONE Listado de conversaciones DM - GET /api/v1/nodes para obtener nodos conocidos - Buffer *MeshMonitor: Direct Messages* con tabulated-list-mode - Acción RET para abrir conversación - Refresh con g * Fase 3: Chat funcional (lectura) ** DONE Buffer de canal con historial - GET /api/v1/messages?channel=X&limit=50 - Renderizado: [timestamp] texto - Scroll automático cuando se está al final - Resolución de nodeId a nombre legible via nodos - Deduplicación por message ID ** DONE Buffer de DM con historial - GET doble: fromNodeId=X + toNodeId=X, merge con dedup - Mismo renderizado que canales - Indicar nodo destino en el buffer name * Fase 4: Chat funcional (envío) ** DONE Enviar mensajes a canales - POST /api/v1/messages con channel - Echo local inmediato del mensaje enviado - Manejo de errores (mensaje de sistema) ** DONE Enviar DMs - POST /api/v1/messages con toNodeId - Mismo feedback visual * Fase 5: Tiempo real ** DONE Polling de mensajes nuevos - Timer periódico con GET /api/v1/messages?since=TIMESTAMP - Insertar nuevos mensajes en buffers abiertos - Limpieza de buffers muertos ** TODO Socket.IO via websocket.el - Engine.IO handshake (HTTP polling inicial) - Upgrade a WebSocket - Parser de paquetes Socket.IO (tipos 0-6) - Escuchar message:new para mensajes en tiempo real - Escuchar routing:update para confirmación de entrega - Escuchar connection:status para estado de conexión - Reemplazar polling por Socket.IO * Fase 6: Pulido ** DONE Faces y formato visual - Faces para timestamps, nicks, mensajes propios - Mensajes de sistema con estilo diferente ** DONE Comandos slash - /join #channel, /msg nodeId texto - /channels, /dms para abrir listados - /status para ver conexión ** DONE Checkdoc, byte-compile y package-lint - Todas las verificaciones pasan sin errores