Commit Graph

175 Commits

Author SHA1 Message Date
egutierrez f459d4e255 feat: controles de hot-reload por agente en el dashboard TUI
Añade opciones de Reload (hot-reload) separadas de Restart (reinicio
completo) en el dashboard, usando el mecanismo SIGHUP implementado en
el issue 0013.

Cambios en pkg/tui/ (capa pura):
- IntentReloadAgent: hot-reload de un agente individual via SIGHUP
- IntentReloadAll: hot-reload de todos los agentes via SIGHUP
- AgentActionOptions: añade "Reload" antes de "Restart" con descripciones
  clarificadas ("sin interrumpir los demás" vs "launcher completo")
- ServerMenuOptions (running): añade "Reload All" como primera opción
- executeAction: maneja "Reload" → IntentReloadAgent
- executeServerAction: maneja "Reload All" → IntentReloadAll
- Mensajes de estado diferenciados: "Reload OK — X recargado sin
  interrupciones" vs "Restart OK — launcher reiniciado"

Cambios en shell/tui/ (capa impura):
- reloadAgent(id): escribe run/reload.txt + SIGHUP; error si launcher
  no está corriendo (no hay fallback a full restart)
- reloadAll(): elimina reload.txt + SIGHUP; error si no está corriendo
- restartAgent(id): restaurado a su comportamiento original de
  stop+start completo del launcher

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 18:49:00 +00:00
egutierrez 6829de37c3 merge: issue/0013-hot-reload — hot-reload de agentes individuales via SIGHUP
Implementa recarga en caliente de un agente individual sin detener el launcher:

- Agent.Stop() + Agent.Done() para ciclo de vida individual del agente
- agentRegistry en el launcher para rastrear agentes vivos y recargarlos
- Handler de SIGHUP: lee run/reload.txt para determinar agente objetivo
- TUI: restartAgent() usa SIGHUP en lugar de kill+restart del launcher
- agentctl reload [agent-id]: nuevo subcomando de hot-reload
- Tests: bus.Unsubscribe, readReloadTarget, Agent.Stop/Done

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 18:44:47 +00:00
egutierrez 25f8aeafaa chore: eliminar issue 0013 de pendientes (ya movido a completed/)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 18:44:26 +00:00
egutierrez 4419fad754 chore: cerrar issue 0013 — hot-reload implementado
Mueve 0013-hot-reload.md a completed/ y actualiza el índice de issues.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 18:44:04 +00:00
egutierrez f95370de80 test: tests para hot-reload (bus, registry, ciclo de vida del agente)
- shell/bus/bus_test.go: tests de Subscribe/Send/Unsubscribe incluyendo
  idempotencia, canal cerrado tras unsubscribe y resubscribe posterior.

- cmd/launcher/registry_test.go: tests para readReloadTarget (archivo
  ausente, vacío, '*', agentID, whitespace).

- agents/lifecycle_test.go: tests para Agent.Stop()/Done() verificando
  que Stop() desbloquea Run y que es seguro llamarlo múltiples veces o
  con cancel nil.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 18:43:46 +00:00
egutierrez 8ec9f39b6d feat: agentctl reload — subcomando de hot-reload via SIGHUP
Nuevo subcomando: agentctl reload [agent-id]

- Sin argumento: elimina run/reload.txt y envía SIGHUP → todos los
  agentes se recargan.
- Con agent-id: escribe run/reload.txt con el ID y envía SIGHUP → solo
  ese agente se recarga.

Si el launcher no está corriendo, muestra error claro.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 18:42:38 +00:00
egutierrez 0b74513369 feat: TUI usa SIGHUP para hot-reload de agente individual
restartAgent() ahora escribe run/reload.txt con el agentID y envía
SIGHUP al launcher en lugar de matar y reiniciar el proceso completo.
Si el launcher no está corriendo, conserva el comportamiento anterior
(stop + start completo).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 18:42:05 +00:00
egutierrez 069f8758b1 feat: hot-reload de agentes individuales via SIGHUP
Implementa el mecanismo de hot-reload descrito en el issue 0013:

- agents/runtime.go: añade Agent.Stop() y Agent.Done() para ciclo de vida
  individual. Run() crea un contexto hijo cancelable y cierra el canal
  done al retornar.

- cmd/launcher/registry.go (nuevo): agentRegistry rastrea agentes vivos
  por ID. Métodos: register, stopAndWait, reload, reloadAll, waitAll,
  cleanupLogs. reload() sigue el flujo completo: stop→wait→unsubscribe
  →reload config→recreate→rewire bus/orch→start nueva goroutine.

- cmd/launcher/main.go: usa agentRegistry en lugar de sync.WaitGroup.
  Añade handler de SIGHUP en goroutine separada que lee run/reload.txt
  para determinar el agente objetivo (* o vacío = todos). Tras leer,
  borra run/reload.txt para no afectar el siguiente SIGHUP.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 18:41:32 +00:00
egutierrez f25ebc7b79 merge: quick/fix-e2e-thread-sender-scope — fixtures E2E robustos con SDK 2026-03-08 18:33:49 +00:00
egutierrez 478007fc50 test: cerrar thread panel en beforeEach de asistente-2
Importa closeThreadPanel y lo llama en beforeEach tras goToRoom.
Si el thread panel queda abierto de sesiones previas, sus sender elements
contaminarían los locators de waitForBotReply en tests posteriores.
2026-03-08 18:33:46 +00:00
egutierrez e0e0f2e013 refactor: reescribir fixtures E2E para deteccion robusta via SDK
Tres cambios principales en matrix-room.ts:

1. closeThreadPanel: nueva funcion exportada que cierra el panel de thread
   si esta abierto. Necesario para evitar que sender elements del panel
   contaminen locators de waitForBotReply.

2. waitForBotReply reescrito: usa Matrix SDK (mxMatrixClientPeg) en lugar
   de locators DOM para detectar respuestas. Captura startEventId antes de
   esperar para solo detectar mensajes NUEVOS. Ignora thread replies
   (rel_type=m.thread) y filtra por sender via room.getMember().
   Elimina la deteccion de sender por DOM que fallaba cuando thread summaries
   inyectaban elementos adicionales en el main timeline.

3. startThreadOnLastMessage reescrito: intenta primero via UI (right-click
   en el ultimo EventTile → 'Reply in Thread' en context menu → escribir
   en el composer del thread panel). Si el context menu no aparece (modo
   headless), cae al fallback SDK que envia el mensaje con m.relates_to
   correcto. El test de thread ya pasa con el fallback.
2026-03-08 18:33:40 +00:00
egutierrez be2a5f3213 merge: quick/fix-thread-send-pointer — fix m.relates_to en eventos cifrados de thread
Corrige el bug por el que el agente enviaba respuestas de thread sin m.relates_to en el evento m.room.encrypted exterior. mautrix-go usaba getRelatesTo() que requiere pointer receiver, pero se pasaba el content por valor. Element Web no podia detectar la relacion de thread y mostraba la respuesta en la timeline principal.
2026-03-08 18:13:51 +00:00
egutierrez e706438bb7 fix: pasar *MessageEventContent como puntero en SendMarkdown/SendReplyMarkdown/SendThreadMarkdown
El metodo OptionalGetRelatesTo() esta definido con pointer receiver en event.MessageEventContent. Al pasarlo como valor (no puntero) a SendMessageEvent, mautrix-go no puede hacer el cast a event.Relatable, getRelatesTo() retorna nil, y el evento m.room.encrypted exterior queda sin m.relates_to.

Esto causaba que Element Web no viera la relacion de thread en el evento cifrado exterior y mostrara la respuesta del agente en la timeline principal en lugar del thread, incluso cuando el payload descifrado tenia m.relates_to correcto.

Fix: cambiar 'content := event.MessageEventContent{...}' a 'content := &event.MessageEventContent{...}' en los tres metodos de envio. Consistente con el propio uso de mautrix en client.go linea 1161.
2026-03-08 18:13:44 +00:00
egutierrez e17615fe21 merge: issue/0012-threads — thread detection via encrypted event cache
Corrige el bug por el que los agentes respondia en la timeline principal en lugar del thread.

Causa raiz: mautrix-go solo copia m.relates_to al payload descifrado si el evento cifrado exterior incluye EncryptedEventContent.RelatesTo, lo cual versiones antiguas de Element no hacen. Los dos mecanismos de deteccion existentes fallaban en este caso.

Solucion: cache de eventos cifrados en Listener usando un sync.Map. Un listener global (OnEvent) captura m.relates_to del evento m.room.encrypted antes de que CryptoHelper lo descifre. El handler EventMessage lo consulta como tercer fallback con LoadAndDelete.

Ademas: correccion del fixture Playwright startThreadOnLastMessage (usaba getRooms()[0] en lugar del room de la URL actual) y waitForThreadReplyViaSdk (acotado al room de la URL para evitar falsos positivos).
2026-03-08 18:06:27 +00:00
egutierrez 8db65ed062 docs: cerrar issue 0012 — thread detection via encrypted event cache
Marca el issue 0012-threads como completado. El problema de que el agente respondia en el hilo principal en lugar del thread esta resuelto con el cache de eventos cifrados implementado en esta rama.
2026-03-08 18:06:09 +00:00
egutierrez 80014e8fb8 fix(e2e): obtener room ID desde URL en startThreadOnLastMessage y waitForThreadReplyViaSdk
Corrige dos bugs en los fixtures de Playwright:

1. startThreadOnLastMessage usaba client.getRooms()[0] (el primer room unido) en lugar del room activo, causando que el mensaje threaded se enviara al room equivocado. Ahora lee el room ID de window.location.hash (#/room/!xxx:server), con resolucion de alias si la URL contiene un alias en lugar de un ID.

2. waitForThreadReplyViaSdk iteraba todos los rooms unidos, lo que podia devolver falsos positivos de otros rooms. Ahora esta acotado al room de la URL actual, con logica de fallback para aliases canonicos y alternativos.
2026-03-08 18:06:05 +00:00
egutierrez f289729ccf fix: detectar thread en eventos E2EE via cache de eventos cifrados
Añade un tercer mecanismo de deteccion de thread en listener.go para cubrir el caso en que mautrix-go no propaga m.relates_to al payload descifrado.

El problema ocurria cuando Element Web (matrix-js-sdk versiones antiguas) no incluia m.relates_to en el contenido exterior del evento m.room.encrypted. mautrix-go solo copia m.relates_to al payload descifrado si EncryptedEventContent.RelatesTo != nil, por lo que los dos mecanismos existentes (raw map + typed content) fallaban.

La solucion registra un listener global (OnEvent) que captura m.relates_to del evento cifrado ANTES de que CryptoHelper lo descifre y re-despache (los listeners globales se ejecutan antes que los de tipo especifico segun DefaultSyncer.Dispatch). El valor se guarda en un sync.Map keyed por event ID y se consume con LoadAndDelete en el handler EventMessage.
2026-03-08 18:05:58 +00:00
egutierrez 00a7c00020 merge: quick/e2e-utils-refactor — element-utils, SDK thread, locators robustos 2026-03-08 17:33:47 +00:00
egutierrez cfd932205f test: actualizar tests con nuevas utilidades y locators robustos
asistente-2.spec.ts: usa waitForThreadReplyViaSdk en lugar de sendThreadMessage + waitForThreadReply (que dependian del panel UI). Elimina la importacion de sendThreadMessage. Agrega test.setTimeout(120_000) al test de threads para dar tiempo suficiente al ciclo completo.

login.spec.ts: ampliar locators de room tiles con .mx_RoomTile para mayor compatibilidad con Element Web moderno que no siempre usa role=treeitem.

element-auth.ts: ampliar locator de roomsTree con .mx_RoomList, .mx_LeftPanel_roomListContainer, .mx_RoomTile para detectar sesion existente de forma mas robusta, tanto en loginToElement como en waitForLoginResult.
2026-03-08 17:33:44 +00:00
egutierrez 85e79b11fd refactor: reescribir goToRoom y startThreadOnLastMessage en matrix-room.ts
goToRoom: implementa estrategia doble — primero intenta click directo en el sidebar (mas robusto), luego usa Ctrl+K como fallback. Evita el click en el boton Search que a veces es bloqueado por toasts.

startThreadOnLastMessage: en headless Chromium la hover action bar de Element no se renderiza (es React onMouseEnter, no CSS :hover). Ahora usa el Matrix SDK expuesto en window.mxMatrixClientPeg para enviar el mensaje threaded directamente via API, evitando la dependencia del panel UI.

Nueva funcion waitForThreadReplyViaSdk: consulta el timeline del SDK en lugar de depender del panel de thread UI. Busca eventos con m.relates_to.rel_type === 'm.thread' y filtra por sender si se especifica.

Nueva funcion interna waitForRoomLoaded: espera header del room o el composer como fallback, desacoplando la verificacion de la navegacion.
2026-03-08 17:33:37 +00:00
egutierrez c370c189d2 feat: extraer dismissAllToasts a element-utils.ts
Mueve la logica de cierre de toasts a un modulo compartido (element-utils.ts) para evitar duplicacion. persistent-context.ts importa dismissAllToasts desde ahi y la invoca despues de verificar el sidebar. Se mejora tambien la deteccion del sidebar usando multiples locators alternativos (mx_RoomList, mx_LeftPanel_roomListContainer, mx_RoomTile) para mayor compatibilidad con distintas versiones de Element Web.
2026-03-08 17:33:29 +00:00
egutierrez a4f3e77a4f merge: quick/e2e-persistent-context — persistent context E2EE y mejoras de robustez
Migra los tests E2E de storageState a persistent browser context para
preservar IndexedDB (crypto keys E2EE). Añade reintentos de login,
screenshots de debug, logging detallado, y helpers de threads.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:48:06 +00:00
egutierrez 1e896adeaa refactor: migrar tests E2E a persistent context
global-setup.ts:
- Usa launchPersistentContext en vez de browser.newContext()
- Reemplaza storageState por marker file para cache de sesion
- Captura logs de consola del browser para debug
- Screenshots y HTML dump en caso de error

playwright.config.ts:
- Elimina storageState (ahora via persistent context fixture)
- Screenshots siempre activas, video y trace en failures

Tests (login, assistant-bot, asistente-2):
- Importan test/expect desde persistent-context fixture
- Usan handleElementDialogs() en vez de espera manual de rooms
- Nuevo test de threads en asistente-2: verifica que el bot
  responde dentro del thread cuando se le habla por thread

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:47:51 +00:00
egutierrez 947bb70eba feat: mejoras de robustez en fixtures de login y room
element-auth.ts:
- Reintentos con backoff para M_LIMIT_EXCEEDED (max 3 intentos)
- Screenshots de debug en cada paso del login
- Deteccion de sesion activa (skip login si ya logueado)
- Manejo robusto de cross-signing con fallback si no hay Done button
- waitForLoginResult() detecta errores, rate limits y exito

matrix-room.ts:
- Logging detallado en goToRoom, sendMessage, waitForBotReply
- Screenshots automaticas en errores y timeouts
- Dump del timeline en timeout para diagnóstico
- Nuevos helpers: startThreadOnLastMessage, sendThreadMessage,
  waitForThreadReply, assertBotDidNotReplyInMainTimeline

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:47:43 +00:00
egutierrez d4e31ab315 feat: fixture de persistent context para preservar E2EE keys
Nuevo fixture que crea un worker-scoped persistent browser context
compartido entre tests. A diferencia de storageState, preserva IndexedDB
donde Element Web guarda las crypto keys de E2EE.

Incluye handleElementDialogs() que maneja:
- "Element is open in another window" → click Continue
- "Missing session data" → error informativo
- Espera rooms sidebar como señal de sesion cargada

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:47:36 +00:00
egutierrez 02ea5fce4f merge: issue/0023-dashboard-tests — seccion de tests en dashboard TUI
Nueva pantalla Tests en el menu principal del dashboard para ejecutar
Go tests, E2E tests (headless/headed) y todos secuencialmente.
Reemplaza el "Run Tests" del menu Server por navegacion a la nueva pantalla.
2026-03-08 15:44:53 +00:00
egutierrez 76285d4093 docs: cerrar issue 0023 — seccion de tests en dashboard
Mover issue a completed/ y actualizar README.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:44:19 +00:00
egutierrez 1abc1ef509 test: tests unitarios para pantalla de tests del dashboard
Tests para TestMenuOptions, updateTestsScreen (navegacion, seleccion,
generacion de intents), viewTests (render, cursor, last run),
testKindLabel, testKindIntent, y navegacion desde main/server menus.

Issue: 0023

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:43:56 +00:00
egutierrez 509d456275 feat: pantalla de tests en el dashboard TUI
Nueva seccion "Tests" en el menu principal del dashboard que permite
ejecutar Go tests, E2E tests (headless y headed), y todos secuencialmente.

- ScreenTests con menu de seleccion de tipo de test
- TestKind enum para identificar el tipo de test ejecutado
- Nuevos intents: IntentRunGoTests, IntentRunE2ETests, IntentRunE2EHeadTests, IntentRunAllTests
- LastTestKind en Model para re-ejecucion con "r"
- runGoTests, runE2ETests, runAllTests en adapter
- "Run Tests" en Server menu reemplazado por navegacion a ScreenTests
- Test output muestra tipo de test en titulo y vuelve a ScreenTests con "0"

Issue: 0023

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:43:51 +00:00
egutierrez 89acbe02c8 merge: issue/0022c-e2e-agent-tests — tests E2E de agentes y docs
Completa el sistema E2E con Playwright (cierra issue 0022 completo):
- Tests para assistant-bot y asistente-2
- Script run.sh de orquestacion completa
- Documentacion en e2e/README.md
- Seccion E2E en CLAUDE.md
2026-03-08 14:36:30 +00:00
egutierrez ccdfdf579f docs: cerrar issue 0022c y 0022 — E2E tests completos
Cierra 0022c (tests de agentes + docs) y el issue padre 0022
(Tests E2E con Playwright) ya que todos los sub-issues estan completados:
- 0022a: infraestructura base
- 0022b: auth fixtures y helpers
- 0022c: tests de agentes, run.sh, documentacion

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:36:17 +00:00
egutierrez e41f150e69 docs: documentacion E2E y actualizacion de CLAUDE.md
- e2e/README.md: guia completa de instalacion, configuracion,
  ejecucion y debug de tests E2E
- .gitignore: agrega e2e/playwright-report/
- CLAUDE.md: agrega seccion E2E tests y dev-scripts/e2e en estructura

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:35:08 +00:00
egutierrez 2752ce2f6a feat: script de orquestacion E2E run.sh
Completa el placeholder de 0022a con el flujo completo:
1. Verifica agentes corriendo (via ps.sh)
2. Levanta Element Web si no esta activo
3. Ejecuta npx playwright test
4. Genera reporte HTML en caso de fallos
5. Teardown de Element Web
6. Retorna exit code de Playwright

Soporte --headed para debug local con DISPLAY.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:35:03 +00:00
egutierrez 1fd836368f feat: tests E2E para assistant-bot y asistente-2
Tests de cada agente via Element Web + Playwright:
- assistant-bot: saludo DM, pregunta, !help, !ping, E2EE check
- asistente-2: saludo, !tools, tool use (que hora es?), !help, E2EE check

Assertions flexibles para respuestas LLM (no-deterministicas),
estrictas para commands deterministicos (!help, !ping).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:34:57 +00:00
egutierrez aa4ea13bf2 merge: issue/0022b-e2e-auth-helpers — auth fixtures y helpers E2E
Integra fixtures de autenticacion para Element Web (login + cross-signing
con recovery key), helpers de interaccion con rooms Matrix (goToRoom,
sendMessage, waitForBotReply, assertNoDecryptionErrors) y smoke tests
de validacion de sesion E2EE.
2026-03-08 14:20:30 +00:00
egutierrez e4ca5da1f8 docs: cerrar issue 0022b — auth fixtures y helpers E2E
Mover issue a completed/ y actualizar README.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:20:09 +00:00
egutierrez 71d866abde feat: auth fixtures y helpers de interaccion E2E
Implementa el issue 0022b — fixtures de Playwright para
autenticacion en Element Web y helpers de interaccion con rooms.

- element-auth.ts: flujo completo de login + cross-signing con
  recovery key, preparado para cachear sesion via storageState
- global-setup.ts: ejecuta login una vez antes de todos los tests,
  reutiliza sesion cacheada si tiene menos de 12 horas
- matrix-room.ts: helpers goToRoom, sendMessage, waitForBotReply,
  getLastMessage, assertNoDecryptionErrors (detecta "Unable to decrypt")
- login.spec.ts: 3 smoke tests validando sesion, E2EE y navegacion
- playwright.config.ts: configurado storageState para inyectar sesion

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:19:54 +00:00
egutierrez 6540c15ad4 merge: issue/0022a-e2e-infra — infraestructura base E2E con Playwright
Proyecto Node.js en e2e/ con Playwright, setup de Element Web local,
scripts de instalacion y placeholder para ejecucion de tests.
2026-03-08 14:12:15 +00:00
egutierrez d04a309313 feat: infraestructura base para E2E tests con Playwright
Proyecto Node.js independiente en e2e/ con Playwright + Chromium headless.
Incluye setup-element.sh para descargar y servir Element Web localmente
(puerto 8090 por defecto, 8080 ocupado por Docker).
Scripts de instalacion y placeholder para ejecucion de tests.
Cierra issue 0022a.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:11:58 +00:00
egutierrez dfbea6bffb merge: quick/e2e-issues — comando create-issue y issues E2E 0022
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 13:57:41 +00:00
egutierrez 4ab4efd245 docs: crear issue 0022 — tests E2E con Playwright
Issue multi-issue desglosado en 3 sub-issues:
- 0022a: infraestructura base (Docker, Playwright config, CI)
- 0022b: auth fixtures y helpers (login, E2EE, utilidades Matrix)
- 0022c: tests de agentes + documentacion

Incluye actualizacion del README con issue 21 (completado) y todos
los sub-issues de 0022 registrados como pendientes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 13:57:36 +00:00
egutierrez f6d049127d docs: añadir comando /create-issue
Nuevo comando slash que automatiza la creacion de issues en dev/issues/.
Sigue estrictamente la regla create_issue.md, evalua el tamaño del issue
para desglosar en sub-issues con feature flags si es necesario, y registra
todo en el README automaticamente.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 13:57:29 +00:00
egutierrez 216cee7512 merge: quick/fix-thread-response — fix respuesta en thread con E2EE y tool notices 2026-03-08 13:14:42 +00:00
egutierrez 5d3ab834a7 fix: responder en thread cuando el mensaje viene de un thread
Dos problemas corregidos:

1. Detección de threads con E2EE: después de desencriptar un evento,
   evt.Content.Raw puede no contener m.relates_to. Se añade fallback
   usando el contenido tipado (evt.Content.Parsed) que es más robusto
   tras la desencriptación de mautrix.

2. Notificaciones de tools fuera del thread: la notificación "🔨 tool"
   se enviaba con SendMarkdown directo a la sala, ignorando el contexto
   de thread. Ahora usa sendReply que respeta ThreadID.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 13:14:21 +00:00
egutierrez b50f7e40cb merge: quick/quick-branch-support — soporte de ramas quick/ para cambios sin issue 2026-03-08 13:02:27 +00:00
egutierrez 151b02766d feat: soporte de ramas quick/ para cambios sin issue
Añadir tipo de rama quick/<slug> a los comandos /git-branch y /git-push
para cambios pequeños que no están asociados a un issue existente.
Antes, /git-push en master siempre inventaba un número de issue inexistente.
Ahora pregunta al usuario si el cambio tiene issue asociado o no.
No se modifican los flujos de ramas issue/ ni feature flags.
2026-03-08 13:02:23 +00:00
egutierrez eb56d2b622 merge: issue/0021-threads-default-config — habilitar threads en agentes y scaffold 2026-03-08 12:55:59 +00:00
egutierrez 65223e8da2 docs: añadir threads al scaffold y guia de creacion de agentes
Actualiza el template de new-agent.sh para que agentes nuevos se creen
con matrix.threads.enabled: true por defecto. Tambien documenta la
seccion threads en create_agent.md para que la guia de creacion
incluya la configuracion de threads como opcion personalizable.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 12:55:55 +00:00
egutierrez 1852169665 chore: habilitar threads por defecto en todos los agentes
Añade la seccion matrix.threads con enabled: true a los 3 agentes
existentes (assistant-bot, asistente-2, meteorologo). Esto activa
el soporte de threads implementado en issue 0012, permitiendo que
los bots respondan dentro de threads cuando reciben mensajes en uno.
auto_thread queda en false para no cambiar el comportamiento actual.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 12:55:46 +00:00
egutierrez 57779d5d01 merge: issue/0012-threads — soporte de threads de Matrix 2026-03-08 12:51:20 +00:00