Pieza 2 — schema (internal/config/schema.go):
- DeviceMeshConfig.ExposeViaMCP *bool: pointer para distinguir "no
establecido" vs "false explicito". Helper ShouldExposeViaMCP() devuelve
true cuando enabled && (nil || *true).
- ClaudeCodeCfg.MCPConfigPath y MCPServerName: poblados en runtime por
la launcher, NUNCA por YAML.
Pieza 3 — launcher wiring (devagents/mcp_bridge.go + cmd/launcher/main.go):
- ApplyMCPBridge(cfg, logger): si DeviceMesh.ShouldExposeViaMCP() y
provider=claude-code, resuelve binario devicemesh-mcp (junto al
launcher), URL device_agent (env override > YAML), lista tools allowed
(RegisterBuiltins + FilterByAllowed igual que registry_build.go), y
escribe /tmp/<agent_id>-mcp-config.json (0600).
- Aplica overrides a cfg.LLM.Primary.ClaudeCode: MCPConfigPath,
AllowedTools (formato mcp__<server>__<tool>), DisableTools=false
defensivo.
- Launcher main.go llama ApplyMCPBridge inmediatamente despues de
config.Load, ANTES de devagents.New (que es donde se construye el
CompleteFunc del provider).
Pieza 4 — claude args (shell/llm/claudecode.go):
- buildClaudeArgs ahora emite "--mcp-config <path>" cuando
cfg.MCPConfigPath no esta vacio.
- Guard defensivo: DisableTools=true + AllowedTools no vacio ahora
produce solo --allowedTools (efectivamente ignora DisableTools). El
launcher ya lo previene en ApplyMCPBridge, pero esto protege a
callers directos.
Build limpio con goolm.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Schema DeviceMeshConfig en AgentConfig. Adapter ToolsForLLM convierte
ToolSpec → tools.Tool transparente al LLM existente. URL via env var
override. tools_allowed filter. agent-wsl-lucas blank import en launcher.
LLM ve los tools como cualquier otra herramienta. Effects runner ya
soporta ActionKindDeviceMesh como fallback. Build + tests verdes.
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>
- 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>
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>
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>
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>