Commit Graph

111 Commits

Author SHA1 Message Date
egutierrez aeba5d1e86 feat: hardening de system prompts contra prompt injection
Crea template reutilizable en .claude/templates/security-prompt.md y
aplica seccion de seguridad obligatoria a todos los system prompts:

- assistant-bot/prompts/assistant-system.md
- asistente-2/prompts/system.md
- meteorologo/prompts/system.md

Las instrucciones cubren:
- Rechazo de acciones fuera del rol
- Proteccion del system prompt (no revelar)
- Rechazo de comandos destructivos
- Validacion de coherencia contextual de tool calls
- Resistencia a redefinicion de identidad
- Prohibicion de generar contenido para ataques

Tareas 3.1, 3.2, 3.3 del issue 0019.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:49:57 +00:00
egutierrez 536fa0bc54 feat: storage.base_path configurable para aislar datos de runtime
Añade BasePath a StorageCfg y resolveDataBase() en runtime.go para
centralizar la resolucion del directorio base de datos del agente.

Prioridad: config storage.base_path > $AGENTS_DATA_DIR/<id> > agents/<id>/data

Esto permite mover los datos de runtime fuera del arbol del proyecto,
evitando que herramientas de desarrollo lean bases de datos, logs o
crypto stores por accidente.

Los paths de memory.db y knowledge.db ahora usan el base resuelto.
Los configs existentes no se rompen (fallback al path original).

Tareas 1.1 y 1.2 del issue 0019.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:49:02 +00:00
egutierrez b4db953211 merge: issue/0019c-rate-limiting — rate limiting de tools por room
Rate limiting de tool calls por room usando sliding window en el registry.
Config via security.tool_rate_limit en YAML. Loguea tool_rate_limited
al exceder el limite. Tests unitarios y de integracion incluidos.

Sub-issue 0019c del hardening contra prompt injection.
2026-03-07 19:46:34 +00:00
egutierrez 8f1d86333a docs: actualizar progreso de issue 0019 — sub-issue 0019c completado
Marca como completadas las tareas de fase 4 (rate limiting) y 6.5
(tests de rate limiting) en el desglose multi-issue.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:46:11 +00:00
egutierrez 3dcd890dc9 test: tests para rate limiter y registry con rate limiting
Tests unitarios para tools/ratelimit.go:
- Allow dentro del limite, denegacion al exceder
- Keys independientes (rooms distintas no interfieren)
- Expiracion de ventana temporal
- Cleanup de entries expiradas vs activas

Tests de integracion para Registry.ExecuteForRoom:
- Rate limiting activo bloquea tras exceder limite
- Sin rate limiter todas las llamadas pasan

Parte de issue 0019c (tarea 6.5).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:45:47 +00:00
egutierrez 69efb6ab95 feat: rate limiting de tools por room en registry
Añade rate limiting de tool calls por room usando sliding window:

- tools/ratelimit.go: RateLimiter con sliding window per key (room),
  Allow() para verificar/registrar llamadas, Cleanup() para limpiar
  entries expiradas
- tools/registry.go: SetRateLimiter() y ExecuteForRoom() que verifica
  el rate limit antes de ejecutar, logueando tool_rate_limited si excede
- internal/config/schema.go: ToolRateLimitCfg en SecurityCfg con
  enabled, max_calls_per_min y cleanup_interval_s
- agents/runtime.go: inicializa rate limiter desde config y arranca
  goroutine de cleanup periodico
- agents/commands.go: usa ExecuteForRoom en !tool command

Config YAML:
  security:
    tool_rate_limit:
      enabled: true
      max_calls_per_min: 10

Parte de issue 0019c (prompt injection hardening — rate limiting).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:45:41 +00:00
egutierrez 01a734cd9b merge: issue/0020-fix-issue-command — comando /fix-issue para implementar issues 2026-03-07 19:39:29 +00:00
egutierrez cc6b13180a docs: añadir comando /fix-issue para flujo de implementacion de issues
Nuevo comando slash que ejecuta de punta a punta el flujo de
implementacion y cierre de un issue, siguiendo estrictamente la
regla fix_issue.md. Incluye:

- Resolucion del issue por numero o slug
- Lectura del issue y extraccion de tareas
- Creacion de rama con /git-branch
- Planificacion con TodoWrite
- Implementacion con compilacion frecuente
- Tests obligatorios antes de cerrar
- Evaluacion de feature flags si aplica
- Cierre del issue (mover a completed/, actualizar README)
- Integracion a master con /git-push

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:39:22 +00:00
egutierrez 905e21d614 merge: issue/0019b-input-sanitization — sanitizacion de input contra prompt injection 2026-03-07 19:35:39 +00:00
egutierrez be8e410478 docs: actualizar progreso de issue 0019 — sub-issue 0019b completado
Marcar como completado: fase 2 (sanitizacion de input) y tarea 6.1
(tests de pkg/sanitize). Actualizar tabla de desglose multi-issue.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:34:45 +00:00
egutierrez 0b4fbecc67 test: tests para pkg/sanitize con corpus de injection conocidos
17 test functions cubriendo:
- Deteccion de delimitadores de sistema (<|system|>, [INST], XML tags)
- Override de instrucciones (EN/ES)
- Redefinicion de identidad (you are now / ahora eres)
- Exfiltracion de prompt (EN/ES)
- Jailbreak (developer mode, DAN)
- Evasion base64
- Modos: warn, strip, reject
- Filtro por severidad minima
- Patrones deshabilitados
- False positives: 9 mensajes legitimos verifican 0 warnings

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:34:39 +00:00
egutierrez 64d29e5968 feat: integrar sanitizacion de input en runtime y config
- agents/runtime.go: campo sanitizeOpts en Agent, sanitizeInput() que
  llama a sanitize.Sanitize() y loguea warnings. Integrado en
  executeActions() y handleTaskEvent() antes de enviar al LLM.
  En modo reject, responde al usuario y corta el flujo.
- internal/config/schema.go: nuevo tipo SanitizeCfg dentro de SecurityCfg
  con campos enabled, mode, min_severity, disabled_patterns.

Protegido por feature flag prompt-injection-hardening (OFF).
Se activa por agente via security.sanitize.enabled en config.yaml.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:34:33 +00:00
egutierrez e8dd7c41ed feat: crear pkg/sanitize para deteccion de prompt injection
Nuevo paquete puro (sin I/O) que detecta patrones de prompt injection
en mensajes de usuario antes de enviarlos al LLM.

- patterns.go: 15 patrones en ingles y español (delimitadores de sistema,
  override de instrucciones, exfiltracion de prompt, jailbreak, evasion base64)
- sanitize.go: funcion Sanitize() con 3 modos (warn, strip, reject),
  filtro por severidad minima y patrones deshabilitables
- Tipos: Pattern, Severity, Mode, Options, Warning, Result

Todo puro: string in → Result out. Los side effects (logging, rechazo)
ocurren en el caller (runtime.go).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:34:24 +00:00
egutierrez 987ac09a09 merge: issue/0020-claude-md-simplify — simplificar CLAUDE.md 2026-03-07 19:28:07 +00:00
egutierrez bccd722e04 docs: simplificar CLAUDE.md de 284 a 97 líneas
Se condensa el archivo principal de contexto eliminando redundancia
con las reglas detalladas que ya viven en .claude/rules/*.md.

Cambios:
- Eliminar secciones duplicadas (dev-scripts, env vars, dependencias,
  extensiones pendientes) que ya están documentadas en otros archivos
- Mantener los dos pilares (FP + TBD) como secciones principales
- Condensar estructura de directorios, agentes, build y preferencias
- Referenciar .claude/rules/index.md para guías detalladas

No se pierde información: todo lo eliminado existe en rules/, MEMORY.md,
o README.md. El archivo queda más enfocado y dentro de límites razonables
para el contexto de LLMs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:28:00 +00:00
egutierrez be1f0ceaf3 merge: issue/0019-docs-desglose — documentar desglose multi-issue
Documenta el desglose de 0019 en sub-issues en el propio issue,
y añade la regla de hacerlo en fix_issue.md.
2026-03-07 19:19:56 +00:00
egutierrez 0ac8e72d14 docs: añadir regla de documentar desglose en fix_issue.md
Al desglosar un issue en sub-issues, ahora es obligatorio documentar
el desglose en el propio archivo del issue: tabla de sub-issues,
checklist de progreso por tarea, y actualizar con cada sub-issue
completada.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:19:52 +00:00
egutierrez d2b3e89e0e docs: documentar desglose multi-issue de 0019
Añade seccion "Desglose multi-issue" al issue 0019 con:
- Tabla de sub-issues (0019a-d), rama, alcance y estado
- Checklist de progreso por tarea agrupado por fase
- 0019a (tool hardening) marcado como completado

Esto permite trackear el avance de features multi-issue
directamente en el documento del issue.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:19:47 +00:00
egutierrez 75e46a3f53 merge: issue/0019a-tool-hardening — hardening de tools contra prompt injection
Sub-issue 0019a: deny-by-default, SSRF protection, path traversal,
SSH allowlist + syntax validation, Matrix room authorization.
40 tests nuevos. Feature flag OFF.
2026-03-07 19:17:31 +00:00
egutierrez 9692da687e chore: feature flag prompt-injection-hardening (OFF)
Flag para la feature multi-issue 0019 (prompt injection hardening).
Desactivado hasta que todas las sub-issues estén completas.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:17:10 +00:00
egutierrez f875a98acf test: tests para hardening de tools (file, ssh, http, matrix)
40 tests cubriendo:
- file: deny-by-default, path traversal, symlink escape, prefix confusion
- ssh: allowlist, blocklist, sintaxis shell (pipes, subshells, redirects)
- http: SSRF (loopback, IPs privadas, link-local, metadata), dominios
- matrix: room authorization allowlist

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:17:05 +00:00
egutierrez 4e7aa95adb feat: hardening de tools — deny-by-default, SSRF, path traversal, allowlists
Cambios de seguridad en las 4 herramientas de agentes:

- tools/file: deny-by-default (AllowedPaths vacío = todo denegado),
  resolución de symlinks con EvalSymlinks, protección contra path
  traversal (../) y confusión de prefijos (/opt vs /opt1234)
- tools/ssh: nuevo AllowedCommands allowlist (complementa ForbiddenCommands),
  validación de sintaxis shell (bloquea pipes, subshells, redirects, chains)
- tools/http: protección SSRF bloqueando IPs privadas, loopback, link-local,
  metadata (169.254.169.254). Validación de dominio case-insensitive.
- tools/matrix: nuevo parámetro AllowedRooms para restringir rooms destino
- internal/config/schema: AllowedCommands en SSHToolCfg, MatrixToolCfg nueva
- agents/runtime: pasa MatrixToolCfg al constructor de matrix_send

Parte de issue 0019 (prompt injection hardening). Feature flag OFF.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:17:00 +00:00
egutierrez 71a009f890 merge: issue/0010-access-control — completar control de acceso
Cierra las tareas pendientes del issue 0010:
- unauthorized_response: explicit en listener.go
- allowed_users ejemplo en configs de agentes
- documentación de control de acceso en docs/creating-agents.md
- issue movido a completed/
2026-03-07 19:05:19 +00:00
egutierrez 6542e7d51c chore: cerrar issue 0010 — access control completado
Mover issue a completed/ y actualizar README.
Todas las fases implementadas: allowlist, invite gating, RBAC puro,
integración en runtime, unauthorized_response explicit, y documentación.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:02:26 +00:00
egutierrez 702ebcca26 docs: documentar control de acceso en creating-agents.md
Añadir sección de control de acceso con los tres niveles:
- Nivel 1: allowlist de usuarios (allowed_users)
- Nivel 2: invite gating (auto-join restringido)
- Nivel 3: RBAC por acción (security.roles)

Incluye tabla de acciones disponibles y nota de retrocompatibilidad.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:02:10 +00:00
egutierrez 7d4fa78569 feat: implementar unauthorized_response explicit en listener
Conectar el campo unauthorized_response de FiltersCfg al shouldHandle()
del listener. Cuando está configurado como "explicit", el bot responde
con un mensaje de permisos denegados en lugar de ignorar silenciosamente.

También se añaden los campos allowed_users y unauthorized_response
(comentados como ejemplo) a los configs de assistant-bot y asistente-2.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:02:06 +00:00
egutierrez 1a99f9c7c1 merge: issue/0021-dev-workflow-docs — documentación TBD y feature flags en reglas 2026-03-07 18:55:14 +00:00
egutierrez abfd04420f docs: documentar TBD, feature flags y convenciones de commits en reglas
Añade documentación completa del flujo trunk-based development a todos
los archivos de reglas y comandos del proyecto:

- CLAUDE.md: sección completa de TBD con flujo, commits, ramas y feature flags
- git-branch.md: sección de features multi-issue y reglas de commits
- git-push.md: reglas críticas de commits (no WIP, no squash, no rebase -i)
- create_issue.md: guía de desglose en sub-issues con feature flags
- fix_issue.md: cuándo usar/no usar feature flags, flujo multi-issue
- index.md: resumen expandido del flujo TBD con commits y flags

Impacto: todas las reglas ahora documentan consistentemente el flujo
de desarrollo, convenciones de commits y uso de feature flags.
2026-03-07 18:55:09 +00:00
egutierrez 982c210fca merge: issue/0020-dev-workflow-cleanup — flujo de desarrollo y renombrado de issues
Integra estandarización de numeración de issues a 4 dígitos y el flujo
completo de desarrollo trunk-based (ramas, tests obligatorios, feature flags).
2026-03-07 18:40:01 +00:00
egutierrez 9a77ef59e8 feat: añadir flujo de desarrollo con ramas y feature flags
Se añaden las reglas y commands para el flujo trunk-based completo:
- fix_issue.md: guía para implementar issues (rama → tests → merge)
- git-branch.md: command para crear ramas issue/<NNNN>-<slug>
- git-push.md: actualizado con flujo de ramas, tests obligatorios y feature flags
- create_issue.md: ajustado formato de numeración a 4 dígitos
- index.md: añadida sección de flujo de desarrollo y regla fix_issue
- CLAUDE.md: referencia a la nueva regla fix_issue
- feature_flags.json: archivo base para flags de despliegue por fases

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 18:39:43 +00:00
egutierrez 2756557498 chore: renombrar issues a formato 4 dígitos (NNNN)
Se estandariza la numeración de todos los issues de 3 dígitos a 4 dígitos
(e.g. 005 → 0005, 010 → 0010) para mantener consistencia con la convención
definida en create_issue.md. Se actualiza el README con los nuevos nombres
y links. No hay cambios de contenido en los issues, solo renombrado.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 18:39:33 +00:00
egutierrez 55b0eedddc docs: añadir issue 019 — prompt injection hardening
Nuevo issue que describe el plan completo para proteger agentes contra
ataques de prompt injection. Cubre 7 fases: aislamiento de filesystem,
sanitización de input, hardening de system prompts, rate limiting de
tools, validación de argumentos de tool calls, tests y documentación.
Complementario al RBAC implementado en los commits anteriores.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:59:18 +00:00
egutierrez b60782959d feat: integrar RBAC y allowlist de usuarios en runtime y listener
Cambios en 3 archivos:
- agents/runtime.go: construye ACL desde config de roles, verifica permisos
  antes de ejecutar comandos (command:<name>), interacción LLM (ask) y
  ejecución de tools (tool:<name>). Mensajes denegados se loguean y
  responden al usuario.
- shell/matrix/listener.go: filtra invites y mensajes de usuarios no
  autorizados cuando se configura allowed_users (allowlist vacía = todos).
- internal/config/schema.go: añade campos AllowedUsers y
  UnauthorizedResponse a FiltersCfg para soportar la allowlist en config.

Esto conecta el paquete pkg/acl con el runtime para dar soporte completo
a control de acceso por rol, sin romper la compatibilidad (ACL vacío
permite todo como antes).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:59:09 +00:00
egutierrez 386e4d3dcb feat: añadir paquete pkg/acl para control de acceso puro
Nuevo paquete puro (sin I/O) que implementa RBAC basado en roles.
Incluye: ACL, Role, RoleDef, FromMap constructor, CanDo para verificar
permisos, RoleFor para resolver rol de un usuario, y soporte para
wildcards tanto en usuarios ("*") como en acciones ("command:*").
Incluye tests completos cubriendo: ACL vacío, admin wildcard, acciones
específicas, prefix wildcards, prioridad exacto>wildcard, y múltiples
roles por usuario.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:59:00 +00:00
egutierrez a726a5b73b chore: reemplazar prompt hola.md por joke.md
Se elimina el prompt hola.md (vacío/obsoleto) y se añade joke.md,
un prompt para que el agente haga bromas usando su personalidad y
la memoria de la conversación.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:41:26 +00:00
egutierrez 019dcc6fad docs: actualizar referencias policies→rules y añadir sección dev/
Se actualizan las referencias en CLAUDE.md de .claude/policies/ a
.claude/rules/, se añade la regla create_issue a la tabla de reglas,
y se agrega la nueva sección "Documentación de desarrollo" apuntando
a dev/README.md. También se actualiza skills/README.md con la nueva
ruta de reglas.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:41:21 +00:00
egutierrez f561f686c4 refactor: migrar tasks/ a dev/issues/ con estructura de desarrollo
Se mueve la documentación de issues/tasks de .claude/tasks/ a dev/issues/
para separar la planificación de desarrollo de la configuración de Claude.
Se añade dev/README.md como índice de la carpeta de desarrollo. Los issues
completados se mueven a dev/issues/completed/. Esto permite que dev/ sea
el punto central de documentación interna del proyecto.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:41:16 +00:00
egutierrez 9deffc12c9 refactor: migrar policies/ a rules/ y añadir create_issue
Se renombra .claude/policies/ a .claude/rules/ para usar terminología
más clara y consistente. Se añade la nueva regla create_issue.md con
guía completa para crear issues en dev/issues/, incluyendo el template
en .claude/templates/issue.md. El índice (index.md) se actualiza con
la nueva regla.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:41:08 +00:00
egutierrez 76de460d29 docs: nuevas task specs 015-018 y actualización de 014
Añade especificaciones de tareas para: multi-plataforma Telegram (015),
sistema de skills (016), cliente MCP tools (017), shared knowledge (018).
Actualiza task 014 para incluir sistema de personalidades y nuevas capacidades
del proyecto (skills, shared-knowledge, cron jobs) en el template de agentes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:17:08 +00:00
egutierrez bb1e11f456 feat: sistema de prompts externos y mejoras en runtime de agentes
Añade pkg/command/prompts.go para cargar prompts desde archivos .md externos
en el directorio prompts/. Mejoras en agents/runtime.go para el manejo de
herramientas y flujo de ejecución. Nuevos comandos en agents/commands.go.
Ajustes menores en pkg/command/builtins.go para integrar las nuevas capacidades.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:17:00 +00:00
egutierrez 6ae2e6be03 feat: scaffold del sistema de skills
Estructura inicial de skills organizadas por categoría (analysis, coding,
communication, devops, system). Incluye README con convenciones de formato
y directorio por skill con sus prompts. Las skills son plantillas de prompts
reutilizables que los agentes pueden invocar para tareas especializadas.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:16:52 +00:00
egutierrez 8d89a762fb refactor: mover tools a subpackages individuales
Cada tool ahora vive en su propio subpackage dentro de tools/ (clock, file,
http, knowledgetools, matrix, memorytools, ssh, weather) en lugar de archivos
planos en el paquete raíz tools/. Esto mejora la organización, permite imports
selectivos y reduce acoplamiento entre tools. El paquete tools/ raíz conserva
los tipos base (Def, Param, Result, ToolFunc, Tool, Registry).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 17:16:45 +00:00
egutierrez 8e089ec07e chore: renumerar tasks a 3 dígitos + añadir nuevas + config tweaks
Renumera todos los archivos de tasks de 2 dígitos (01-, 02-...) a
3 dígitos (001-, 002-...) para mejor ordenación. Añade tres nuevas
tasks pendientes: 012-threads, 013-hot-reload, 014-template-agent.

Deshabilita memory temporalmente en assistant-bot config mientras
se estabiliza el sistema de memoria.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 15:46:29 +00:00
egutierrez 525425a81c feat: opción Restart en TUI dashboard de agentes
Añade botón "Restart" en el menú de acciones de agente en la TUI.
Ejecuta stop + start del launcher unificado para aplicar cambios
de configuración sin salir del dashboard. Incluye intent nuevo
IntentRestartAgent y su implementación en el adapter impuro.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 15:46:23 +00:00
egutierrez f193f8d5ea fix: matar process group completo de claude-code al cancelar
Cuando se cancela una invocación de claude-code, el proceso principal
moría pero sus hijos (subprocesos node, etc.) quedaban huérfanos
consumiendo recursos. Ahora se crea un process group (Setpgid) y se
mata el grupo entero con kill(-pgid, SIGKILL) tanto en Cancel como
después de Run(), asegurando limpieza completa.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 15:46:18 +00:00
egutierrez d95ae173de feat: formato markdown en salida de comandos built-in
Mejora la salida de !help, !tools, !status e !info para usar markdown
nativo: encabezados en negrita, listas con bullet points, código inline
con backticks. Aprovecha el rendering HTML que ya hace el bot para que
los clientes Matrix muestren la información formateada correctamente.

No se cambia lógica de comandos, solo formato de texto de salida.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 15:46:13 +00:00
egutierrez 76ff9394d0 feat: respuestas como reply de Matrix + presencia online/offline
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>
2026-03-07 15:46:07 +00:00
egutierrez 29decb3321 feat: habilitar extensiones goldmark completas en mdToHTML
Se configura goldmark con extensiones GFM (tablas, strikethrough,
autolinks, task lists), DefinitionList, Footnote, Typographer y CJK.
Esto reemplaza el parser básico por defecto por uno con soporte completo
de Markdown, mejorando el rendering de mensajes enviados por los bots
en Matrix. Se reutiliza una instancia global del parser para evitar
recrearlo en cada llamada.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 14:12:41 +00:00
egutierrez 14f951982d fix: simplificar avatar.sh eliminando sync de displayname
Se elimina la llamada a `agentctl displayname` del script avatar.sh.
El script ahora solo sube la imagen como avatar, sin intentar
sincronizar el displayname desde el config. Esto evita errores
cuando el subcomando displayname no está disponible o falla.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 13:54:48 +00:00
egutierrez 7d97fd08da docs: mover task 11 (markdown rendering) a completed
La tarea de renderizado Markdown→HTML en mensajes Matrix ya fue
implementada. Se mueve el archivo de tareas pendientes a completed/.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 13:54:43 +00:00