feat(brahman-handshake): ListSessions endpoint + cliente + UI broker-explorer

Iter 20. Nuevo flujo end-to-end para observabilidad: cualquier módulo
conectado puede pedir al broker la lista de sesiones activas y mostrar
labels + flows in/out por cada una.

brahman-handshake/messages:
- Frame::ListSessions(ListSessions{session}) → Frame::SessionList(SessionList{entries}).
- SessionEntry: session, label, schema_version, outputs, inputs, conscious.

brahman-handshake/server:
- run_post_handshake pasa SessionRegistry a handle_inbound_frame.
- build_session_list helper proyecta el snapshot bajo lock.
- Validación session_id mismatched → Unauthorized.

brahman-handshake/client:
- Client::list_sessions() async, drena MatchEvents intermedios al
  pending_events buffer, mismo patrón que ping().

brahman-sidecar/discovery:
- list_sessions / list_sessions_blocking arman Card observer mínima,
  piden, Farewell.

brahman-broker-explorer:
- Poll-tick agrega list_sessions_blocking cuando broker está UP*.
- stat_card "Sesiones activas" con count + items ordenados por Ulid:
  label · in:[flows] out:[flows]  (wit)?.

Test list_sessions_returns_currently_registered: 3 clientes
conectados, observer pide list, verifica labels + schema_version
+ conscious=false. 24 handshake tests + sidecar + broker-explorer
verde.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sergio
2026-05-10 15:40:33 +00:00
parent 37e40073ef
commit 99cd685dc1
8 changed files with 378 additions and 10 deletions
+50
View File
@@ -6,6 +6,56 @@ ratio/diff ver `git show <sha>`.
## 2026-05-10
### feat(brahman-handshake): ListSessions endpoint + cliente + UI broker-explorer
Iter 20. Nuevo flujo end-to-end para observabilidad: cualquier
módulo conectado puede preguntar al broker la lista de sesiones
activas y mostrar labels + flows in/out por cada una.
`brahman-handshake/messages.rs`:
- **`Frame::ListSessions(ListSessions { session })`**: request del
cliente (server valida que `session` coincida con la sesión vigente,
mismo patrón que Ping/Farewell).
- **`Frame::SessionList(SessionList { entries })`**: respuesta.
Cada `SessionEntry` lleva: `session`, `label`, `schema_version`,
`outputs` (nombres de flow.output), `inputs` (nombres de
flow.input), `conscious` (`true` si la Card vino con WIT).
`brahman-handshake/server.rs`:
- `run_post_handshake` ahora pasa `SessionRegistry` a
`handle_inbound_frame` (necesario para consultar el snapshot de
sesiones en respuesta a `ListSessions`).
- Helper `build_session_list(sessions)` que toma el snapshot bajo
el lock, lo proyecta a `SessionList`, y suelta el lock antes de
escribir el frame al wire.
- Validación `session_id` mismatched → `HandshakeError::Unauthorized`.
`brahman-handshake/client.rs`:
- `Client::list_sessions()` async: envía el request, drena
`MatchEvent`s intermedios al `pending_events` buffer (mismo patrón
que `ping`), retorna el `SessionList`.
`brahman-sidecar/discovery.rs`:
- `pub async fn list_sessions(observer_label)` y
`pub fn list_sessions_blocking(observer_label)`: arman una Card
observer mínima (sin flow.input/output), conectan, piden la lista,
Farewell. Para CLIs y módulos std-thread.
`brahman-broker-explorer`:
- Cada poll-tick (cuando el broker está UP*) ahora también pide
`list_sessions_blocking` y guarda el snapshot en `Explorer.sessions`.
- Render extiende el body con un `stat_card` "Sesiones activas" que
muestra el count + lista ordenada por `session` (Ulid temporal),
cada item: `label · in:[flows] out:[flows] (wit?)`.
Tests:
- `list_sessions_returns_currently_registered`: levanta server con
broker, conecta 3 clientes (alpha, beta, observer), observer pide
`list_sessions`, verifica los 3 labels presentes y que la entry
del observer reporte `conscious=false` y el `schema_version`
esperado.
- Stack: handshake suite (24 tests), sidecar (3+8 unit + integ),
broker-explorer (4 tests). Todo verde.
### feat(yahweh-launcher): F3 — extracción del shell standard de explorers
Iter 19. Patrón con 4 consumers idénticos (nakui-explorer,
nouser-explorer, minga-explorer, brahman-broker-explorer) declaraban