Commit Graph

406 Commits

Author SHA1 Message Date
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
egutierrez ca368e2e32 merge: issue/0047-fix-system-prompt-path — system prompt para _specials
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.
2026-04-10 23:21:47 +00:00
egutierrez 5047a321d2 docs: cerrar issue 0047 — system prompt path fix
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 23:21:41 +00:00
egutierrez 06501e2bcc test: verificar que Load() puebla ConfigDir correctamente
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>
2026-04-10 23:21:28 +00:00
egutierrez 1b499c9b67 fix: resolver system_prompt_file relativo al directorio del config
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>
2026-04-10 23:21:23 +00:00
egutierrez bbfbcf4f16 docs: crear issue 0047 — system prompt no se carga para _specials
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>
2026-04-10 23:21:16 +00:00
egutierrez 7c36c7c9a6 merge: issue/0046-father-bot-progress — progreso en tiempo real para Father Bot
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.
2026-04-10 23:18:02 +00:00
egutierrez cf26061399 docs: cerrar issue 0046 — progreso en tiempo real para Father Bot
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 23:17:31 +00:00