Sub-APIs (v1) → escape hatches del transporte (v2)
En v1 el bot exponía 5 sub-APIs tipadas de WhatsApp: bot.groups, bot.profile, bot.privacy, bot.chats, bot.presence. En v2 fueron eliminadas del core: @botmesh/core es agnóstico de transporte, y la gestión de grupos/privacidad/perfil es específica de WhatsApp — no existe con la misma forma en Telegram o Discord.
Qué las reemplaza
Dos capas, según lo que necesites:
1. Capacidades normalizadas en todos los providers
Las operaciones comunes sobrevivieron en el contrato compartido — detecta la capacidad, nunca asumas:
await ctx.markRead() // provider.markRead(refs)
await ctx.typing() // provider.typing(chatId, state)
await ctx.delete() // provider.deleteMessage(ref)
bot.on('group', ...) // cambios de participantes (add/remove/promote/demote)
bot.on('presence', ...) // actualizaciones de presencia de contactos
bot.on('status', ...) // recibos de entrega/lecturaCada provider publica provider.capabilities (groups, presence, edit, typing, ...) para que puedas ramificar según lo que el transporte soporta.
2. El socket nativo del transporte (solo Baileys)
Para todo lo demás — crear grupos, links de invitación, ajustes de privacidad, archivar/fijar/silenciar chats — accede al socket crudo desde el provider de Baileys. provider.socket lo devuelve tipado como unknown (los tipos de Baileys no forman parte de la API de @botmesh/baileys); socketOf(provider) de @botmesh/baileys/internal lo devuelve tipado como el socket de la versión de Baileys instalada (sin garantía semver). Importar /internal arrastra los .d.ts de Baileys, que no compilan con skipLibCheck: false: mantén "skipLibCheck": true en un proyecto que lo use (la entrada principal no lo necesita):
import { Bot } from '@botmesh/core'
import { BaileysProvider } from '@botmesh/baileys'
import { socketOf } from '@botmesh/baileys/internal'
const provider = new BaileysProvider({ session: 'mi-bot' })
const bot = new Bot({ provider })
bot.on('ready', async () => {
const sock = socketOf(provider) // el socket crudo de Baileys 7, tipado
if (!sock) return
// Equivalente de bot.groups.create(...) de v1:
const group = await sock.groupCreate('My group', ['573001234567@s.whatsapp.net'])
// bot.profile.setName(...) de v1:
await sock.updateProfileName('My Bot')
// bot.privacy.setLastSeen(...) de v1:
await sock.updateLastSeenPrivacy('all')
// bot.groups.inviteLink(...) de v1:
const code = await sock.groupInviteCode(group.id)
})
await bot.start()El código específico de transporte se queda específico
Todo lo que escribas contra provider.socket solo funciona con @botmesh/baileys (y solo contra una conexión real de WhatsApp — no con el MockProvider que usa createTestBot()). Protégelo detrás de provider.id === 'baileys' si tu código puede correr en otros transportes.
Ver la documentación de Baileys para la API completa del socket (groupCreate, groupMetadata, groupParticipantsUpdate, updateProfilePicture, chatModify, ...).
Siguientes pasos
- Despliegue — configuración de producción
- Referencia de API — documentación técnica completa