docs: public Ability commands() {
      return builder()
          .name(COMMANDS)
          .locality(USER)
          .privacy(PUBLIC)
          .input(0)
          .action(ctx -> {
            Privacy privacy = getPrivacy(ctx.update(), ctx.user().getId());
  
            ListMultimap<Privacy, String> abilitiesPerPrivacy = abilities.entrySet().stream()
                .map(entry -> {
                  String name = entry.getValue().name();
                  String info = entry.getValue().info();
  
                  if (!isEmpty(info))
                    return Pair.of(entry.getValue().privacy(), format("/%s - %s", name, info));
                  return Pair.of(entry.getValue().privacy(), format("/%s", name));
                })
                .sorted(comparing(Pair::b))
                .collect(() -> hashKeys().arrayListValues().build(),
                    (map, pair) -> map.put(pair.a(), pair.b()),
                    Multimap::putAll);
  
            String commands = abilitiesPerPrivacy.asMap().entrySet().stream()
                .filter(entry -> privacy.compareTo(entry.getKey()) >= 0)
                .sorted(comparing(Entry::getKey))
                .map(entry ->
                    entry.getValue().stream()
                        .reduce(entry.getKey().toString(), (a, b) -> format("%s\n%s", a, b))
                )
                .collect(joining("\n"));
  
            if (commands.isEmpty())
              commands = getLocalizedMessage(ABILITY_COMMANDS_NOT_FOUND, ctx.user().getLanguageCode());
  
            silent.send(commands, ctx.chatId());
          })
          .build();
    }