feat: pipeline completo de eliminacion de agentes y robots

Nuevos scripts que revierten todo lo que create-full.sh genera:
- deactivate-matrix.sh: desactiva usuario via Synapse admin API
- remove-launcher-import.sh: elimina blank import del launcher
- remove-env-vars.sh: limpia las 4 env vars del .env
- delete-full.sh: orquestador de 7 pasos (validate, stop, deactivate,
  remove import, remove env, delete files, rebuild)

Flags: --force (sin confirmacion), --keep-matrix (preserva usuario).
Actualiza remove.sh con referencia a delete-full.sh.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-10 23:44:38 +00:00
parent 6107aefb52
commit 50013b0ecb
5 changed files with 318 additions and 0 deletions
+47
View File
@@ -0,0 +1,47 @@
#!/usr/bin/env bash
# deactivate-matrix.sh — desactiva un usuario Matrix via Synapse admin API
#
# Uso:
# ./dev-scripts/agent/deactivate-matrix.sh <agent-id>
#
# Desactiva la cuenta del bot en el homeserver. La accion es irreversible
# desde la API (el usuario no podra volver a loguearse).
#
# Requiere en .env:
# MATRIX_ADMIN_TOKEN, MATRIX_HOMESERVER, MATRIX_SERVER_NAME
source "$(dirname "$0")/../_common.sh"
load_env
need_arg "${1:-}"
ID="$1"
NORM="$(normalize_id "$ID")"
[[ -n "${MATRIX_ADMIN_TOKEN:-}" ]] || fail "MATRIX_ADMIN_TOKEN no esta en .env"
[[ -n "${MATRIX_HOMESERVER:-}" ]] || fail "MATRIX_HOMESERVER no esta en .env"
[[ -n "${MATRIX_SERVER_NAME:-}" ]] || fail "MATRIX_SERVER_NAME no esta en .env"
USER_ID="@${ID}:${MATRIX_SERVER_NAME}"
info "Desactivando $USER_ID en $MATRIX_HOMESERVER..."
# Synapse admin API: deactivate user
# https://element-hq.github.io/synapse/latest/admin_api/user_admin_api.html#deactivate-account
HTTP_CODE=$(curl -s -o /tmp/_deactivate_response.json -w '%{http_code}' \
-X POST \
"${MATRIX_HOMESERVER}/_synapse/admin/v1/deactivate/${USER_ID}" \
-H "Authorization: Bearer ${MATRIX_ADMIN_TOKEN}" \
-H "Content-Type: application/json" \
-d '{"erase": false}')
if [[ "$HTTP_CODE" == "200" ]]; then
ok "$USER_ID desactivado exitosamente"
elif [[ "$HTTP_CODE" == "404" ]]; then
warn "Usuario $USER_ID no encontrado en el servidor (ya eliminado?)"
else
BODY=$(cat /tmp/_deactivate_response.json 2>/dev/null || echo "(sin respuesta)")
fail "Error al desactivar $USER_ID — HTTP $HTTP_CODE: $BODY"
fi
rm -f /tmp/_deactivate_response.json
+207
View File
@@ -0,0 +1,207 @@
#!/usr/bin/env bash
# delete-full.sh — pipeline completo para eliminar un agente o robot
#
# Revierte todo lo que create-full.sh genera:
# 1. VALIDATE → verificar que el agente existe
# 2. STOP → detener el proceso si esta corriendo
# 3. DEACTIVATE → desactivar usuario Matrix (Synapse admin API)
# 4. REMOVE IMPORT → eliminar blank import del launcher
# 5. REMOVE ENV VARS → eliminar las 4 env vars del .env
# 6. DELETE FILES → borrar directorio del agente + runtime files
# 7. REBUILD → recompilar el launcher
#
# Uso:
# ./dev-scripts/agent/delete-full.sh <agent-id> # con confirmacion
# ./dev-scripts/agent/delete-full.sh <agent-id> --force # sin confirmacion
# ./dev-scripts/agent/delete-full.sh <agent-id> --keep-matrix # preserva usuario Matrix
# ./dev-scripts/agent/delete-full.sh <agent-id> --force --keep-matrix
#
# Requiere en .env:
# MATRIX_ADMIN_TOKEN, MATRIX_HOMESERVER, MATRIX_SERVER_NAME (para desactivar Matrix)
source "$(dirname "$0")/../_common.sh"
load_env
need_arg "${1:-}"
ID="$1"
NORM="$(normalize_id "$ID")"
SCRIPT_DIR="$(dirname "$0")"
FORCE=false
KEEP_MATRIX=false
# Parse flags
shift
while [[ $# -gt 0 ]]; do
case "$1" in
--force|-f)
FORCE=true
shift
;;
--keep-matrix)
KEEP_MATRIX=true
shift
;;
*)
warn "Flag desconocido: $1"
shift
;;
esac
done
TOTAL_STEPS=7
echo ""
echo -e "${RED}═══════════════════════════════════════════════════════${RST}"
echo -e "${RED} Eliminando agente: ${GRN}$ID${RST}"
echo -e "${RED}═══════════════════════════════════════════════════════${RST}"
echo ""
# ── Paso 1: Validar existencia ──────────────────────────────────────────────
info "Paso 1/${TOTAL_STEPS} — Validando existencia..."
AGENT_DIR=""
CFG_PATH=""
# Buscar en agents/ y agents/_specials/
if [[ -d "agents/$ID" ]]; then
AGENT_DIR="agents/$ID"
CFG_PATH="agents/$ID/config.yaml"
elif [[ -d "agents/_specials/$ID" ]]; then
AGENT_DIR="agents/_specials/$ID"
CFG_PATH="agents/_specials/$ID/config.yaml"
else
fail "Agente '$ID' no encontrado en agents/ ni agents/_specials/"
fi
# Leer info del agente para mostrar al usuario
AGENT_DESC=""
AGENT_TYPE="agent"
if [[ -f "$CFG_PATH" ]]; then
AGENT_DESC=$(grep -m1 'description:' "$CFG_PATH" | cut -d'"' -f2)
TYPE_LINE=$(grep -m1 'type:' "$CFG_PATH" | awk '{print $2}')
[[ -n "$TYPE_LINE" ]] && AGENT_TYPE="$TYPE_LINE"
fi
ok "Agente $ID encontrado en $AGENT_DIR/"
dim " Tipo: $AGENT_TYPE"
[[ -n "$AGENT_DESC" ]] && dim " Descripcion: $AGENT_DESC"
echo ""
# ── Confirmacion interactiva ────────────────────────────────────────────────
if [[ "$FORCE" != true ]]; then
echo -e "${YLW}ATENCION: Esta accion es irreversible.${RST}"
echo -e "Se eliminaran:"
echo -e " - Directorio ${AGENT_DIR}/ (codigo, config, datos, crypto)"
if [[ "$KEEP_MATRIX" != true ]]; then
echo -e " - Usuario Matrix @${ID}:${MATRIX_SERVER_NAME:-<server>}"
fi
echo -e " - Variables de entorno en .env"
echo -e " - Import en cmd/launcher/main.go"
echo ""
read -rp "Escribir '$ID' para confirmar: " CONFIRM
if [[ "$CONFIRM" != "$ID" ]]; then
fail "Eliminacion cancelada"
fi
echo ""
fi
# ── Paso 2: Detener proceso ─────────────────────────────────────────────────
info "Paso 2/${TOTAL_STEPS} — Deteniendo proceso..."
PIDS="$(find_agent_pids "$ID")"
if [[ -n "$PIDS" ]]; then
echo "$PIDS" | while read -r pid; do
kill "$pid" 2>/dev/null && ok "Proceso $pid detenido" || warn "No se pudo detener proceso $pid"
done
# Esperar a que terminen
sleep 1
else
dim " No hay procesos corriendo para $ID"
fi
# Limpiar PID file
rm -f "$(pid_file "$ID")" 2>/dev/null
echo ""
# ── Paso 3: Desactivar usuario Matrix ───────────────────────────────────────
info "Paso 3/${TOTAL_STEPS} — Desactivando usuario Matrix..."
if [[ "$KEEP_MATRIX" == true ]]; then
dim " --keep-matrix: usuario Matrix preservado"
else
if [[ -n "${MATRIX_ADMIN_TOKEN:-}" && -n "${MATRIX_HOMESERVER:-}" && -n "${MATRIX_SERVER_NAME:-}" ]]; then
"$SCRIPT_DIR/deactivate-matrix.sh" "$ID" || warn "No se pudo desactivar usuario Matrix (continuando)"
else
warn "Faltan variables de Matrix en .env — usuario no desactivado"
fi
fi
echo ""
# ── Paso 4: Eliminar import del launcher ────────────────────────────────────
info "Paso 4/${TOTAL_STEPS} — Eliminando import del launcher..."
"$SCRIPT_DIR/remove-launcher-import.sh" "$ID"
echo ""
# ── Paso 5: Eliminar variables de entorno ────────────────────────────────────
info "Paso 5/${TOTAL_STEPS} — Eliminando variables de entorno..."
"$SCRIPT_DIR/remove-env-vars.sh" "$ID"
echo ""
# ── Paso 6: Eliminar archivos ───────────────────────────────────────────────
info "Paso 6/${TOTAL_STEPS} — Eliminando archivos..."
# Directorio del agente
if [[ -d "$AGENT_DIR" ]]; then
rm -rf "$AGENT_DIR"
ok "$AGENT_DIR/ eliminado"
fi
# Runtime files
for f in "run/${ID}.pid" "run/${ID}.log"; do
if [[ -f "$f" ]]; then
rm -f "$f"
ok "$f eliminado"
fi
done
# Log directory
if [[ -d "logs/$ID" ]]; then
rm -rf "logs/$ID"
ok "logs/$ID/ eliminado"
fi
echo ""
# ── Paso 7: Recompilar ─────────────────────────────────────────────────────
info "Paso 7/${TOTAL_STEPS} — Recompilando..."
if $GO build -tags goolm ./... 2>&1; then
ok "Compilacion exitosa"
else
fail "Error de compilacion — revisa cmd/launcher/main.go manualmente"
fi
echo ""
# ── Resumen ─────────────────────────────────────────────────────────────────
echo -e "${GRN}═══════════════════════════════════════════════════════${RST}"
echo -e "${GRN} ✓ Agente $ID eliminado completamente${RST}"
echo -e "${GRN}═══════════════════════════════════════════════════════${RST}"
echo ""
echo -e " ${BLU}Eliminado:${RST}"
echo -e " $AGENT_DIR/"
echo -e " cmd/launcher/main.go (import)"
echo -e " .env (MATRIX_TOKEN_${NORM}, MATRIX_PASSWORD_${NORM}, PICKLE_KEY_${NORM}, SSSS_RECOVERY_KEY_${NORM})"
if [[ "$KEEP_MATRIX" != true ]]; then
echo -e " @${ID}:${MATRIX_SERVER_NAME:-<server>} (usuario Matrix desactivado)"
else
echo -e " ${YLW}Usuario Matrix preservado (--keep-matrix)${RST}"
fi
echo ""
+35
View File
@@ -0,0 +1,35 @@
#!/usr/bin/env bash
# remove-env-vars.sh — elimina las variables de entorno de un agente del .env
#
# Uso:
# ./dev-scripts/agent/remove-env-vars.sh <agent-id>
#
# Elimina las 4 variables generadas por register.sh y verify.sh:
# MATRIX_TOKEN_<NORM>, MATRIX_PASSWORD_<NORM>,
# PICKLE_KEY_<NORM>, SSSS_RECOVERY_KEY_<NORM>
source "$(dirname "$0")/../_common.sh"
need_arg "${1:-}"
ID="$1"
NORM="$(normalize_id "$ID")"
ENV_FILE=".env"
[[ -f "$ENV_FILE" ]] || fail ".env no encontrado"
VARS=(
"MATRIX_TOKEN_${NORM}"
"MATRIX_PASSWORD_${NORM}"
"PICKLE_KEY_${NORM}"
"SSSS_RECOVERY_KEY_${NORM}"
)
for var in "${VARS[@]}"; do
if grep -q "^${var}=" "$ENV_FILE"; then
sed -i "/^${var}=/d" "$ENV_FILE"
ok "$var eliminado de $ENV_FILE"
else
dim " $var no encontrado en $ENV_FILE (ya eliminado?)"
fi
done
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env bash
# remove-launcher-import.sh — elimina el blank import de un agente del launcher
#
# Uso:
# ./dev-scripts/agent/remove-launcher-import.sh <agent-id>
#
# Elimina la linea de blank import del agente en cmd/launcher/main.go.
# Soporta imports normales y con alias (e.g. testbot "...").
source "$(dirname "$0")/../_common.sh"
need_arg "${1:-}"
ID="$1"
LAUNCHER="cmd/launcher/main.go"
[[ -f "$LAUNCHER" ]] || fail "$LAUNCHER no encontrado"
# Buscar la linea del import (blank import o con alias)
if grep -q "agents/$ID\"" "$LAUNCHER"; then
# Eliminar la linea que contiene el import del agente
sed -i "\|agents/$ID\"|d" "$LAUNCHER"
ok "Import de $ID eliminado de $LAUNCHER"
else
warn "$ID no tiene import en $LAUNCHER (ya eliminado?)"
fi
+3
View File
@@ -1,6 +1,9 @@
#!/usr/bin/env bash
# remove.sh — deshabilita un agente (enabled: false). No borra datos.
#
# Para eliminacion completa (irreversible), usar delete-full.sh:
# ./dev-scripts/agent/delete-full.sh <agent-id>
#
# Uso:
# ./dev-scripts/agent/remove.sh assistant-bot