354f992c63
Cierra el ciclo brahman-card-wit ↔ runtime: un módulo que tenga su .wit lo parsea, lo manda en Hello, y aparece como "consciente" en el broker y en brahman-status. Cambios coordinados (un solo commit por la cadena de tipos): - brahman-card::WitInterface deriva Serialize/Deserialize/Eq. - brahman-handshake::Hello lleva wit: Option<WitInterface> (#[serde(default)] para tolerar Hellos antiguos en formato JSON aunque postcard exige presencia explícita). - Server's register_session enruta a ResolvedCard::from_conscious cuando viene wit; from_agnostic cuando no. - Client::connect queda como wrapper de connect_with(path, card, wit: Option<WitInterface>) — backward-compatible. - Broker::register acepta Option<WitInterface> como tercer arg; BrokeredCard guarda el wit. 25 sitios de tests actualizados con `, None` (vía perl). - brahman-sidecar::SidecarConfig.wit + helpers SidecarConfig::with_wit y spawn_conscious(card, wit). Log attached reporta conscious=true|false. - brahman-status pretty-print con 🧠 + sección wit (package/world + imports + exports) por sesión consciente. - Example nuevo presence-conscious: parsea protocol.wit y se presenta consciente. Validación end-to-end manual: $ ente-zero & $ presence-conscious demo.conscious shared_wit/protocol.wit & $ brahman-status Sessions (1): 01K... demo.conscious 🧠 lifecycle=Daemon wit: brahman:protocol@0.1.0 / module imports: types, handshake, lifecycle exports: run Tests: 32/32 (broker 11 + card 8 + handshake codec+transport 2 + integ 7 + admin 0 + card-wit 4). Workspace: 0 errores. CHANGELOG.md actualizado. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
66 lines
2.2 KiB
Rust
66 lines
2.2 KiB
Rust
//! `brahman-status` — CLI para inspeccionar el estado del Init.
|
|
//!
|
|
//! Conecta al socket admin (default `$XDG_RUNTIME_DIR/brahman-admin.sock`,
|
|
//! override con `$BRAHMAN_ADMIN_SOCKET`), recibe el snapshot, y lo imprime.
|
|
|
|
use brahman_admin::{client, transport};
|
|
|
|
#[tokio::main(flavor = "current_thread")]
|
|
async fn main() -> anyhow::Result<()> {
|
|
let path = transport::default_socket_path();
|
|
let snap = client::query(&path).await?;
|
|
|
|
println!(
|
|
"Init: server={} protocol={} attached={}",
|
|
snap.server_version, snap.protocol_version, snap.init_attached
|
|
);
|
|
println!();
|
|
println!("Sessions ({}):", snap.sessions.len());
|
|
if snap.sessions.is_empty() {
|
|
println!(" (ninguna)");
|
|
} else {
|
|
for s in &snap.sessions {
|
|
let conscious_marker = if s.wit.is_some() { " 🧠" } else { "" };
|
|
println!(
|
|
" {} {}{} lifecycle={:?} priority={:?}",
|
|
s.session, s.label, conscious_marker, s.lifecycle, s.priority
|
|
);
|
|
if let Some(wit) = &s.wit {
|
|
println!(" wit: {} / {}", wit.package, wit.world);
|
|
if !wit.imports.is_empty() {
|
|
println!(" imports: {}", wit.imports.join(", "));
|
|
}
|
|
if !wit.exports.is_empty() {
|
|
println!(" exports: {}", wit.exports.join(", "));
|
|
}
|
|
}
|
|
for f in &s.inputs {
|
|
println!(" in {}: {:?}", f.name, f.ty);
|
|
}
|
|
for f in &s.outputs {
|
|
println!(" out {}: {:?}", f.name, f.ty);
|
|
}
|
|
}
|
|
}
|
|
println!();
|
|
println!("Matches ({}):", snap.matches.len());
|
|
if snap.matches.is_empty() {
|
|
println!(" (ninguno)");
|
|
} else {
|
|
for m in &snap.matches {
|
|
let pin_marker = if m.pinned { "📌" } else { " " };
|
|
println!(
|
|
" {} {}.{} ← {}.{} via {:?}",
|
|
pin_marker,
|
|
m.consumer_label,
|
|
m.consumer.flow_name,
|
|
m.producer_label,
|
|
m.producer.flow_name,
|
|
m.via
|
|
);
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|