# 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 ` 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 ./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_`) igual que hace `cmd/launcher/`