handlers + poller llamaban Manager.StatusAll() siempre. En unified mode (launcher
arranca todos los agents como goroutines bajo 1 PID) no existen PID files
por agente, asi que StatusAll devolvia Running=false aunque los agents estaban
operativos.
Anade Server.statusAllAuto() que chequea IsUnifiedRunning() y delega a
StatusAllUnified() o StatusAll() segun corresponda. Reemplaza las 3 llamadas
directas en handlers.go (handleListAgents, handleGetAgent) y poller.go
(pollStatus seed + checkAndPublishDiffs).
Sin esto el frontend (0129) mostraria running=false universal.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Nuevo paquete internal/api con servidor HTTP stdlib (sin gin/echo):
- Auth Bearer via AGENTS_API_KEY con subtle.ConstantTimeCompare
- REST: GET /health (sin auth), GET/POST /agents, /agents/{id}, /{id}/{start,stop,restart,logs}
- SSE: /sse/status (broadcast diffs cada 2s) y /sse/agents/{id}/logs (tail -f)
- Pubsub in-memory (TODO: NATS cuando haya 2do cliente)
- Tail de logfiles: retroalimenta ultimos 50KB + poll 200ms para streaming
Integracion en cmd/launcher/main.go:
- Flag --api-port (0=desactivado, 8487 en produccion)
- Flag --api-key (override de AGENTS_API_KEY env var)
- Si apiPort>0 y sin clave, WARN y deshabilita en vez de fallar
Systemd unit en systemd/agents_and_robots.service:
- Restart=always (no on-failure — evita que exit limpio mate el service)
- EnvironmentFile para AGENTS_API_KEY y demas tokens
- WorkingDirectory=/home/ubuntu/CodeProyects/agents_and_robots
app.md v0.2.0:
- port: 8487, health_endpoint: /health (fix drift anterior donde era null)
- e2e_checks: build, tests, smoke_health, smoke_auth
- Documentacion Traefik+DNS pendiente humano post-merge
Tests: 12 tests unitarios en internal/api (auth, health, bus, agents, logs)
Smoke: /health 200, /agents sin auth 401, /agents con key 200 — verificado local
Co-Authored-By: fn-constructor (agent)
El launcher salia con status=0 cuando todos los runners (Agent/Robot)
terminaban su Run() de forma natural — por ejemplo tras una rotacion de
token de Matrix o un drop del sync. systemd, configurado con
Restart=on-failure, no relanzaba el proceso al ver salida limpia y los
bots quedaban caidos hasta una intervencion manual.
Solucion: nueva rutina superviseUntilCanceled en agentRegistry que
bloquea sobre waitAll, y si el ctx padre sigue vivo, espera un backoff
y llama reloadAll para recrear los runners. Solo cuando el ctx padre
se cancela (SIGINT/SIGTERM) la rutina retorna y el launcher sale.
main.go pasa a invocar este supervisor en lugar de waitAll directo.
Tests:
- TestSuperviseUntilCanceled_ReturnsWhenCtxCanceledFirst — empty registry
- TestSuperviseUntilCanceled_ReturnsAfterCtxCancelDuringBackoff — cancel
durante el backoff debe desbloquear inmediatamente
- TestSuperviseUntilCanceled_CallsReloadOnAgentExit — supervisor sigue
vivo todo el deadline aunque reload falle por cfgPath invalido
Diagnostico: tras varias horas el journalctl mostraba "Deactivated
successfully" sin "Stopping" previo (Apr 13 18:22 tras 23h corriendo)
y el log del agent registraba "context canceled" tras "starting matrix
sync" — sintoma de que mautrix.SyncWithContext salio limpiamente y el
ctx.cancel se propago al cerrar la goroutine sin que systemd hubiera
enviado SIGTERM. El bucle supervisado lo arregla recreando los runners
sin tocar la unit ni depender del Restart de systemd.
Incluye:
- fix: resolveDataBase usa ConfigDir como fallback para data path
- chore: actualizar father-bot con pipeline automatizado y base_path
- feat: nuevo agente reminder-bot para gestionar recordatorios
Agente LLM (GPT-4o) especializado en crear, listar, completar y buscar
recordatorios con fechas y horarios. Almacena los datos en JSON usando
file_ops (read_file/write_file) con allowlist a /tmp/reminder-bot-data/.
Incluye tool_use habilitado con file_ops y current_time. System prompt
con seccion de seguridad anti-injection. Registrado en el launcher.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Actualiza el system prompt de father-bot para documentar la ruta rapida
de create-full.sh con flags --description y --system-prompt (pasos 1-8
automatizados). Simplifica las secciones de personalizacion manual que
ya no son el flujo principal.
Configura storage.base_path para usar el directorio local del agente
en lugar del fallback por defecto.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Cuando no se configura storage.base_path ni AGENTS_DATA_DIR, el fallback
anterior hardcodeaba "agents/<id>/data" asumiendo que el binario se ejecuta
desde la raiz del repo. Ahora se usa cfg.ConfigDir (directorio del config.yaml)
como base, lo que funciona correctamente para agentes en _specials/ y cualquier
ubicacion arbitraria del config.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Pipeline de creación reducido: el Paso 8 (editar agent.go, config.yaml
y system.md a mano) ahora es automático si se pasan flags a create-full.sh.
Scripts implementados:
- detect-provider.sh: auto-detecta openai/anthropic desde .env
- personalize.sh: genera los 3 archivos del agente desde flags CLI
(description, provider, model, tone, prefix, system-prompt, tool-use)
- create-full.sh extendido con los mismos flags (retrocompatible)
Impacto para Father Bot: de ~8-10 tool calls de edición manual a un
único Bash call con todos los parámetros.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Pipeline completo implementado: detect-provider.sh + personalize.sh
integrado en create-full.sh. Paso 8 ahora automático cuando se pasan
los flags de personalización.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Aplicar los contenidos reales de agent.go, config.yaml y prompts/system.md
a los dos agentes creados previamente, usando el nuevo personalize.sh.
- wikipedia-bot: tone=professional, prefix=📖, descripcion y system prompt
- exchange-bot: tone=professional, prefix=💱, tool_use=true, system prompt
Ahora ambos tienen la sección de seguridad anti-injection en su system.md.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- .claude/rules/create_agent.md: sección "Ruta rápida" actualizada con
los flags de personalización y mención de personalize.sh standalone y
detect-provider.sh para auto-detección de provider.
- .claude/skills/create-agent/SKILL.md: Paso 2 reescrito para mostrar
el comando completo con flags opcionales. Añadidas notas sobre
personalize.sh y auto-detección de provider.
- .claude/skills/create-bot/SKILL.md: Paso 3 actualizado para mencionar
personalize.sh (robots: solo --description y --prefix aplican).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Scripts atómicos para automatizar el Paso 8 (personalización) del pipeline
de creación de agentes:
- dev-scripts/agent/detect-provider.sh: detecta el primer LLM provider
disponible desde .env (OPENAI_API_KEY → openai, ANTHROPIC_API_KEY →
anthropic, fallback openai con warn).
- dev-scripts/agent/personalize.sh <agent-id> [flags]: genera/actualiza
los 3 archivos del agente en un solo paso:
· config.yaml: description, tone, prefix, provider, model, tool_use
· agent.go: package name correcto (sin guiones, sin _bot), Register ID
· prompts/system.md: prompt inline/file + sección de seguridad anti-injection
Flags: --description, --provider, --model, --tone, --prefix,
--system-prompt, --system-prompt-file, --tool-use, --language.
Usa PyYAML (python3) para editar el YAML preservando comentarios.
- dev-scripts/agent/create-full.sh: extendido con los mismos flags
opcionales. Si se pasan, ejecuta personalize.sh como Paso 8 automático
y recompila. Sin flags → comportamiento actual (retrocompatible).
Impacto: Father Bot puede completar el pipeline completo (pasos 1-8) con
un solo Bash tool call, eliminando las ~6-10 ediciones manuales de archivos.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Test que verifica la creación de wikipedia-bot y exchange-bot por
father bot, incluyendo health checks y respuestas a preguntas.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Pipeline para eliminar el Paso 8 manual (editar agent.go, config.yaml
y system.md). Scripts: detect-provider.sh, personalize.sh integrado
en create-full.sh con flags opcionales.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
wikipedia-bot: agente GPT-4o con tool wikipedia_search para consultar
información de Wikipedia. Responde en español, tono profesional.
exchange-bot: agente GPT-4o con 4 tools de exchange rate para consultar
tasas de cambio, convertir entre monedas, listar monedas disponibles
y ver historial. Requiere EXCHANGERATE_API_KEY en .env.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- tools/wikipedia/wikipedia.go: tool wikipedia_search que consulta la
API pública de Wikipedia (sin auth). Devuelve resumen del artículo.
- tools/exchange/exchange.go: 4 tools de tipo de cambio usando
exchangerate-api.com: exchange_rate_get, exchange_rate_convert,
exchange_rate_list, exchange_rate_historical.
- internal/config/schema.go: añadir ExchangeRateToolCfg con Enabled,
APIKey, APIKeyEnv y Timeout.
- devagents/registry_build.go: registrar ambas tool families.
wikipedia_search siempre disponible; exchange rate tools requieren
APIKey configurado (deny-by-default con WARN si falta).
- devagents/registry_build_test.go: actualizar test de registry build.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Eliminar el early-return `if len(loadedSpecials) == 0 { return false }`
que causaba que el config del orchestrator (disabled/fallido) se intentara
cargar como agente normal, fallando con "agent.id is required".
Ahora la función parsea el YAML con LoadSpecial y devuelve true si
cfg.Special.ID != "" — independientemente de si el agente arrancó.
Esto silencia el error recurrente en cada inicio del launcher.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Nueva regla .claude/rules/delete_agent.md con instrucciones completas
para eliminar agentes (manual y automatizado). Actualiza index.md,
CLAUDE.md y cierra issue 0048.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>
Father Bot pasa de creador restringido a administrador completo del
sistema de agentes: crear, modificar, desactivar, configurar tools,
gestionar permisos, diagnosticar. Sin limites artificiales.
Father Bot ya no tiene restricciones artificiales. Ahora puede:
- Crear, modificar y desactivar agentes
- Configurar tools con allowlists reales (no solo vacias)
- Gestionar permisos en security/
- Diagnosticar problemas leyendo logs
- Sin limite de agentes por sesion
Se eliminaron: restricciones de paths, rate limiting de creacion,
deny-by-default obligatorio en tools, prohibicion de modificar
agentes existentes, prohibicion de eliminar agentes.
Se mantienen: ACL admin-only, proteccion anti-injection del propio
Father Bot, prohibicion de mostrar .env, seccion de seguridad en
prompts de agentes creados.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Corrige bug donde el system prompt de agentes en agents/_specials/
(como Father Bot) no se cargaba porque el runtime resolvia la ruta
como agents/<id>/... en vez del directorio real del config.
Agrega ConfigDir al schema de config, poblado por el loader.
Test con directorio anidado (agents/_specials/father-bot/) que
confirma que ConfigDir se resuelve al directorio padre del config
y que system_prompt_file se puede resolver relativo a el.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Antes, el runtime construia la ruta del system prompt como
agents/<agent-id>/<file>, lo cual fallaba para agentes en
agents/_specials/ (como Father Bot). Ahora:
1. config.Load() guarda el directorio del config en ConfigDir
2. llm.go usa ConfigDir para resolver rutas relativas
Esto corrige que Father Bot operara sin su system prompt completo
(369 lineas de instrucciones, pipeline, seguridad) usando solo la
description de una linea como fallback.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
El runtime resuelve system_prompt_file como agents/<id>/prompts/...
pero los agentes especiales viven en agents/_specials/<id>/. Esto
causa que Father Bot opere sin su system prompt completo de 369 lineas.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Habilita streaming en Father Bot y mejora el ProgressReporter para
mostrar mensajes legibles durante la creacion de agentes (paso N,
nombre del script, emoji contextual) en vez de comandos raw.
Tests unitarios para formatToolEvent con todos los pipeline hints:
create-full.sh, health-check.sh, notify-developer.sh, restart.sh,
start.sh, go build, go test, Edit, Read, Glob, Grep, y fallback
generico. Incluye tests para el contador de pasos y truncateInput.
Actualiza test de integracion existente para el nuevo formato de
mensajes (step counter + nombres legibles vs raw tool names).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Informa a Father Bot que el sistema muestra automaticamente progreso
al usuario en tiempo real, y que no necesita enviar mensajes
intermedios manuales. Esto evita duplicacion de feedback.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
El ProgressReporter ahora muestra mensajes legibles cuando detecta
comandos conocidos del pipeline de creacion de agentes:
- create-full.sh → "📦 Creando agente: scaffold, build, register..."
- health-check.sh → "🏥 Verificando health check..."
- notify-developer.sh → "📨 Enviando bienvenida a developers..."
- restart.sh / start.sh → "🔄 Reiniciando launcher..."
- go build → "🔨 Compilando..."
- go test → "🧪 Ejecutando tests..."
- Edit/Write → "✏️ Editando: <archivo>"
- Read → "📖 Leyendo: <archivo>"
- Glob/Grep → "🔍 Buscando: <patron>"
Incluye contador de pasos visible ("Paso N — <descripcion>") para que
el usuario pueda seguir el progreso. Si no reconoce el comando, usa
el formato generico anterior.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Issue para que Father Bot muestre feedback visual durante la creacion
de agentes. Incluye: habilitar streaming en config, mejorar formateo
del ProgressReporter con nombres de pasos legibles, y tests.
Tambien habilita streaming + show_tool_progress en el config de
Father Bot (quick win que activa el ProgressReporter existente).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>