413 Commits

Author SHA1 Message Date
egutierrez fc86edd94c chore: auto-commit (27 archivos)
- .claude/CLAUDE.md
- .claude/rules/create_agent.md
- agents/_specials/father-bot/prompts/system.md
- agents/_template/config.yaml
- agents/_template_robot/config.yaml
- cmd/agentctl/autoavatar.go
- cmd/launcher/sqlite.go
- dev-scripts/_common.sh
- dev-scripts/agent/create-full.sh
- dev-scripts/agent/delete-full.sh
- ...

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 19:38:16 +02:00
egutierrez 072e00f305 merge: issue/0145-mcp-bridge-claude-code-devicemesh — MCP bridge real para claude-code
Conecta claude -p de cada agent al ToolRegistry de devicemesh via MCP
JSON-RPC en lugar de exponer las tools solo como texto en el system
prompt. Antes: claude imitaba el formato sin ejecutar (anti-criterio A3
del flow 0009 fallaba — audit DB vacia). Despues: claude usa
mcp__devicemesh__exec etc como tools de verdad, audit DB se llena.

Cuatro piezas:
 1. cmd/devicemesh-mcp — binario standalone, child de claude via
    --mcp-config, JSON-RPC stdio (mcp-go SDK).
 2. internal/config/schema.go — DeviceMesh.ExposeViaMCP (default true) +
    ClaudeCodeCfg.MCPConfigPath/MCPServerName.
 3. devagents/mcp_bridge.go + cmd/launcher/main.go — ApplyMCPBridge
    resuelve binario+URL+tools y escribe /tmp/<agent>-mcp-config.json
    antes de instanciar la runtime.
 4. shell/llm/claudecode.go — buildClaudeArgs emite --mcp-config; guard
    defensivo si DisableTools+AllowedTools combinados.

Tests: 10 unit + 1 integration (subprocess real) en cmd/devicemesh-mcp;
9 en devagents/mcp_bridge_test.go; 2 actualizados/anadidos en
shell/llm/claudecode_test.go. Suite completa pasa con -tags goolm.
2026-05-24 18:34:17 +02:00
egutierrez 4abc487b5e docs(0145): cerrar issue + actualizar README
Mueve 0145 a completed/ tras validar smoke real del binario:

echo '<initialize>+<notif/initialized>+<tools/list>' | bin/devicemesh-mcp
  --device-agent http://127.0.0.1:9999 --mode user
  --tools-allowed "exec,fs.read"

devuelve dos frames JSON-RPC esperados:
1. initialize result con serverInfo.name=devicemesh + capabilities.tools.
2. tools/list result con exec + fs.read, inputSchema completo incluyendo
   required fields (argv, path).

Suite de tests con -tags goolm -count=1 pasa sin errores.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 18:34:01 +02:00
egutierrez d1fd78324b test(0145): unit + integration + launcher + claudecode coverage
cmd/devicemesh-mcp/main_test.go (10 tests):
- TestInitialize: JSON-RPC initialize frame → serverInfo + capabilities.
- TestToolsList: tools/list → 16 user-mode entries, cada uno con name +
  inputSchema valido.
- TestToolsCallExec: tools/call name=exec → mock device-agent (httptest)
  recibe capability=shell.exec, MCP response content contiene "hi".
- TestToolsCallInvalidTool: name desconocido → isError o error envelope.
- TestNotificationsInitializedNoResponse: notification (sin id) → cero
  responses.
- TestUserModeFiltersPkgInstall: --mode user oculta pkg.install,
  --mode sudo la expone.
- TestToolsAllowedNarrows: --tools-allowed exec,fs.read → solo 2.
- TestSplitCSV, TestParseMode, TestIsCleanShutdown: helpers.

cmd/devicemesh-mcp/integration_test.go:
- TestIntegrationBinarySubprocess: build el binario en tmp + spawn como
  child via exec.Command + pipe real + secuencia initialize ->
  notifications/initialized -> tools/list -> tools/call. Valida el path
  identico al que usara claude.

devagents/mcp_bridge_test.go (9 tests):
- Disabled paths (nil DM, ExposeViaMCP=false, provider!=claude-code).
- Applied path: /tmp/<agent>-mcp-config.json JSON valido, mode 0600,
  mcpServers.devicemesh con command apuntando al binario fake.
- AllowedTools formato mcp__<server>__<tool>.
- DisableTools=true overrideado a false.
- URLEnv override gana sobre YAML.
- Binary missing → ok=false sin panico.
- BuildClaudeAllowedToolNames default server name.
- ResolveBridgedToolNames respeta mode + ToolsAllowed.
- ShouldExposeViaMCP cubre nil/disabled/default/explicit-true/false.

shell/llm/claudecode_test.go:
- TestBuildClaudeArgs_DisableTools actualizado: solo emite --tools "" cuando
  AllowedTools ESTA vacio. La regla nueva (issue 0145) da precedencia a
  AllowedTools.
- Anadido TestBuildClaudeArgs_DisableToolsButAllowedToolsWins.
- Anadido TestBuildClaudeArgs_MCPConfigPath.

bridge.go fix: cambio NewTool + WithRawInputSchema a NewToolWithRawSchema
porque NewTool inicializa ToolInputSchema.Type="object" por default, lo
cual entra en conflicto con RawInputSchema en MarshalJSON del SDK.

Suite completa pasa con -tags goolm -count=1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 18:33:24 +02:00
egutierrez b92a350023 feat(0145-2,3,4): schema + launcher wiring + claude --mcp-config arg
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>
2026-05-24 18:28:34 +02:00
egutierrez 15596df7e4 feat(0145-1): binario devicemesh-mcp + issue doc
Anade el binario standalone cmd/devicemesh-mcp/ que expone via JSON-RPC
sobre stdio el catalogo de devicemesh tools (exec, shell.eval, fs.*,
git.*, pkg.*, proc.*, docker.*) al claude -p parent.

Arquitectura issue 0145:
- main.go: flags (--device-agent, --mode, --tools-allowed, --server-name),
  inicializa devicemesh.Client + RegisterBuiltins + FilterByAllowed, lanza
  server.ServeStdio del SDK mark3labs/mcp-go (ya dep).
- bridge.go: registra cada ToolSpec como mcp.Tool con WithRawInputSchema +
  handler que invoca ToolRegistry.Call (validate->map->HTTP->map). Resultado
  serializado a NewToolResultText, errores como NewToolResultError para que
  el modelo se autocorrija.

Razon: hoy claude -p ve nuestras tool names solo como TEXTO en el system
prompt y las imita sin ejecutar. Con --mcp-config apuntando a este binario,
claude las descubre via tools/list e invoca via tools/call REALMENTE.

Smoke OK: initialize frame produce {capabilities:{tools:{listChanged:true}},
serverInfo:{name:"devicemesh",version:"0.1.0"}}.

Issue doc 0145 incluido con aceptacion A3 anti-hallucination + DoD triada.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 18:26:22 +02:00
egutierrez 47bcf9d583 fix(agent-wsl-lucas): enable device_mesh + trim tools_allowed a registry real
device_mesh.enabled=true + host=wsl-lucas. tools_allowed limitado a los 14
tools que existen en pkg/tools/devicemesh (0144a). Removidos project.*,
screenshot, clipboard.*, delegate_sudo, memory.* (futuros 0144d/e).
2026-05-24 14:17:49 +02:00
egutierrez 91e0da5b99 fix(agent-wsl-lucas): disable encryption + enable tool_use for POC
Crypto cross-signing no provisionado todavia (verify.sh es paso aparte).
Disable encryption.enabled=false para que el bot pueda hacer login sin
cifrado. tool_use.enabled=true porque la spec 0144 requiere LLM tool calls
contra device-mesh.
2026-05-24 14:16:58 +02:00
egutierrez aac6dbf8b2 merge: issue/0144-mesh-llm-agents
Flow 0009: device-mesh tool registry + provisioning script + launcher
wiring + agent-wsl-lucas LLM scaffold. 4 commits atomicos por subfase
(0144a/b/c + agent-wsl-lucas).

49 tests nuevos (25 devicemesh + 7 schema + 7 registry_build + 4 effects +
6 provision bash mock). Build limpio con -tags goolm.
2026-05-24 14:07:21 +02:00
egutierrez 63f9bc3e9e feat: provision agent-wsl-lucas para flow 0009
Agent LLM mode=user para wsl-lucas (10.42.0.10:7474). Matrix user
@agent-wsl-lucas:matrix-af2f3d.organic-machine.com. Tools allowed: exec
+ shell.eval + fs.read/write/list/stat + git + docker + proc + pkg.search.
Delegacion sudo pendiente (futuro agent-wsl-lucas-sudo).
2026-05-24 14:07:13 +02:00
egutierrez 61606d450d feat(0144c): launcher wiring + adapter al tool-use loop LLM
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.
2026-05-24 14:07:13 +02:00
egutierrez 4c5bf95def feat(0144b): provision-agent-user.sh script idempotente + templates
Bash script que provisiona Matrix user via Synapse admin API + login para
access_token + scaffold completo (config.yaml, agent.go, prompts/system.md).
6 templates (user/sudo x config/agent.go/prompt). 20 tests bash pasan.
Genera .env con AGENT_<ID>_TOKEN/PASSWORD/PICKLE/DEVICE_ID + URL mesh.
2026-05-24 14:07:13 +02:00
egutierrez bcd246bf85 feat(0144a): tool registry framework para device-mesh
Anade pkg/tools/devicemesh con Client HTTP al device_agent + ToolRegistry
con 16 tools standard (exec, fs.*, git.*, docker.*, proc.*, pkg.*, shell.eval).
RegisterBuiltins filtra por mode user/sudo via RequiresApproval flag.
Hook al pkg/decision con ActionKindDeviceMesh + DeviceMeshAction.
Runner soporta dispatch via NewRunnerWithDeviceMesh (back-compat NewRunner).

Tests: 25 nuevos en devicemesh + 4 en runner. Build clean.
2026-05-24 14:07:13 +02:00
egutierrez 71b3b2bca9 feat(api): status ring buffer (last 100) + GET /status/recent endpoint
Bus.Publish now also appends each event to a per-topic ring buffer of
size 100. Bus.Recent(topic, n) returns the tail. New endpoint:

  GET /status/recent?n=N    → JSON array of last N status-diff events

This lets a fresh client (agents_dashboard launching cold) populate its
Status Feed panel with historical activity before subscribing to
/sse/status for live updates. Until now, new SSE subscribers only saw
events emitted AFTER they connected — making the panel useless for
recent history review.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 23:38:55 +02:00
egutierrez e3b034e784 merge: 0131 v0.2 unified control + uptime + msg_24h + clear_memory + delete_cache 2026-05-22 23:09:02 +02:00
egutierrez 261f96f71b feat(api): per-agent unified control + clear_memory + delete_cache
- Manager: RegisterUnifiedAgent/UnregisterUnifiedAgent/StopUnifiedAgent/
  IsUnifiedAgentRunning/UptimeSeconds — cancela goroutines individuales sin
  matar el launcher
- Manager: UptimeSeconds en AgentStatus via startedAt map
- api/server: AgentController interface + WithController/WithDataDir builders
  + rutas POST /agents/{id}/clear_memory y /agents/{id}/delete_cache
- api/handlers: handleStartAgent/Stop/Restart delegan a controller en modo
  unified; Messages24h enriquecido via queryMessages24h (cache 30s)
- api/handlers: handleClearMemory — para la goroutine, borra messages+facts de
  memory.db, responde {status,messages_deleted,facts_deleted}
- api/handlers: handleDeleteCache — para la goroutine, elimina crypto/ y cache/,
  responde {status,paths_deleted}
- launcher/registry: launchGoroutine extrae goroutine con contexto per-agente;
  deps.procMgr hookea RegisterUnified; startAgent permite relanzar via reload
- launcher/main: agentController implementa api.AgentController sobre registry;
  mgr compartido entre API y registry; WithController+WithDataDir cableados

Co-Authored-By: fn-orquestador <noreply@fn-registry>
2026-05-22 22:56:46 +02:00
egutierrez 3db4443b65 fix(sse): initial ping + periodic heartbeat unblocks "connecting" state
SSE clients (agents_dashboard) consider the stream connected only after
receiving the first byte of body. The previous implementation flushed
headers and then blocked waiting for status diffs (sse_status) or log
lines (sse_agents_logs) — which could be silent for minutes. UI sat
on "connecting" indefinitely.

Fix:
- After WriteHeader + Flush, emit ":ping\n\n" comment (SSE spec, valid
  no-op) and flush. Unblocks client fgets immediately → state flips
  to "connected" in < 1s.
- Add 15s ticker emitting ":ping\n\n" so idle streams stay alive
  through Traefik / CDN proxies and clients detect dead servers.
- Same treatment for /sse/status and /sse/agents/{id}/logs (tail.go).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 22:42:29 +02:00
egutierrez 4822208306 fix(api): statusWriter implements http.Flusher for SSE handlers
The logMiddleware wrapper (statusWriter) didn't forward Flush, so
`w.(http.Flusher)` in SSE handlers failed and returned the plain text
"streaming unsupported" with 500. SSE clients (agents_dashboard C++ app)
saw a closed connection with no events.

Add Flush() that delegates to the embedded ResponseWriter when it
implements Flusher. Required for /sse/status and /sse/agents/{id}/logs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 22:32:06 +02:00
egutierrez cd0ba85a22 chore: auto-commit (1 archivos)
- launcher

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 21:52:38 +02:00
egutierrez bdd0c6266d merge: 0128 http api + sse + apikey + systemd + unified status fix 2026-05-22 21:32:40 +02:00
egutierrez b3cf8b41aa fix(api): autodetect unified vs multi-process status for running field
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>
2026-05-22 21:31:41 +02:00
egutierrez 98839cd8a8 feat(api): HTTP API REST+SSE para gestion remota de agentes (issue 0128)
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)
2026-05-22 21:19:10 +02:00
egutierrez 1f90953ccc chore: auto-commit (1 archivos)
- app.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 00:31:32 +02:00
egutierrez 1a534f8f45 merge: quick/launcher-auto-restart — supervisar agentes y reiniciarlos cuando salen sin cancelacion 2026-05-09 14:55:44 +02:00
egutierrez 10f0614fc0 fix(launcher): supervisar agentes y reiniciarlos cuando salen sin cancelacion
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.
2026-05-09 14:55:41 +02:00
egutierrez 199dc18eb5 refactor(memory): migration files + embed.FS
- shell/memory/migrations/001_init.sql extraido del schema inline
- sqlite.go: applyMigrations() con embed.FS aplicado al abrir
- aplica regla db_migrations.md (fn_registry/.claude/rules/)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 00:45:00 +02:00
egutierrez 2317ba0599 docs: add app.md with metadata for fn_registry indexing
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 22:05:14 +02:00
egutierrez 3ae7e1c2c2 docs: simplificar nota CI/CD
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 21:01:33 +02:00
egutierrez 9a3399a537 docs: detallar pipeline CI/CD en README
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 21:00:07 +02:00
egutierrez 7ad03659c2 docs: formatear nota CI/CD en README
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:59:26 +02:00
egutierrez e831be9d5b docs: añadir nota de CI/CD al README
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:58:12 +02:00
egutierrez 7b519e2abb merge: quick/reminder-bot-and-updates — Nuevo agente reminder-bot + fixes
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
2026-04-12 18:10:27 +00:00
egutierrez daab1314c6 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>
2026-04-12 18:10:05 +00:00
egutierrez 32718990d6 chore: actualizar father-bot con pipeline automatizado y base_path
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>
2026-04-12 18:09:59 +00:00
egutierrez c6081a38a4 fix: resolveDataBase usa ConfigDir como fallback para data path
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>
2026-04-12 18:09:53 +00:00
egutierrez 8791c3d73f merge: issue/0049-automate-agent-personalization — Automatizar personalización al crear agentes
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>
2026-04-11 00:33:35 +00:00
egutierrez 4b94bdf4e2 docs: cerrar issue 0049 — automatizar personalización al crear agentes
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>
2026-04-11 00:33:22 +00:00
egutierrez bb89fbec03 chore: re-personalizar wikipedia-bot y exchange-bot con personalize.sh
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>
2026-04-11 00:33:18 +00:00
egutierrez e8c15d9e92 docs: actualizar reglas y skills con el nuevo flujo automático (Paso 8)
- .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>
2026-04-11 00:33:13 +00:00
egutierrez 8d2a767518 feat: scripts detect-provider.sh, personalize.sh e integración en create-full.sh
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>
2026-04-11 00:33:07 +00:00
egutierrez 7c65595f8d test: e2e test para father bot y agentes útiles
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>
2026-04-11 00:25:21 +00:00
egutierrez 12d7d0caed docs: crear issue 0049 — automatizar personalización al crear agentes
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>
2026-04-11 00:25:18 +00:00
egutierrez b4d9a2b3fd feat: añadir agentes wikipedia-bot y exchange-bot
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>
2026-04-11 00:25:14 +00:00
egutierrez f2718aa17c feat: añadir tools wikipedia_search y exchange_rate
- 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>
2026-04-11 00:25:10 +00:00
egutierrez 04b8d2b461 fix: corregir isSpecialConfig cuando loadedSpecials está vacío
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>
2026-04-11 00:25:03 +00:00
egutierrez 53a22538d8 merge: issue/0048-delete-agent-pipeline — Pipeline de eliminacion de agentes y robots
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 23:45:04 +00:00
egutierrez 98da4f7521 docs: regla delete_agent.md y cierre de issue 0048
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>
2026-04-10 23:44:42 +00:00
egutierrez 50013b0ecb feat: pipeline completo de eliminacion de agentes y robots
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>
2026-04-10 23:44:38 +00:00
egutierrez 6107aefb52 merge: quick/father-bot-full-access — Father Bot sin restricciones
Father Bot pasa de creador restringido a administrador completo del
sistema de agentes: crear, modificar, desactivar, configurar tools,
gestionar permisos, diagnosticar. Sin limites artificiales.
2026-04-10 23:34:16 +00:00
egutierrez ed6c5c205b feat: convertir Father Bot en administrador completo sin restricciones
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>
2026-04-10 23:34:11 +00:00