# Plan: Editar fotos de perfil de los bots

## Objetivo
Poder actualizar el avatar (foto de perfil) y el display name de cada bot en Matrix
desde la CLI (`agentctl`) o desde un dev-script.

## Estado: COMPLETADO

---

## Cómo funciona en Matrix
- Endpoint: `PUT /_matrix/client/v3/profile/{userId}/avatar_url`
- Body: `{ "avatar_url": "mxc://..." }` — URI de contenido subido al Media repo
- Para subir una imagen: `POST /_matrix/media/v3/upload` con el body binario
  y `Content-Type` de la imagen
- También se puede cambiar el display name:
  `PUT /_matrix/client/v3/profile/{userId}/displayname`

La secuencia es:
1. Subir imagen → obtener `mxc://server/mediaID`
2. Establecer `avatar_url` en el perfil con esa URI

---

## Diseño

### CLI: `agentctl avatar <agent-id> <image-path>`
Nuevo subcomando en `cmd/agentctl/`:
```
agentctl avatar assistant-bot /path/to/photo.png
agentctl displayname assistant-bot "Assistant Bot"
```

### Shell: `shell/matrix/profile.go`
```go
// UploadMedia sube un archivo y devuelve la mxc:// URI
func UploadMedia(ctx, client, filePath string) (mxcURI string, err error)

// SetAvatar establece avatar_url en el perfil del bot
func SetAvatar(ctx, client, mxcURI string) error

// SetDisplayName cambia el displayname
func SetDisplayName(ctx, client, name string) error
```

Usa el cliente `mautrix.Client` ya existente en `shell/matrix/client.go`.

### Dev-script: `dev-scripts/avatar.sh`
```bash
#!/usr/bin/env bash
# Uso: ./dev-scripts/avatar.sh <agent-id> <image-path>
./bin/agentctl avatar "$1" "$2"
```

---

## Archivos a crear/modificar
- `shell/matrix/profile.go` — UploadMedia, SetAvatar, SetDisplayName
- `cmd/agentctl/avatar.go` — subcomando `avatar` y `displayname`
- `cmd/agentctl/main.go` — registrar los nuevos subcomandos en Cobra
- `dev-scripts/avatar.sh` — wrapper convenience

## Notas
- El token del bot necesita permiso de escritura en su propio perfil (normal por defecto)
- Formatos soportados: PNG, JPG, WebP — Matrix los acepta todos
- mautrix-go tiene métodos `client.UploadMedia()` y `client.SetAvatarURL()`;
  usar esos directamente para evitar HTTP manual
- El comando debe cargar el token del bot desde las env vars (`MATRIX_TOKEN_<BOT>`)
  igual que hace `cmd/launcher/`
