bot.describe(): diagrama Mermaid o grafo JSON
- Un
subgraphpor flujo del DSL. El nodo de entrada (▶) lista todos los triggers que lo arrancan (bot.use,bot.when(trigger, flow), el trigger de unbot.conversation). Conbot.when(trigger, flow)el trigger propio del flujo no se enruta, y el diagrama lo refleja. say,ask(→ clave de estado, ⏱ si el paso tiene timeout propio,✓schemasi valida con unschema),do(con el nombre de la función si tiene uno:do: saveUser()),media(con su tipo:media (document): ...),choose(un rombo; las opciones son flechas1) Etiqueta, igual que el menú que ve el usuario),form(sus campos y su clave de estado),guard(guard: isAdmin(), con✗→ destinosi redirige),use(el sub-flujo dibujado en línea, que vuelve al paso siguiente),delay(pasos.delay(); la opción{ delay }se añade a la etiqueta de su paso),goto(flecha punteada al flujo destino) yend.- El
then:de una opción es un nodo propio si es una acción, o un subgraph anidado que vuelve al paso siguiente del padre si es un sub-flujo. Elgotode una opción es una flecha a su flujo destino. - El
.timeout()y el.persistent()del flujo van en el título del subgraph. - Un
gotoa un flujo inexistente se dibuja como un nodomissing: nombre. - Los pasos después de un
gotoincondicional no tienen flecha de entrada (código muerto visible). - Las conversaciones async (
bot.conversation(name, fn)) son opacas: un solo nodo con sus triggers. - El texto del usuario se escapa con códigos de entidad de Mermaid, así que
no puede romper una etiqueta ni inyectar directivas
%%{init}%%. Los ids de nodo (f0_in,f0_s3,f0_end…) son estables y los mismos en Mermaid, JSON y lint.
bot.lint(): chequeos estáticos
{ code, severity, message, flow?, nodeId?, path?, trigger? },
ordenados de más a menos grave.
Los chequeos de timeout (
invalid-timeout, missing-timeout,
wait-never-expires) también cubren los pasos .form(). missing-timeout
aparece a propósito en la mayoría de bots pequeños; usa
minSeverity: 'warning' para un informe más limpio.
Helpers de bajo nivel
describeFlows(source, options)ylintFlows(source, options)aceptan unBot, unFlowInventoryo un array de flujos.bot.flowInventory()devuelve la foto sobre la que trabajan (registros, rutas, timeout por defecto y si el store es durable) para tus propias herramientas.MemoryStore#durableestruesi tienefile.describeTrigger(trigger)devuelve{ label, patterns, match, scope, predicate }.