{
  "version": 1,
  "acciones": [
    {
      "id": "disco_libre",
      "grupo": "sistema",
      "frases": [
        "cuanto espacio queda",
        "espacio en disco",
        "espacio libre en disco",
        "cuanto disco queda",
        "cuando espacio queda",
        "cuanto espacio quedan"
      ],
      "acuse": "Un momento, lo miro, señor.",
      "comando": "df -h / | tail -1",
      "host": true,
      "respuesta": "Quedan {campo4} libres de {campo2}, al {campo5} de uso, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "disco_home",
      "grupo": "sistema",
      "frases": [
        "como esta mi disco",
        "cuanto ocupa mi disco",
        "espacio de mi disco"
      ],
      "acuse": "Un momento, señor.",
      "comando": "df -h ~ | tail -1",
      "host": true,
      "respuesta": "Su disco esta al {campo5}, con {campo4} libres de {campo2}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "disco_todos",
      "grupo": "sistema",
      "frases": [
        "discos montados",
        "particiones",
        "unidades montadas"
      ],
      "acuse": "Enseguida, señor.",
      "comando": "df -h --output=target,size,pcent -x tmpfs -x devtmpfs | tail -n +2",
      "host": true,
      "respuesta": "Hay {lineas} unidades montadas. {salida}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "memoria",
      "grupo": "sistema",
      "frases": [
        "cuanta memoria",
        "memoria libre",
        "cuanta ram",
        "ram libre"
      ],
      "acuse": "Voy, señor.",
      "comando": "free -g | awk '/Mem:/{print $2, $3, $7}'",
      "host": true,
      "respuesta": "De {campo1} gigas hay {campo2} en uso y {campo3} disponibles, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "swap",
      "grupo": "sistema",
      "frases": [
        "como esta la swap",
        "memoria de intercambio"
      ],
      "acuse": "Voy, señor.",
      "comando": "free -g | awk '/Swap:/{print $2, $3}'",
      "host": true,
      "respuesta": "Swap: {campo2} gigas usados de {campo1}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "cpu_carga",
      "grupo": "sistema",
      "frases": [
        "carga del sistema",
        "como va el procesador",
        "carga de cpu"
      ],
      "acuse": "Un segundo, señor.",
      "comando": "uptime | sed 's/.*average: //'",
      "host": true,
      "respuesta": "La carga media es {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "cpu_modelo",
      "grupo": "sistema",
      "frases": [
        "que procesador tengo",
        "modelo de procesador",
        "que cpu tengo"
      ],
      "acuse": "Enseguida, señor.",
      "comando": "lscpu | grep 'Model name' | cut -d: -f2 | xargs",
      "host": true,
      "respuesta": "Lleva un {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "cpu_nucleos",
      "grupo": "sistema",
      "frases": [
        "cuantos nucleos tengo",
        "cuantos hilos tengo"
      ],
      "acuse": "Voy, señor.",
      "comando": "nproc",
      "host": true,
      "respuesta": "Tiene {ultima} hilos disponibles, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "temperatura",
      "grupo": "sistema",
      "frases": [
        "que temperatura hay",
        "como esta de temperatura",
        "se esta calentando",
        "que temperatura tiene",
        "como esta la temperatura"
      ],
      "acuse": "Lo compruebo, señor.",
      "comando": "for z in /sys/class/thermal/thermal_zone*/temp; do cat $z; done | sort -rn | head -1 | awk '{printf \"%.0f\", $1/1000}'",
      "host": true,
      "respuesta": "El punto mas caliente esta a {ultima} grados, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "gpu_estado",
      "grupo": "sistema",
      "frases": [
        "como esta la grafica",
        "estado de la gpu",
        "uso de la grafica"
      ],
      "acuse": "Un momento, señor.",
      "comando": "nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total,temperature.gpu --format=csv,noheader",
      "host": true,
      "respuesta": "La grafica esta asi: {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "uptime",
      "grupo": "sistema",
      "frases": [
        "cuanto lleva encendido",
        "desde cuando esta encendido",
        "tiempo encendido"
      ],
      "acuse": "Voy, señor.",
      "comando": "uptime -p | sed 's/^up //; s/ days\\?/ dias/; s/ hours\\?/ horas/; s/ minutes\\?/ minutos/; s/,\\([^,]*\\)$/ y\\1/'",
      "host": true,
      "respuesta": "Lleva encendido {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "bateria",
      "grupo": "sistema",
      "frases": [
        "cuanta bateria queda",
        "como esta la bateria",
        "nivel de bateria",
        "cuanta bateria tengo",
        "como va la bateria"
      ],
      "acuse": "Lo miro, señor.",
      "comando": "cat /sys/class/power_supply/BAT*/capacity 2>/dev/null | head -1",
      "host": true,
      "respuesta": "La bateria esta al {ultima} por ciento, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "kernel",
      "grupo": "sistema",
      "frases": [
        "que kernel tengo",
        "version del kernel",
        "que nucleo tengo"
      ],
      "acuse": "Enseguida, señor.",
      "comando": "uname -r",
      "host": true,
      "respuesta": "Kernel {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "distro",
      "grupo": "sistema",
      "frases": [
        "que distribucion tengo",
        "que sistema tengo",
        "que linux tengo"
      ],
      "acuse": "Voy, señor.",
      "comando": "grep PRETTY_NAME /etc/os-release | cut -d'\"' -f2",
      "host": true,
      "respuesta": "Esta usando {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "fecha",
      "grupo": "sistema",
      "frases": [
        "que hora es",
        "que dia es",
        "dime la fecha"
      ],
      "acuse": "Voy, señor.",
      "comando": "date '+%H:%M del %A %d de %B'",
      "host": true,
      "respuesta": "Son las {salida}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "procesos_top",
      "grupo": "sistema",
      "frases": [
        "que esta consumiendo",
        "que consume mas",
        "procesos que mas gastan",
        "quien se come la cpu",
        "que esta consumiendo mas",
        "quien consume"
      ],
      "acuse": "Lo compruebo, señor.",
      "comando": "ps -eo pcpu,comm --sort=-pcpu --no-headers | head -5 | awk '{c=$1; $1=\"\"; sub(/^ +/,\"\"); printf \"%s al %s por ciento\\n\", $0, c}'",
      "host": true,
      "respuesta": "Lo que mas consume es {primera}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "procesos_memoria",
      "grupo": "sistema",
      "frases": [
        "que consume mas memoria",
        "quien se come la ram"
      ],
      "acuse": "Lo compruebo, señor.",
      "comando": "ps -eo comm,pmem --sort=-pmem --no-headers | head -5",
      "host": true,
      "respuesta": "Por memoria: {salida}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "procesos_cuantos",
      "grupo": "sistema",
      "frases": [
        "cuantos procesos hay",
        "cuantos procesos corren"
      ],
      "acuse": "Voy, señor.",
      "comando": "ps -e --no-headers | wc -l",
      "host": true,
      "respuesta": "Hay {ultima} procesos en marcha, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "red_ip",
      "grupo": "sistema",
      "frases": [
        "cual es mi ip",
        "mi ip local",
        "que ip tengo"
      ],
      "acuse": "Un momento, señor.",
      "comando": "hostname -I | awk '{print $1}'",
      "host": true,
      "respuesta": "Su IP local es {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "red_ip_publica",
      "grupo": "sistema",
      "frases": [
        "cual es mi ip publica",
        "ip externa"
      ],
      "acuse": "Salgo a mirarlo, señor.",
      "comando": "curl -s --max-time 6 ifconfig.me",
      "host": true,
      "respuesta": "Su IP publica es {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "red_wifi",
      "grupo": "sistema",
      "frases": [
        "a que wifi estoy conectado",
        "red wifi",
        "como se llama la wifi"
      ],
      "acuse": "Voy, señor.",
      "comando": "nmcli -t -f NAME,TYPE connection show --active | grep wireless | cut -d: -f1",
      "host": true,
      "respuesta": "Conectado a {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "red_velocidad",
      "grupo": "sistema",
      "frases": [
        "cuanto trafico de red",
        "trafico de red"
      ],
      "acuse": "Lo miro, señor.",
      "comando": "cat /proc/net/dev | awk '/wlp|enp/{rx+=$2; tx+=$10} END{printf \"%.1f %.1f\", rx/1e9, tx/1e9}'",
      "host": true,
      "respuesta": "Desde el arranque: {campo1} gigas bajados y {campo2} subidos, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "red_ping",
      "grupo": "sistema",
      "frases": [
        "hay internet",
        "tengo conexion",
        "funciona internet"
      ],
      "acuse": "Lo compruebo, señor.",
      "comando": "ping -c1 -W2 1.1.1.1 >/dev/null 2>&1 && echo si || echo no",
      "host": true,
      "respuesta": "Conexion: {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "puertos",
      "grupo": "sistema",
      "frases": [
        "que puertos hay abiertos",
        "puertos a la escucha",
        "quien esta escuchando"
      ],
      "acuse": "Un momento, señor.",
      "comando": "ss -ltnp 2>/dev/null | awk 'NR>1{print $4}' | sort -u | head -8",
      "host": true,
      "respuesta": "A la escucha: {salida}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "servicios_fallidos",
      "grupo": "sistema",
      "frases": [
        "hay servicios caidos",
        "servicios con fallos",
        "algo ha fallado"
      ],
      "acuse": "Lo reviso, señor.",
      "comando": "systemctl --failed --no-legend | wc -l",
      "host": true,
      "respuesta": "Servicios en fallo: {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "actualizaciones",
      "grupo": "sistema",
      "frases": [
        "hay actualizaciones",
        "paquetes por actualizar"
      ],
      "acuse": "Lo compruebo, tarda un poco, señor.",
      "comando": "apt list --upgradable 2>/dev/null | tail -n +2 | wc -l",
      "host": true,
      "respuesta": "Hay {ultima} paquetes por actualizar, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "usuarios",
      "grupo": "sistema",
      "frases": [
        "quien esta conectado",
        "hay alguien conectado"
      ],
      "acuse": "Voy, señor.",
      "comando": "who | wc -l",
      "host": true,
      "respuesta": "Hay {ultima} sesiones abiertas, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "gpu_procesos",
      "grupo": "sistema",
      "frases": [
        "que usa la grafica",
        "quien usa la gpu"
      ],
      "acuse": "Lo miro, señor.",
      "comando": "O=$(nvidia-smi --query-compute-apps=process_name,used_gpu_memory --format=csv,noheader | awk -F, '{n=split($1,p,\"/\"); printf \"%s%s\\n\", p[n], $2}'); echo \"${O:-nada, la grafica esta libre}\"",
      "host": true,
      "respuesta": "En la grafica: {primera}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "audio_salida",
      "grupo": "sistema",
      "frases": [
        "por donde suena",
        "salida de audio",
        "que altavoz esta puesto"
      ],
      "acuse": "Voy, señor.",
      "comando": "pactl get-default-sink 2>/dev/null",
      "host": true,
      "respuesta": "La salida es {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "audio_micro",
      "grupo": "sistema",
      "frases": [
        "que microfono hay puesto",
        "entrada de audio"
      ],
      "acuse": "Voy, señor.",
      "comando": "pactl get-default-source 2>/dev/null",
      "host": true,
      "respuesta": "La entrada es {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "pantallas",
      "grupo": "sistema",
      "frases": [
        "cuantas pantallas hay",
        "monitores conectados"
      ],
      "acuse": "Voy, señor.",
      "comando": "n=$(xrandr --listmonitors 2>/dev/null | head -1 | awk '{print $2}'); xrandr --listmonitors 2>/dev/null | tail -n +2 | awk '{print $NF}' | paste -sd', '; echo \"Tiene $n pantalla$([ \"$n\" = 1 ] || echo s) conectada$([ \"$n\" = 1 ] || echo s)\"",
      "host": true,
      "respuesta": "{ultima}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "dispositivos_usb",
      "grupo": "sistema",
      "frases": [
        "que hay conectado por usb",
        "dispositivos usb"
      ],
      "acuse": "Un momento, señor.",
      "comando": "lsusb | cut -d' ' -f7- | head -6",
      "host": true,
      "respuesta": "Por USB: {salida}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "bluetooth",
      "grupo": "sistema",
      "frases": [
        "que hay emparejado por bluetooth",
        "dispositivos bluetooth"
      ],
      "acuse": "Voy, señor.",
      "comando": "bluetoothctl devices 2>/dev/null | cut -d' ' -f3- | head -5",
      "host": true,
      "respuesta": "Emparejados: {salida}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "flatpaks",
      "grupo": "sistema",
      "frases": [
        "que flatpaks tengo",
        "aplicaciones flatpak"
      ],
      "acuse": "Voy, señor.",
      "comando": "flatpak list --app --columns=name | head -10",
      "host": true,
      "respuesta": "Instalados: {salida}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "docker",
      "grupo": "sistema",
      "frases": [
        "hay contenedores corriendo",
        "contenedores docker"
      ],
      "acuse": "Lo miro, señor.",
      "comando": "O=$(docker ps --format '{{.Names}}' 2>/dev/null | head -5); echo \"${O:-ninguno en marcha}\"",
      "host": true,
      "respuesta": "Contenedores: {salida}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "git_estado",
      "grupo": "sistema",
      "frases": [
        "como esta el repositorio",
        "estado de git"
      ],
      "acuse": "Voy, señor.",
      "comando": "cd ~/COFRE/CODERS/JARVIS && git status --short | wc -l",
      "host": true,
      "respuesta": "Hay {ultima} ficheros con cambios sin guardar, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ollama_estado",
      "grupo": "sistema",
      "frases": [
        "esta ollama funcionando",
        "como esta el modelo",
        "que modelo hay cargado"
      ],
      "acuse": "Lo compruebo, señor.",
      "comando": "M=$(curl -s --max-time 3 http://localhost:11434/api/ps | grep -o '\"name\":\"[^\"]*' | cut -d'\"' -f4 | head -1); echo \"${M:-ninguno ahora mismo}\"",
      "host": true,
      "respuesta": "Modelo cargado: {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "apagar_pantalla",
      "grupo": "sistema",
      "frases": [
        "apaga la pantalla",
        "apagar pantalla"
      ],
      "acuse": "Enseguida, señor.",
      "comando": "xset dpms force off",
      "host": true,
      "respuesta": "Pantalla apagada, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "actualizar_lista",
      "grupo": "sistema",
      "frases": [
        "actualiza los repositorios",
        "refresca los paquetes",
        "actualiza la lista de paquetes"
      ],
      "acuse": "Voy, necesito permiso de administrador, señor.",
      "comando": "sudo apt update",
      "host": true,
      "respuesta": "Repositorios actualizados, señor.",
      "confirmar": true,
      "captura": false
    },
    {
      "id": "espacio_liberar",
      "grupo": "sistema",
      "frases": [
        "limpia los paquetes viejos",
        "libera espacio de apt",
        "limpia el cache de paquetes"
      ],
      "acuse": "Necesito permiso para esto, señor.",
      "comando": "sudo apt autoclean",
      "host": true,
      "respuesta": "Cache de paquetes limpiada, señor.",
      "confirmar": true,
      "captura": false
    },
    {
      "id": "servicio_reiniciar",
      "grupo": "sistema",
      "frases": [
        "reinicia el servicio de red",
        "reinicia la red"
      ],
      "acuse": "Necesito permiso de administrador, señor.",
      "comando": "sudo systemctl restart NetworkManager",
      "host": true,
      "respuesta": "Red reiniciada, señor.",
      "confirmar": true,
      "captura": false
    },
    {
      "id": "fecha_sincronizar",
      "grupo": "sistema",
      "frases": [
        "sincroniza la hora",
        "pon la hora en hora"
      ],
      "acuse": "Un momento, con permiso, señor.",
      "comando": "sudo systemctl restart systemd-timesyncd",
      "host": true,
      "respuesta": "Hora sincronizada, señor.",
      "confirmar": true,
      "captura": false
    },
    {
      "id": "bloquear",
      "grupo": "sistema",
      "frases": [
        "bloquea la sesion",
        "bloquear pantalla",
        "echa el cerrojo"
      ],
      "acuse": "Ahora mismo, señor.",
      "comando": "loginctl lock-session",
      "host": true,
      "respuesta": "Sesion bloqueada, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "volumen_subir",
      "grupo": "sistema",
      "frases": [
        "sube el volumen",
        "mas volumen"
      ],
      "acuse": "Voy, señor.",
      "comando": "pactl set-sink-volume @DEFAULT_SINK@ +10%",
      "host": true,
      "respuesta": "Volumen subido, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "volumen_bajar",
      "grupo": "sistema",
      "frases": [
        "baja el volumen",
        "menos volumen"
      ],
      "acuse": "Voy, señor.",
      "comando": "pactl set-sink-volume @DEFAULT_SINK@ -10%",
      "host": true,
      "respuesta": "Volumen bajado, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "volumen_silencio",
      "grupo": "sistema",
      "frases": [
        "silencia el sistema",
        "quita el sonido",
        "mutea el sistema"
      ],
      "acuse": "Voy, señor.",
      "comando": "pactl set-sink-mute @DEFAULT_SINK@ toggle",
      "host": true,
      "respuesta": "Sonido conmutado, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "brillo_subir",
      "grupo": "sistema",
      "frases": [
        "sube el brillo",
        "mas brillo"
      ],
      "acuse": "Voy, señor.",
      "comando": "brightnessctl set +10% 2>/dev/null || xrandr --output $(xrandr | awk '/ connected/{print $1; exit}') --brightness 1",
      "host": true,
      "respuesta": "Brillo subido, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "captura_pantalla",
      "grupo": "sistema",
      "frases": [
        "hazme una captura",
        "captura de pantalla",
        "haz una foto de la pantalla"
      ],
      "acuse": "Enseguida se la hago, señor.",
      "comando": "D=$(xdg-user-dir PICTURES 2>/dev/null || echo ~); F=$D/captura-$(date +%H%M%S).png; import -window root \"$F\" 2>/dev/null || gnome-screenshot -f \"$F\" 2>/dev/null || ffmpeg -loglevel error -f x11grab -video_size $(xdpyinfo | awk \"/dimensions/{print \\$2}\") -i $DISPLAY -frames:v 1 -y \"$F\" 2>/dev/null; [ -s \"$F\" ] && echo \"$F\"",
      "host": true,
      "respuesta": "Captura guardada, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "papelera_tamano",
      "grupo": "sistema",
      "frases": [
        "cuanto ocupa la papelera",
        "papelera llena"
      ],
      "acuse": "Voy, señor.",
      "comando": "du -sh ~/.local/share/Trash 2>/dev/null | cut -f1",
      "host": true,
      "respuesta": "La papelera ocupa {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "descargas_listar",
      "grupo": "sistema",
      "frases": [
        "que hay en descargas",
        "ultimas descargas",
        "que me he bajado"
      ],
      "acuse": "Voy, señor.",
      "comando": "ls -t ~/Downloads 2>/dev/null | head -6",
      "host": true,
      "respuesta": "Hay {lineas} cosas en descargas, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "descargas_abrir",
      "grupo": "sistema",
      "frases": [
        "abre la carpeta de descargas",
        "abreme descargas",
        "abre descargas",
        "abreme las descargas"
      ],
      "acuse": "Enseguida se la abro, señor.",
      "comando": "xdg-open ~/Downloads",
      "host": true,
      "respuesta": "Carpeta de descargas abierta, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "documentos_abrir",
      "grupo": "sistema",
      "frases": [
        "abre mis documentos",
        "abreme documentos"
      ],
      "acuse": "Enseguida, señor.",
      "comando": "xdg-open ~/Documents",
      "host": true,
      "respuesta": "Documentos abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "cofre_abrir",
      "grupo": "sistema",
      "frases": [
        "abre el cofre",
        "abreme el cofre"
      ],
      "acuse": "Enseguida, señor.",
      "comando": "xdg-open ~/COFRE",
      "host": true,
      "respuesta": "COFRE abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ficheros_recientes",
      "grupo": "sistema",
      "frases": [
        "que he tocado ultimamente",
        "ficheros recientes",
        "en que estaba trabajando"
      ],
      "acuse": "Lo miro, señor.",
      "comando": "find ~ -maxdepth 3 -type f -mmin -180 -not -path '*/.*' 2>/dev/null | head -6",
      "host": true,
      "respuesta": "Tocado en las ultimas horas: {salida}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "grandes",
      "grupo": "sistema",
      "frases": [
        "que ocupa mas sitio",
        "que tengo en descargas",
        "que me esta llenando la carpeta"
      ],
      "acuse": "Lo miro, señor.",
      "comando": "du -ah ~/Downloads ~/Descargas ~/Documents ~/Desktop 2>/dev/null | sort -rh | head -6",
      "host": true,
      "respuesta": "Lo mas grande: {salida}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "terminal_abrir",
      "grupo": "sistema",
      "frases": [
        "abre una terminal",
        "abreme una terminal",
        "abre la terminal",
        "saca una terminal",
        "quiero una terminal"
      ],
      "acuse": "Ahora mismo, señor.",
      "comando": "gnome-terminal 2>/dev/null || kgx 2>/dev/null || xterm 2>/dev/null &",
      "host": true,
      "respuesta": "Terminal abierta, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "terminal_aqui",
      "grupo": "sistema",
      "frases": [
        "abre una terminal en el cofre",
        "terminal en el cofre"
      ],
      "acuse": "Enseguida, señor.",
      "comando": "gnome-terminal --working-directory=$HOME/COFRE 2>/dev/null || kgx 2>/dev/null &",
      "host": true,
      "respuesta": "Ahi la tiene, en el cofre, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "videos_listar",
      "grupo": "sistema",
      "frases": [
        "que peliculas tengo",
        "que videos tengo",
        "lista mis videos"
      ],
      "acuse": "Un momento, lo miro, señor.",
      "comando": "timeout 12 find $HOME/Videos $HOME/Downloads $HOME/Desktop -type f -regextype posix-extended -iregex '.*\\.(mp4|mkv|avi|webm|mov|m4v)$' 2>/dev/null | head -12",
      "host": true,
      "respuesta": "He encontrado {lineas}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "pelicula_abrir",
      "grupo": "sistema",
      "frases": [
        "pon la pelicula",
        "abre la pelicula",
        "reproduce el video",
        "pon el video",
        "quiero ver"
      ],
      "acuse": "Enseguida se la pongo, señor.",
      "comando": "v=$(timeout 12 find $HOME/Videos $HOME/Downloads $HOME/Desktop -type f -regextype posix-extended -iregex '.*{argumento}.*\\.(mp4|mkv|avi|webm|mov|m4v)$' 2>/dev/null | head -1); if [ -n \"$v\" ]; then xdg-open \"$v\" >/dev/null 2>&1 & echo \"Poniendo $(basename \"$v\")\"; else echo \"No encuentro ese video\"; fi",
      "host": true,
      "respuesta": "{ultima}, señor",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "ventanas_listar",
      "grupo": "ventanas",
      "frases": [
        "que ventanas tengo abiertas",
        "que ventanas hay abiertas",
        "lista las ventanas"
      ],
      "acuse": "Un momento, lo miro, señor.",
      "comando": "$HOME/COFRE/CODERS/JARVIS/config/ventanas.sh listar",
      "host": true,
      "respuesta": "Tiene {lineas} ventanas abiertas, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ventana_izquierda",
      "grupo": "ventanas",
      "frases": [
        "pon la ventana a la izquierda",
        "manda la ventana a la izquierda",
        "esta ventana a la izquierda"
      ],
      "acuse": "Ahora mismo, señor.",
      "comando": "$HOME/COFRE/CODERS/JARVIS/config/ventanas.sh zona esta izquierda",
      "host": true,
      "respuesta": "{ultima}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ventana_derecha",
      "grupo": "ventanas",
      "frases": [
        "pon la ventana a la derecha",
        "manda la ventana a la derecha",
        "esta ventana a la derecha"
      ],
      "acuse": "Ahora mismo, señor.",
      "comando": "$HOME/COFRE/CODERS/JARVIS/config/ventanas.sh zona esta derecha",
      "host": true,
      "respuesta": "{ultima}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ventana_arriba",
      "grupo": "ventanas",
      "frases": [
        "pon la ventana arriba del todo",
        "manda la ventana arriba"
      ],
      "acuse": "Voy, señor.",
      "comando": "$HOME/COFRE/CODERS/JARVIS/config/ventanas.sh zona esta arriba",
      "host": true,
      "respuesta": "{ultima}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ventana_abajo",
      "grupo": "ventanas",
      "frases": [
        "pon la ventana abajo del todo",
        "manda la ventana abajo"
      ],
      "acuse": "Voy, señor.",
      "comando": "$HOME/COFRE/CODERS/JARVIS/config/ventanas.sh zona esta abajo",
      "host": true,
      "respuesta": "{ultima}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ventana_centrar",
      "grupo": "ventanas",
      "frases": [
        "centra la ventana activa",
        "pon la ventana en el centro"
      ],
      "acuse": "Enseguida, señor.",
      "comando": "$HOME/COFRE/CODERS/JARVIS/config/ventanas.sh zona esta centro",
      "host": true,
      "respuesta": "{ultima}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ventana_maximizar",
      "grupo": "ventanas",
      "frases": [
        "maximiza la ventana activa",
        "pon la ventana a pantalla completa"
      ],
      "acuse": "Ahora mismo, señor.",
      "comando": "$HOME/COFRE/CODERS/JARVIS/config/ventanas.sh maximiza esta",
      "host": true,
      "respuesta": "{ultima}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ventana_restaurar",
      "grupo": "ventanas",
      "frases": [
        "restaura la ventana activa",
        "quita la pantalla completa"
      ],
      "acuse": "Voy, señor.",
      "comando": "$HOME/COFRE/CODERS/JARVIS/config/ventanas.sh restaura esta",
      "host": true,
      "respuesta": "{ultima}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ventana_minimizar",
      "grupo": "ventanas",
      "frases": [
        "minimiza la ventana activa",
        "esconde la ventana activa"
      ],
      "acuse": "Voy, señor.",
      "comando": "$HOME/COFRE/CODERS/JARVIS/config/ventanas.sh minimiza esta",
      "host": true,
      "respuesta": "{ultima}, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ventana_a_pantalla",
      "grupo": "ventanas",
      "frases": [
        "manda la ventana a la pantalla",
        "pasa la ventana a la pantalla"
      ],
      "acuse": "Ahora mismo, señor.",
      "comando": "$HOME/COFRE/CODERS/JARVIS/config/ventanas.sh mover esta {argumento}",
      "host": true,
      "respuesta": "{ultima}, señor",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "ventana_al_escritorio",
      "grupo": "ventanas",
      "frases": [
        "manda la ventana al escritorio",
        "pasa la ventana al escritorio"
      ],
      "acuse": "Voy, señor.",
      "comando": "$HOME/COFRE/CODERS/JARVIS/config/ventanas.sh escritorio esta {argumento}",
      "host": true,
      "respuesta": "{ultima}, señor",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "pantalla_nombrar",
      "grupo": "ventanas",
      "frases": [
        "a esta pantalla llamala",
        "llama a esta pantalla"
      ],
      "acuse": "Anotado, señor.",
      "comando": "$HOME/COFRE/CODERS/JARVIS/config/ventanas.sh alias 1 {argumento}",
      "host": true,
      "respuesta": "{ultima}, señor",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "buscar_fichero",
      "grupo": "ficheros",
      "frases": [
        "busca el fichero",
        "buscame el fichero",
        "encuentra el fichero"
      ],
      "acuse": "Lo busco, señor.",
      "comando": "timeout 12 find $HOME/Documents $HOME/Desktop $HOME/COFRE/CODERS $HOME/Downloads -iname '*{argumento}*' -not -path '*/.*' -not -path '*/node_modules/*' -not -path '*venv*' 2>/dev/null | head -12",
      "host": true,
      "respuesta": "He encontrado {lineas}, señor",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "buscar_carpeta",
      "grupo": "ficheros",
      "frases": [
        "busca la carpeta",
        "encuentra la carpeta"
      ],
      "acuse": "La busco, señor.",
      "comando": "find ~ -type d -iname '*{argumento}*' -not -path '*/.*' 2>/dev/null | head -12",
      "host": true,
      "respuesta": "Carpetas encontradas: {salida}, señor",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "grep_recursivo",
      "grupo": "ficheros",
      "frases": [
        "busca el texto",
        "busca la palabra en mis ficheros",
        "donde pone",
        "que fichero contiene"
      ],
      "acuse": "Lo busco en sus ficheros, señor.",
      "comando": "timeout 12 grep -rIn --exclude-dir='.*' --exclude-dir='*venv*' --exclude-dir=node_modules --exclude-dir=__pycache__ --exclude-dir=modelos --exclude-dir=muestras -m1 {argumento} $HOME/Documents $HOME/Desktop $HOME/COFRE/CODERS 2>/dev/null | head -12",
      "host": true,
      "respuesta": "{lineas} ficheros lo contienen, señor.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "leer_fichero",
      "grupo": "ficheros",
      "frases": [
        "leeme el fichero",
        "abre y leeme",
        "lee el fichero"
      ],
      "acuse": "Voy a leerlo, señor.",
      "comando": "f=$(timeout 12 find $HOME/Documents $HOME/Desktop $HOME/COFRE/CODERS -iname '*{argumento}*' -type f -not -path '*/.*' 2>/dev/null | head -1); [ -n \"$f\" ] && head -c 800 \"$f\" || echo \"no lo encuentro\"",
      "host": true,
      "respuesta": "{salida}, señor",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "abrir_fichero",
      "grupo": "ficheros",
      "frases": [
        "abre el fichero",
        "abreme el fichero"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "f=$(find ~ -iname '*{argumento}*' -type f -not -path '*/.*' 2>/dev/null | head -1); [ -n \"$f\" ] && xdg-open \"$f\" && echo \"$f\" || echo 'no lo encuentro'",
      "host": true,
      "respuesta": "Abierto {ultima}, señor.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "abrir_carpeta",
      "grupo": "ficheros",
      "frases": [
        "abre la carpeta",
        "abreme la carpeta"
      ],
      "acuse": "Enseguida, señor.",
      "comando": "a={argumento}; if [ -d \"$a\" ]; then d=\"$a\"; else d=$(timeout 12 find $HOME/Documents $HOME/Desktop $HOME/COFRE $HOME/Downloads -type d -iname \"*$a*\" -not -path \"*/.*\" -not -path \"*/node_modules/*\" 2>/dev/null | head -1); fi; if [ -n \"$d\" ]; then xdg-open \"$d\" >/dev/null 2>&1 & echo \"Abierta $(basename \"$d\")\"; else echo \"No encuentro esa carpeta\"; fi",
      "host": true,
      "respuesta": "{ultima}, señor",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "tamano_carpeta",
      "grupo": "ficheros",
      "frases": [
        "cuanto ocupa la carpeta",
        "tamaño de la carpeta"
      ],
      "acuse": "Lo calculo, señor.",
      "comando": "a={argumento}; if [ -d \"$a\" ]; then d=\"$a\"; else d=$(timeout 12 find $HOME/Documents $HOME/Desktop $HOME/COFRE $HOME/Downloads -type d -iname \"*$a*\" -not -path \"*/.*\" 2>/dev/null | head -1); fi; [ -n \"$d\" ] && du -sh \"$d\" 2>/dev/null | cut -f1 || echo \"no la encuentro\"",
      "host": true,
      "respuesta": "Ocupa {ultima}, señor.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "proceso_buscar",
      "grupo": "ficheros",
      "frases": [
        "esta corriendo",
        "se esta ejecutando",
        "hay algun proceso de"
      ],
      "acuse": "Lo compruebo, señor.",
      "comando": "pgrep -c -f {argumento} 2>/dev/null || echo 0",
      "host": true,
      "respuesta": "Hay {ultima} procesos que encajan, señor.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "proceso_matar",
      "grupo": "ficheros",
      "frases": [
        "mata el proceso",
        "cierra el proceso",
        "termina el proceso"
      ],
      "acuse": "Antes de matarlo, confirmeme, señor.",
      "comando": "pkill -f {argumento}",
      "host": true,
      "respuesta": "Proceso terminado, señor.",
      "confirmar": true,
      "captura": true
    },
    {
      "id": "instalado",
      "grupo": "ficheros",
      "frases": [
        "tengo instalado",
        "esta instalado"
      ],
      "acuse": "Lo miro, señor.",
      "comando": "command -v {argumento} >/dev/null && echo si || echo no",
      "host": true,
      "respuesta": "Instalado: {ultima}, señor.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "manual",
      "grupo": "ficheros",
      "frases": [
        "para que sirve el comando",
        "que hace el comando"
      ],
      "acuse": "Voy, señor.",
      "comando": "whatis {argumento} 2>/dev/null | head -1",
      "host": true,
      "respuesta": "{salida}, señor",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "oasis_corriendo",
      "grupo": "oasis",
      "frases": [
        "esta oasis funcionando",
        "esta corriendo oasis",
        "oasis esta levantado",
        "esta corriendo casis"
      ],
      "acuse": "Lo compruebo, señor.",
      "comando": "pgrep -c -f 'oasis|ssb-server|sbot' 2>/dev/null || echo 0",
      "host": true,
      "respuesta": "Procesos de Oasis en marcha: {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "oasis_sincronizando",
      "grupo": "oasis",
      "frases": [
        "estan sincronizando los pubs",
        "como van los pubs",
        "se estan sincronizando los pubs",
        "estan sincronizando los push",
        "estan sincronizando los puos",
        "sincronizando los pubs",
        "como van los push"
      ],
      "acuse": "Voy a mirar las conexiones, señor.",
      "comando": "python3 -c \"import json,time; d=json.load(open('$HOME/.ssb/conn.json')); act=sum(1 for v in d.values() if time.time()*1000-v.get('stateChange',0)<300000); fail=sum(1 for v in d.values() if v.get('failure',0)>0); print(f'{len(d)} pubs, {act} activos hace poco, {fail} con fallos')\"",
      "host": true,
      "respuesta": "{ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "oasis_conexiones",
      "grupo": "oasis",
      "frases": [
        "cuantos pubs hay conectados",
        "conexiones de oasis"
      ],
      "acuse": "Un momento, señor.",
      "comando": "cat ~/.ssb/conn.json 2>/dev/null | grep -c 'connected' || echo 0",
      "host": true,
      "respuesta": "Pubs conectados: {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "oasis_tamano",
      "grupo": "oasis",
      "frases": [
        "cuanto ocupa oasis",
        "tamaño de la base de ssb"
      ],
      "acuse": "Lo calculo, señor.",
      "comando": "du -sh ~/.ssb 2>/dev/null | cut -f1",
      "host": true,
      "respuesta": "La base de SSB ocupa {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "oasis_abrir",
      "grupo": "oasis",
      "frases": [
        "abre oasis",
        "abreme oasis"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "xdg-open http://localhost:3000 2>/dev/null && echo abierto || echo 'no responde'",
      "host": true,
      "respuesta": "Oasis: {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "oasis_blobs",
      "grupo": "oasis",
      "frases": [
        "cuanto ocupan los blobs",
        "tamaño de los blobs"
      ],
      "acuse": "Voy, señor.",
      "comando": "du -sh ~/.ssb/blobs 2>/dev/null | cut -f1",
      "host": true,
      "respuesta": "Los blobs ocupan {ultima}, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "red_dispositivos",
      "grupo": "pentest",
      "frases": [
        "escanea mi red",
        "que hay en mi red",
        "dispositivos en la red",
        "quien esta en la red"
      ],
      "acuse": "Voy a escanear la red local, necesito su permiso, señor.",
      "comando": "R=$(ip route | awk '/proto.*src/{for(i=1;i<=NF;i++)if($i~/\\//)print $i; exit}'); sudo nmap -sn ${R:-192.168.1.0/24} | grep -E 'Nmap scan|MAC' | head -30",
      "host": true,
      "respuesta": "Estos equipos hay en la red, señor: {salida}",
      "confirmar": true,
      "captura": false
    },
    {
      "id": "puertos_host",
      "grupo": "pentest",
      "frases": [
        "que puertos tiene abiertos",
        "escanea los puertos de",
        "escanea el host"
      ],
      "acuse": "Un escaneo de puertos, con su permiso, señor.",
      "comando": "T={argumento}; echo \"$T\" | grep -qE '^(10\\.|172\\.(1[6-9]|2[0-9]|3[01])\\.|192\\.168\\.|127\\.|localhost)' && nmap -F \"$T\" | grep -E '^[0-9]+/|Nmap scan' | head -20 || echo 'Solo objetivos de la red local, señor.'",
      "host": true,
      "respuesta": "{salida}, señor",
      "confirmar": true,
      "captura": true
    },
    {
      "id": "mis_puertos",
      "grupo": "pentest",
      "frases": [
        "que puertos tengo abiertos yo",
        "mis puertos abiertos",
        "que estoy exponiendo"
      ],
      "acuse": "Lo compruebo, señor.",
      "comando": "ss -ltnp 2>/dev/null | awk 'NR>1{print $4}' | sort -u | head -15",
      "host": true,
      "respuesta": "Tengo {lineas} puertos a la escucha, señor",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "exploit_buscar",
      "grupo": "pentest",
      "frases": [
        "busca un exploit para",
        "busca exploits de",
        "hay algun exploit de"
      ],
      "acuse": "Lo busco en la base de exploits, señor.",
      "comando": "searchsploit {argumento} 2>/dev/null | grep -vE '^-|Shellcode' | head -12",
      "host": true,
      "respuesta": "Esto he encontrado, señor: {salida}",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "dominio_resolver",
      "grupo": "pentest",
      "frases": [
        "resuelve el dominio",
        "que ip tiene el dominio",
        "a que ip apunta"
      ],
      "acuse": "Lo resuelvo, señor.",
      "comando": "dig +short {argumento} 2>/dev/null | head -5",
      "host": true,
      "respuesta": "Resuelve a: {salida}, señor",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "dominio_whois",
      "grupo": "pentest",
      "frases": [
        "de quien es el dominio",
        "quien registro",
        "whois de"
      ],
      "acuse": "Lo consulto, señor.",
      "comando": "whois {argumento} 2>/dev/null | grep -iE 'registrar:|creation|expir|org' | head -6",
      "host": true,
      "respuesta": "{salida}, señor",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "cabeceras_web",
      "grupo": "pentest",
      "frases": [
        "que servidor usa",
        "cabeceras de",
        "que tecnologia usa la web"
      ],
      "acuse": "Miro las cabeceras, señor.",
      "comando": "curl -sI --max-time 8 {argumento_url} 2>/dev/null | grep -iE 'server:|x-powered|location' | head -6",
      "host": true,
      "respuesta": "{salida}, señor",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "hash_identificar",
      "grupo": "pentest",
      "frases": [
        "que tipo de hash es",
        "identifica el hash"
      ],
      "acuse": "Lo miro, señor.",
      "comando": "H={argumento}; L=${#H}; case $L in 32)echo 'MD5, probablemente';; 40)echo 'SHA1';; 64)echo 'SHA256';; *)echo \"$L caracteres, no lo tengo claro\";; esac",
      "host": true,
      "respuesta": "{ultima}, señor.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "ff_gmail",
      "grupo": "firefox",
      "frases": [
        "abre el correo",
        "abre gmail",
        "abreme el correo",
        "a ver el correo",
        "abrir el correo"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://mail.google.com' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_calendario",
      "grupo": "firefox",
      "frases": [
        "abre el calendario",
        "abreme el calendario"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://calendar.google.com' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_drive",
      "grupo": "firefox",
      "frases": [
        "abre drive",
        "abre el drive"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://drive.google.com' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_maps",
      "grupo": "firefox",
      "frases": [
        "abre el mapa",
        "abre google maps",
        "abreme los mapas"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://maps.google.com' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_youtube",
      "grupo": "firefox",
      "frases": [
        "abre youtube",
        "abreme youtube",
        "abre yo tube",
        "abre you tube"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://youtube.com' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_github",
      "grupo": "firefox",
      "frases": [
        "abre github",
        "abreme github"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://github.com' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_gitea",
      "grupo": "firefox",
      "frases": [
        "abre gitea",
        "abre el gitea"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://gitea.laenre.net' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_wikipedia",
      "grupo": "firefox",
      "frases": [
        "abre la wikipedia",
        "abreme wikipedia"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://es.wikipedia.org' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_traductor",
      "grupo": "firefox",
      "frases": [
        "abre el traductor",
        "abreme el traductor"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://translate.google.com' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_chatgpt_no",
      "grupo": "firefox",
      "frases": [
        "abre duckduckgo",
        "abre el buscador"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://duckduckgo.com' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_mastodon",
      "grupo": "firefox",
      "frases": [
        "abre mastodon",
        "abreme mastodon"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://mastodon.social' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_reddit",
      "grupo": "firefox",
      "frases": [
        "abre reddit"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://reddit.com' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_hackernews",
      "grupo": "firefox",
      "frases": [
        "abre hacker news",
        "abreme hacker news"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://news.ycombinator.com' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_archwiki",
      "grupo": "firefox",
      "frases": [
        "abre la wiki de arch",
        "abre archwiki"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://wiki.archlinux.org' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_stackoverflow",
      "grupo": "firefox",
      "frases": [
        "abre stack overflow",
        "abreme stackoverflow"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://stackoverflow.com' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_flathub",
      "grupo": "firefox",
      "frases": [
        "abre flathub"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://flathub.org' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_openstreetmap",
      "grupo": "firefox",
      "frases": [
        "abre openstreetmap",
        "abre el mapa libre"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://openstreetmap.org' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_wetransfer",
      "grupo": "firefox",
      "frases": [
        "abre wetransfer"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://wetransfer.com' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_bandcamp",
      "grupo": "firefox",
      "frases": [
        "abre bandcamp"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://bandcamp.com' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_soundcloud",
      "grupo": "firefox",
      "frases": [
        "abre soundcloud"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://soundcloud.com' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_spotify_web",
      "grupo": "firefox",
      "frases": [
        "abre spotify"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://open.spotify.com' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_twitch",
      "grupo": "firefox",
      "frases": [
        "abre twitch"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://twitch.tv' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_archive",
      "grupo": "firefox",
      "frases": [
        "abre archive punto org",
        "abre internet archive"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://archive.org' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_libgen",
      "grupo": "firefox",
      "frases": [
        "abre la biblioteca",
        "abre library genesis"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://libgen.is' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_meteo",
      "grupo": "firefox",
      "frases": [
        "abre el tiempo",
        "que tiempo va a hacer",
        "abre la meteorologia"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://www.aemet.es' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_renfe",
      "grupo": "firefox",
      "frases": [
        "abre renfe",
        "mira los trenes"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://www.renfe.com' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_idealista",
      "grupo": "firefox",
      "frases": [
        "abre idealista"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://www.idealista.com' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_wallapop",
      "grupo": "firefox",
      "frases": [
        "abre wallapop"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://es.wallapop.com' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_oasis_web",
      "grupo": "firefox",
      "frases": [
        "abre oasis en el navegador"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'http://localhost:3000' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_router",
      "grupo": "firefox",
      "frases": [
        "abre el router",
        "entra en el router"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'http://192.168.1.1' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_localhost",
      "grupo": "firefox",
      "frases": [
        "abre localhost"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'http://localhost' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_correo_local",
      "grupo": "firefox",
      "frases": [
        "abre el webmail"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://webmail.laenre.net' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_nodo50",
      "grupo": "firefox",
      "frases": [
        "abre nodo cincuenta",
        "abre nodo50"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://nodo50.org' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_hackmeeting",
      "grupo": "firefox",
      "frases": [
        "abre hackmeeting"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://sindominio.net/hackmeeting' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_reas",
      "grupo": "firefox",
      "frases": [
        "abre reas",
        "abre la red de economia alternativa"
      ],
      "acuse": "Enseguida se lo abro, señor.",
      "comando": "firefox --new-tab 'https://www.economiasolidaria.org' >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ya lo tiene abierto, señor.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_buscar_web",
      "grupo": "firefox",
      "frases": [
        "busca en internet",
        "buscame en internet",
        "busca en la web"
      ],
      "acuse": "Lo busco, señor.",
      "comando": "firefox --new-tab \"https://duckduckgo.com/?q={argumento_url}\" >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Buscando {argumento}, señor. Ya lo tiene en pantalla.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "ff_buscar_duck",
      "grupo": "firefox",
      "frases": [
        "busca en duckduckgo"
      ],
      "acuse": "Lo busco, señor.",
      "comando": "firefox --new-tab \"https://duckduckgo.com/?q={argumento_url}\" >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Buscando {argumento}, señor. Ya lo tiene en pantalla.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "ff_buscar_youtube",
      "grupo": "firefox",
      "frases": [
        "busca en youtube",
        "buscame en youtube",
        "busca en yo tube",
        "buscan youtube",
        "buscan yo tube",
        "busca en you tube"
      ],
      "acuse": "Lo busco, señor.",
      "comando": "firefox --new-tab \"https://www.youtube.com/results?search_query={argumento_url}\" >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Buscando {argumento}, señor. Ya lo tiene en pantalla.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "ff_buscar_wikipedia",
      "grupo": "firefox",
      "frases": [
        "busca en la wikipedia",
        "buscame en wikipedia"
      ],
      "acuse": "Lo busco, señor.",
      "comando": "firefox --new-tab \"https://es.wikipedia.org/w/index.php?search={argumento_url}\" >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Buscando {argumento}, señor. Ya lo tiene en pantalla.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "ff_buscar_github",
      "grupo": "firefox",
      "frases": [
        "busca en github",
        "buscame en github"
      ],
      "acuse": "Lo busco, señor.",
      "comando": "firefox --new-tab \"https://github.com/search?q={argumento_url}\" >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Buscando {argumento}, señor. Ya lo tiene en pantalla.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "ff_buscar_mapas",
      "grupo": "firefox",
      "frases": [
        "busca en el mapa",
        "buscame en el mapa",
        "donde esta"
      ],
      "acuse": "Lo busco, señor.",
      "comando": "firefox --new-tab \"https://www.openstreetmap.org/search?query={argumento_url}\" >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Buscando {argumento}, señor. Ya lo tiene en pantalla.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "ff_buscar_traducir",
      "grupo": "firefox",
      "frases": [
        "traduce",
        "traduceme"
      ],
      "acuse": "Lo busco, señor.",
      "comando": "firefox --new-tab \"https://translate.google.com/?sl=auto&tl=es&text={argumento_url}\" >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Buscando {argumento}, señor. Ya lo tiene en pantalla.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "ff_buscar_imagenes",
      "grupo": "firefox",
      "frases": [
        "busca imagenes de",
        "buscame imagenes de"
      ],
      "acuse": "Lo busco, señor.",
      "comando": "firefox --new-tab \"https://duckduckgo.com/?q={argumento_url}&iax=images&ia=images\" >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Buscando {argumento}, señor. Ya lo tiene en pantalla.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "ff_buscar_paquete",
      "grupo": "firefox",
      "frases": [
        "busca el paquete",
        "busca en flathub"
      ],
      "acuse": "Lo busco, señor.",
      "comando": "firefox --new-tab \"https://flathub.org/apps/search?q={argumento_url}\" >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Buscando {argumento}, señor. Ya lo tiene en pantalla.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "ff_buscar_precio",
      "grupo": "firefox",
      "frases": [
        "busca el precio de",
        "cuanto cuesta"
      ],
      "acuse": "Lo busco, señor.",
      "comando": "firefox --new-tab \"https://duckduckgo.com/?q={argumento_url}+precio\" >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Buscando {argumento}, señor. Ya lo tiene en pantalla.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "ff_buscar_receta",
      "grupo": "firefox",
      "frases": [
        "busca la receta de",
        "receta de"
      ],
      "acuse": "Lo busco, señor.",
      "comando": "firefox --new-tab \"https://duckduckgo.com/?q=receta+{argumento_url}\" >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Buscando {argumento}, señor. Ya lo tiene en pantalla.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "ff_buscar_musica",
      "grupo": "firefox",
      "frases": [
        "busca la cancion",
        "busca en bandcamp"
      ],
      "acuse": "Lo busco, señor.",
      "comando": "firefox --new-tab \"https://bandcamp.com/search?q={argumento_url}\" >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Buscando {argumento}, señor. Ya lo tiene en pantalla.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "ff_buscar_stack",
      "grupo": "firefox",
      "frases": [
        "busca en stack overflow",
        "como se hace en codigo"
      ],
      "acuse": "Lo busco, señor.",
      "comando": "firefox --new-tab \"https://stackoverflow.com/search?q={argumento_url}\" >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Buscando {argumento}, señor. Ya lo tiene en pantalla.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "ff_buscar_manual",
      "grupo": "firefox",
      "frases": [
        "busca la documentacion de",
        "documentacion de"
      ],
      "acuse": "Lo busco, señor.",
      "comando": "firefox --new-tab \"https://duckduckgo.com/?q={argumento_url}+docs\" >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Buscando {argumento}, señor. Ya lo tiene en pantalla.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "ff_buscar_noticia",
      "grupo": "firefox",
      "frases": [
        "busca noticias de",
        "noticias sobre"
      ],
      "acuse": "Lo busco, señor.",
      "comando": "firefox --new-tab \"https://duckduckgo.com/?q={argumento_url}&iar=news&ia=news\" >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Buscando {argumento}, señor. Ya lo tiene en pantalla.",
      "confirmar": false,
      "captura": true
    },
    {
      "id": "ff_firefox_abrir",
      "grupo": "firefox",
      "frases": [
        "abre el navegador",
        "abre firefox",
        "abreme el navegador"
      ],
      "acuse": "Voy, señor.",
      "comando": "firefox >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Navegador abierto.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_firefox_privado",
      "grupo": "firefox",
      "frases": [
        "abre una ventana privada",
        "modo incognito",
        "navegacion privada"
      ],
      "acuse": "Voy, señor.",
      "comando": "firefox --private-window >/dev/null 2>&1 &",
      "host": true,
      "respuesta": "Ventana privada abierta.",
      "confirmar": false,
      "captura": false
    },
    {
      "id": "ff_firefox_cerrar",
      "grupo": "firefox",
      "frases": [
        "cierra el navegador",
        "cierra firefox"
      ],
      "acuse": "Voy, señor.",
      "comando": "pkill -f 'firefox' ",
      "host": true,
      "respuesta": "Navegador cerrado.",
      "confirmar": true,
      "captura": false
    },
    {
      "id": "ff_firefox_pestanas",
      "grupo": "firefox",
      "frases": [
        "cuantas pestañas tengo abiertas",
        "cuantas pestañas hay"
      ],
      "acuse": "Voy, señor.",
      "comando": "ls ~/.mozilla/firefox/*/sessionstore-backups/recovery.jsonlz4 2>/dev/null | wc -l",
      "host": true,
      "respuesta": "Tengo {ultima} sesiones guardadas; el numero exacto de pestañas solo lo sabe el navegador.",
      "confirmar": false,
      "captura": false
    }
  ]
}
