Saltar al contenido principal

bot.describe(): diagrama Mermaid o grafo JSON

Qué dibuja:
  • Un subgraph por flujo del DSL. El nodo de entrada (▶) lista todos los triggers que lo arrancan (bot.use, bot.when(trigger, flow), el trigger de un bot.conversation). Con bot.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, ✓schema si valida con un schema), 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 flechas 1) Etiqueta, igual que el menú que ve el usuario), form (sus campos y su clave de estado), guard (guard: isAdmin(), con ✗→ destino si 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) y end.
  • 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. El goto de 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 goto a un flujo inexistente se dibuja como un nodo missing: nombre.
  • Los pasos después de un goto incondicional 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

Cada diagnóstico es { 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) y lintFlows(source, options) aceptan un Bot, un FlowInventory o 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#durable es true si tiene file.
  • describeTrigger(trigger) devuelve { label, patterns, match, scope, predicate }.

Siguientes pasos