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>
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>
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>
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>
Tests unitarios:
- runner_test.go: verifica ruteo correcto de ReplyAction segun
ThreadID (plain markdown, reply, thread, thread sin fallback, nil reply)
- thread_test.go: extraccion de ThreadID desde m.relates_to raw
(thread, reply sin thread, plain, m.replace, thread sin event_id)
- thread_relates_test.go: estructura JSON de RelatesTo.SetThread
cumple la spec de Matrix (rel_type, event_id, is_falling_back, m.in_reply_to)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implementa el soporte completo de threads de Matrix:
- Listener extrae ThreadID de m.relates_to con rel_type=m.thread
- Client.SendThreadMarkdown envia mensajes como parte de un thread
usando SetThread de mautrix con fallback m.in_reply_to
- Runner detecta ThreadID en ReplyAction y rutea a SendThreadMarkdown
- MatrixSender interfaz actualizada con SendThreadMarkdown
- runtime.go propaga ThreadID en todas las respuestas (comandos, LLM, RBAC)
- sendReply helper centraliza la logica de envio con/sin thread
- Auto-thread: si matrix.threads.auto_thread=true, crea thread nuevo
para cada conversacion que no esta ya en un thread
- Memoria por thread: usa ThreadID como clave de window cuando el mensaje
esta en un thread, permitiendo conversaciones paralelas independientes
- Config: matrix.threads.enabled y matrix.threads.auto_thread en ThreadsCfg
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Añade soporte para que las respuestas de los bots sean replies nativos
de Matrix (m.in_reply_to) en lugar de mensajes sueltos. Los clientes
Matrix mostrarán el mensaje original citado.
Cambios:
- EventID en MessageContext para capturar el ID del evento entrante
- InReplyTo en ReplyAction para indicar a qué evento responder
- SendReplyMarkdown en el cliente Matrix (shell/matrix/client.go)
- Runner usa SendReplyMarkdown cuando InReplyTo está presente
- runtime.go pasa InReplyTo en todas las respuestas LLM y comandos
- SetPresence online al arrancar, offline al apagar (graceful)
No se tocan: herramientas, TUI, configuración de agentes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Se reemplaza SendText por SendMarkdown en todos los puntos donde el agente
envía respuestas: runtime.go (comandos built-in y tareas orquestadas),
effects/runner.go (acciones Reply) y tools/matrix.go (matrix_send tool).
shell/matrix/client.go ahora usa goldmark para convertir Markdown a HTML real
en el campo FormattedBody del evento Matrix, cumpliendo con la spec de Matrix
para mensajes formateados. El Body conserva el markdown raw como fallback.
Se añade dependencia github.com/yuin/goldmark v1.7.16.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Se propaga *slog.Logger a todos los componentes impuros del shell:
- shell/bus/ — logs de subscribe, send, reply, timeout, unsubscribe
- shell/effects/ — duración y resultado de cada action ejecutada
- shell/llm/ (anthropic, openai, factory) — request/response con tokens, duración, fallback
- shell/memory/sqlite — open, save, recall, close con detalles
- shell/ssh/ — inicio, fin, errores y duración de comandos SSH
- tools/registry — registro, ejecución y errores de herramientas
Se usa el paquete shell/logger para field names consistentes (FieldDurationMS, FieldTokensUsed, etc.).
Cada componente recibe el logger por inyección de dependencias, sin globals.
Las firmas de New/FromConfig se actualizan para aceptar *slog.Logger.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>