Todo bot
Runtime
- Node.js 22 o superior, y tu app es ESM (
"type": "module"en elpackage.json, o archivos.mjs). Los paquetes no traen build de CommonJS. - Un gestor de procesos reinicia el bot cuando termina: PM2, systemd,
restart: unless-stoppedde Docker o tu orquestador. Ver Despliegue. - Apagado ordenado: ante
SIGTERM/SIGINT, llama aawait bot.stop({ drain: true, timeout: '15s' })para que las respuestas en vuelo se envíen y se registren antes de que el proceso termine (Apagado ordenado). - Fija las versiones (commitea el lockfile). Mientras los paquetes estén en beta, lee las páginas de migración antes de cada actualización.
Estado
- Un store persistente. El
MemoryStorepor defecto guarda todo en RAM. UsaSQLiteStorepara un proceso oRedisStorepara varios (Store persistente). - Pasa la instancia del store:
store: new SQLiteStore({ file }). Un string comostore: 'sqlite'se acepta por compatibilidad, pero sigue creando unMemoryStore. - Los flujos de varios pasos son
.persistent(), para que un usuario a mitad de un flujo lo retome tras un reinicio (Flujos). - En Node.js 24.19 o superior, usa
better-sqlite313 conSQLiteStore(por qué). - Volúmenes y copias de seguridad: la carpeta de la sesión de WhatsApp
(
sessions/) y la de datos (data/) están en disco persistente y se respaldan juntas (Copias de seguridad).
Secretos
- Los tokens, claves de API y secretos de webhook salen del entorno (o de tu gestor de secretos), nunca del código. El framework no lee ninguna variable de entorno por su cuenta: tú las pasas a las opciones del provider (Variables de entorno).
sessions/,.env,*.dby*.qr.pngestán en.gitignorey nunca se copian a una imagen de Docker.
Webhooks (Cloud API, webhook de Telegram, Twilio…)
- Servidos por HTTPS y con la verificación de firma del canal
configurada (
appSecret,webhookSecret…). Nunca pongasallowUnsignedWebhooks: trueen producción (Seguridad). - La firma se comprueba sobre el body crudo: no pongas un parser de JSON delante de la ruta del webhook (Servidor de webhooks).
Observabilidad
- Logs: pasa tu propio
loggerde pino (o deja el integrado, que registra desdewarn). Los ids de chat y de remitente van hasheados en los logs por defecto (logIds: 'hash'); déjalo así fuera de la depuración local. - Errores: escucha
bot.on('error', …)y envíalos a tu sistema de seguimiento de errores. - Salud y métricas: expón un endpoint de liveness/readiness y
bot.metrics()en formato Prometheus (Comprobaciones de salud, Operación).
Límites de los canales
- WhatsApp con Baileys: deja activado el rate limiter del provider y evita los envíos masivos no solicitados (Rate limiting).
- Cloud API: respuestas libres solo dentro de la ventana de 24 horas; fuera de ella, plantillas (Ventana de 24 h de WhatsApp).
- Crecimiento del log de mensajes: los stores persistentes guardan todos
los mensajes salvo que pongas
maxMessagesPerChat(Store persistente).
Cuando necesitas más
Todo esto es opt-in: sin la opción, el bot funciona exactamente igual que antes.
Qué paquetes están publicados
Los paquetes de npm (36) son@botmesh/core; los canales @botmesh/baileys,
@botmesh/meta, @botmesh/telegram, @botmesh/messenger, @botmesh/instagram,
@botmesh/discord, @botmesh/evolution, @botmesh/wppconnect, @botmesh/twilio,
@botmesh/gupshup, @botmesh/gohighlevel y @botmesh/email; los stores
@botmesh/sqlite-store, @botmesh/redis-store, @botmesh/postgres-store,
@botmesh/mysql-store y @botmesh/mongo-store; la infraestructura @botmesh/http,
@botmesh/graph-core, @botmesh/wa-gateway-kit, @botmesh/server, @botmesh/events
y @botmesh/otel; los plugins @botmesh/ai, @botmesh/rag, @botmesh/voice,
@botmesh/nlu, @botmesh/dialogflow, @botmesh/chatwoot, @botmesh/tickets y
@botmesh/moderation; y el tooling @botmesh/flow-schema, @botmesh/mcp,
eslint-plugin-botmesh y create-botmesh. Los 36 están en npm. Diez se publicaron por primera vez durante la alpha
(core, baileys, meta, telegram, sqlite-store, redis-store, ai,
http, graph-core y create-botmesh); los otros 26 se publicaron por primera vez con la beta.
Algunas páginas describen además paquetes que de momento solo están en el
repositorio (el
canal de TikTok, @botmesh/manager, el sandbox…), y cada una lo indica. Planifica un
despliegue de producción sobre los publicados.
Antes de cada versión de tu bot
- Los tests pasan con
createTestBot/MockProvider(Testing). - Los archivos o bases de datos del store tienen copia antes de
actualizar
@botmesh/sqlite-store: una versión anterior no puede abrir un esquema más nuevo (Versiones del esquema). - Con réplicas, todas corren una versión que entiende las opciones que
activas (por ejemplo
coordination.handover.flows: 'forward').