El script notify-developer.sh ahora crea salas DM con encriptacion
E2EE habilitada via initial_state m.room.encryption. Corrige que
bots recientes (father-bot, test-bot, test-personality) aparezcan
sin cifrado en Element.
Valida que el script notify-developer.sh crea DM rooms con
encriptacion habilitada: initial_state con m.room.encryption,
algoritmo m.megolm.v1.aes-sha2, preset trusted_private_chat,
is_direct e invite presentes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
El createRoom usaba solo preset trusted_private_chat, que configura
permisos pero no activa encriptacion. Ahora incluye initial_state
con m.room.encryption (m.megolm.v1.aes-sha2) para que las salas DM
de bienvenida se creen cifradas de extremo a extremo.
Esto corrige que bots recientes (father-bot, test-bot, test-personality)
aparezcan sin E2EE en Element cuando el DM fue iniciado por el script.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
El script notify-developer.sh crea salas DM sin encriptacion porque
el createRoom usa preset trusted_private_chat sin initial_state de
m.room.encryption. Esto afecta a bots creados recientemente
(father-bot, test-bot, test-personality).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Mueve el issue a dev/issues/completed/ tras implementar todas las fases:
- Fase 1: streaming del subproceso con stream-json
- Fase 2: ProgressReporter con mensajes progresivos en Matrix
- Fase 3: config schema y template actualizados
- Fase 4: tests de integracion y regresion
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Agrega tests de integracion end-to-end que validan el pipeline completo:
streaming events → ProgressReporter → mock sender → Matrix messages.
- TestIntegration_StreamToProgressReporter: simula sesion completa con
init, 3 tool_use, text, result y finalize — verifica 1 send + 4 edits
- TestIntegration_NoStreamingNoSideEffects: verifica que streaming=false
no genera ningun side effect (regression test)
- TestIntegration_ProgressReporterWithSendError: verifica que errores
de envio no causan panic y se manejan gracefully
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Agrega campos streaming y show_tool_progress al template de config
del agente para documentar las nuevas opciones de claude-code.
Ambos desactivados por defecto (backward compatible).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Implementa la Fase 2 del issue 0036: mensajes de progreso en tiempo real
que muestran al usuario que herramientas esta usando el agente claude-code.
- SendMarkdownGetID en shell/matrix/client.go: envia mensaje y retorna
el event ID para editarlo despues
- EditMessage en shell/matrix/client.go: edita un mensaje existente
usando m.replace (m.relates_to con rel_type=m.replace)
- ProgressReporter en shell/effects/progress.go (NEW): recibe streaming
events y actualiza un mensaje unico en Matrix mostrando el progreso
(e.g. "🔧 Bash: ls -la" → "🔧 Read: file.go" → "✅ Completado")
- Rate limiter integrado: max 1 edit/segundo para no saturar el homeserver
- Conectado en devagents/handler.go: cuando provider=claude-code y
streaming+show_tool_progress habilitados, crea ProgressReporter y
pasa StreamFunc al CompletionRequest
- MatrixSender interface actualizada con los nuevos metodos
- 10 tests nuevos para ProgressReporter, todos los existentes pasan
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Implementa la Fase 1 del issue 0036: soporte de streaming en tiempo real
para el provider claude-code.
- Tipos puros de streaming en pkg/llm/types.go: StreamEventKind,
StreamEvent, StreamFunc (pure core, sin side effects)
- Refactor de shell/llm/claudecode.go: nuevo code path executeStreaming
que usa cmd.StdoutPipe + bufio.Scanner para leer linea a linea
- Parser parseStreamLine que mapea eventos JSON del CLI (system, assistant,
result) a StreamEvent del dominio
- buildClaudeArgs ahora selecciona --output-format stream-json cuando
streaming esta habilitado y StreamFunc presente
- Campos Streaming y ShowToolProgress en ClaudeCodeCfg (config schema)
- Backward compatible: streaming=false (default) no cambia comportamiento
- 40 tests (20 existentes + 20 nuevos) pasan sin errores
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- /create-agent SKILL.md: pipeline 8 pasos del script, pasos 8-12 post
- /create-bot SKILL.md: pipeline con health check y self-introduce
- CLAUDE.md: seccion breve de pipeline de 12 pasos con env var clave
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Actualiza create_agent.md con el pipeline completo (12 pasos) al inicio
de la guia, referenciando los scripts de cada paso.
Actualiza system prompt de father-bot con:
- Pipeline de 12 pasos explicito con "nunca saltar pasos"
- Health check (paso 11) via health-check.sh antes de confirmar
- Self-introduce (paso 12) via notify-developer.sh
- Paso de reporte incluye confirmacion de health check y notify
- Manejo de errores para health check y notify
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Mover issue 0043-father-bot-security-guardrails a completed/.
Todas las fases implementadas: control de acceso, path scoping,
rate limiting, validacion post-creacion y verificacion de audit.
Agrega dos tests nuevos al paquete pkg/security que verifican
escenarios especificos de father-bot:
- TestResolveACL_FatherBotDenyByDefault: cuando el grupo admins
esta vacio, nadie puede interactuar con father-bot (deny-by-default)
- TestResolveACL_FatherBotMultipleAdmins: cuando hay multiples
admins configurados, todos pueden interactuar; usuarios fuera
del grupo no pueden
Estos tests complementan el existente TestResolveACL_PrivilegedVsGeneral
que ya cubria el caso basico de admin vs non-admin.
Issue: 0043
Implementa restricciones adicionales de seguridad para father-bot,
el agente privilegiado que crea otros agentes. Los guardrails se
implementan como instrucciones en el system prompt (primera linea
de defensa) complementando el ACL admin-only existente.
Guardrails agregados:
- Control de acceso: verificacion explicita de admin antes de operar,
deny-by-default si no hay admins configurados (fase 1)
- Path scoping: allowlist de escritura (agents/, cmd/launcher/main.go),
denylist explicita (.env, security/, .git/) (fase 2)
- Rate limiting: maximo 3 agentes por sesion de conversacion,
verificacion de duplicados antes de crear (fase 3)
- Validacion post-creacion: checklist de seguridad obligatorio antes
de reiniciar launcher — sin sanitize deshabilitado, sin wildcards
en SSH/file, sin bypassPermissions, con seccion de seguridad en
prompt (fase 4)
- Paso 5.5 en el flujo de trabajo para ejecutar validacion de
seguridad despues de compilar y antes de reiniciar (fase 4)
- Audit ya estaba habilitado en config.yaml, verificado correcto (fase 5)
Issue: 0043
Pipeline de creacion formalizado con 3 mejoras:
1. Display name automatico (paso 7): create-full.sh ahora configura
el display name en Matrix via PUT al profile API con el token
del bot recien creado. Evita que los bots aparezcan como @id:server.
2. Health check post-arranque: nuevo script health-check.sh que busca
en los logs del launcher mensajes de arranque exitoso ("e2ee ready",
"runner started", etc.) con timeout configurable (default 30s).
3. Notificacion enriquecida: notify-developer.sh ahora incluye
descripcion del agente (leida de config.yaml), tools habilitadas,
formato markdown con estructura clara, y reintentos con backoff
(hasta 3 intentos) si el envio de DM falla.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Pipeline de 12 pasos obligatorios:
scaffold → build → register → verify E2EE → [convert robot] →
auto-avatar → display name → personalize → rebuild → start →
health check → self-introduce (el bot habla a devs)
Nuevos pasos: display name automatico, health check post-arranque,
y mejora del mensaje de bienvenida. Garantiza consistencia entre
creacion manual (dev-scripts) y via father-bot.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Test de integracion real que:
1. Crea DM con father-bot via Matrix SDK
2. Pide crear un robot simple (e2e-father-test)
3. Espera respuesta de father-bot (timeout 9min, claude-code)
4. Verifica: config.yaml (type: robot), agent.go, compilacion, blank import
5. Cleanup automatico: borra agente, import y env vars
Validado: father-bot creo el robot en ~3min con reporte estructurado.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
El usuario principal del servidor no estaba en el grupo admins,
causando que father-bot (y cualquier agente con ACL restrictivo)
denegara el acceso. Solo @admin estaba listado.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Primer agente privilegiado en agents/_specials/. Usa claude-code provider
con acceso completo al repo para crear agentes y robots via Matrix.
Cambios principales:
- father-bot: agent.go, config.yaml (claude-code, E2EE, audit, sanitize),
system prompt con guia de creacion completa y seguridad anti-injection
- Launcher: descubre configs en _specials/ con validacion de tipo
- Seguridad: grupo privileged (admin-only), reestructura de all → general
para evitar ACL union con everyone
- dev-scripts: _common.sh escanea _specials/ en config_path_for y list_agents_raw
- Issue 0043 creado para guardrails de seguridad futuros
- Tests: ACL privileged vs general, isSpecialConfig, 11 E2E tests
Implementado como father-bot en agents/_specials/father-bot/.
Mover issue a completed/ y actualizar README.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
11 tests que verifican:
- agent.go puro (sin imports I/O, registra Rules con ActionKindLLM)
- config.yaml: claude-code provider, bypassPermissions, E2EE, sanitize, audit
- system prompt: guia de creacion, decision tree, convenciones, seguridad
- launcher: import de _specials/father-bot, discovery de _specials/
- security: father-bot en grupo privileged, solo admins en permissions.yaml,
NO en grupo general (evita ACL union)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- TestResolveACL_PrivilegedVsGeneral: verifica que father-bot solo
es accesible por admins y que agentes generales son accesibles
por todos. Reproduce la config real de produccion.
- TestIsSpecialConfig_*: 3 tests para la funcion que detecta
configs de SpecialConfig ya cargados (orchestrator) y los salta
en el loop de discovery normal del launcher.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Reestructura los grupos de seguridad para soportar agentes privilegiados:
- Nuevo grupo 'privileged' con father-bot (solo admins)
- Reemplaza grupo 'all' (wildcard) con 'general' (lista explicita)
para evitar que el ACL union otorgue permisos de everyone a father-bot
- Documenta en YAML que el ACL es acumulativo y por que privileged
y general deben ser mutuamente excluyentes
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Primer agente privilegiado en agents/_specials/. Usa provider claude-code
con acceso completo al repositorio para ejecutar el pipeline de creacion
de agentes de forma autonoma (scaffold, build, register, verify, restart).
Archivos:
- agent.go: reglas puras (DM/mention → LLM)
- config.yaml: claude-code provider, bypassPermissions, E2EE, audit
- prompts/system.md: guia completa de creacion con decision tree,
convencion de IDs, validaciones y seccion anti-injection
Config: claude-code con working_dir al repo, allowed_tools restringido,
model sonnet, timeout 10m, add_dirs con templates y referencias.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
El launcher ahora escanea agents/_specials/*/config.yaml ademas de
agents/*/config.yaml para descubrir agentes del sistema con identidad
Matrix (ej: father-bot). Los SpecialConfig ya cargados (orchestrator)
se detectan y saltan via isSpecialConfig() para evitar errores de
validacion.
Tambien actualiza dev-scripts/_common.sh para que config_path_for()
y list_agents_raw() incluyan _specials/ en la busqueda.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Issue futuro para implementar capas adicionales de seguridad:
- Developer allowlist via .env (deny-by-default)
- Path scoping para el subprocess claude-code
- Rate limiting de operaciones de creacion
- Audit trail extendido
- Validacion de configs de agentes creados
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Refactoriza profile.go separando UploadMedia/SetAvatarURL, añade sistema
de generacion automatica de avatares (DiceBear, RoboHash, Multiavatar)
con pkg/avatar (puro) + shell/avatar (impuro), nuevo comando
agentctl auto-avatar, e integracion en create-full.sh.
Documenta el diseño completo: proveedores (DiceBear, RoboHash, Multiavatar),
arquitectura pure/impure, integracion CLI y pipeline.
Todas las tareas completadas.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
create-full.sh ahora genera y aplica un avatar automatico tras registrar
el agente en Matrix. Usa agentctl auto-avatar internamente.
Si falla (sin internet, proveedor caido), continua sin bloquear el pipeline.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- pkg/avatar: 13 tests cubriendo todos los proveedores, estilos, sets,
edge cases (size=0, unknown provider, chars especiales, determinismo)
- shell/avatar: 6 tests con httptest server local (download OK, JPEG,
HTTP 404, context cancelled, extensiones por content-type)
No requiere acceso a internet — shell/avatar usa httptest.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Nuevo sistema de generacion automatica de avatares:
- pkg/avatar/ — tipos puros y URL builders para proveedores gratuitos:
DiceBear (bottts, pixel-art, etc.), RoboHash (robots, monsters),
Multiavatar (multicultural). Sin I/O.
- shell/avatar/ — fetcher impuro: descarga imagen por HTTP a temp file.
- agentctl auto-avatar <id> — genera, descarga, sube y activa avatar
con un solo comando. Soporta --provider, --style, --set, --dry-run.
Respeta pure core / impure shell. El seed del avatar es el agent ID,
asi cada bot obtiene una imagen unica y determinista.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Expone las funciones separadas de profile.go como CLI:
- agentctl upload-media <id> <path> — sube sin activar avatar
- agentctl set-avatar-url <id> <mxc://...> — activa un mxc ya subido
Complementa la refactorizacion de shell/matrix/profile.go.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
SetAvatar hacia dos cosas: subir la imagen y establecerla como avatar.
Ahora son tres funciones separadas:
- UploadMedia: solo sube, devuelve mxc:// URI
- SetAvatarURL: solo establece avatar con un mxc:// URI existente
- SetAvatar: convenience wrapper que llama a ambas
Permite subir imagenes sin activar el avatar, o reusar imagenes ya subidas.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Establece la convención de que directorios con prefijo _ en agents/
son del sistema (templates, specials), no agentes desplegables.
Cambios:
- Renombrar agents/specials/ → agents/_specials/
- Actualizar path en cmd/launcher/main.go (startOrchestrator)
- Documentar convención _ en CLAUDE.md
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
agents/ ahora solo contiene carpetas de agentes.
El runtime (Agent, Robot, Runner, registry, handler) vive en devagents/.
Tambien se crean 6 nuevos issues: streaming, creator-bot, widgets,
recordatorios, voz, videollamadas.
Issues planificados:
- 0036: Claude Code streaming de progreso en Matrix
- 0037: Agente que crea otros agentes/bots via Matrix
- 0038: Webapps y dashboards embebidos en Element via widgets
- 0039: Recordatorios dinámicos y crons que invocan agentes
- 0040: Soporte para mensajes de voz (audio → STT)
- 0041: Videollamadas con agentes via LiveKit
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Añadir test-personality a tabla de agentes
- Añadir nuevos specs E2E a la lista de tests
- Mover issue a completed, actualizar README
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tests funcionales (test-personality.spec.ts):
- Saludo con personalidad pirata espacial (keywords flexibles)
- Personalidad consistente en respuestas serias (fotosintesis + pirata)
- !help y !ping funcionan (assertions estrictas)
- Sin errores E2EE
Tests de pipeline (create-agent-pipeline.spec.ts):
- Valida agent.go con Rules() y ActionKindLLM
- Config sin type: robot (es agent por defecto)
- System prompt con personalidad + seccion de seguridad
- LLM configurado (openai/gpt-4o)
- Encryption habilitada, import en launcher
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>