70a7a0d46d
Dos cosas en una sesión, en el orden discutido:
(1) Segundo módulo brahman vivo: nakui-core
- crates/modules/nakui/core/Cargo.toml: deps brahman-card,
brahman-sidecar, ulid.
- crates/modules/nakui/core/src/bin/nakui.rs: brahman_card_for_nakui()
construye una Card como Lifecycle::Daemon, Supervision::Restart,
flow.input "command" (json) + flow.output "report" (json). El
cmd_run llama brahman_sidecar::spawn antes de levantar el server
de nakui.
(2) crates/shared/brahman-sidecar (estrena crates/shared/)
Boilerplate del sidecar extraído (DRY): el thread con tokio current
thread runtime, conexión vía Client::connect, ping loop. Yahweh y
nakui ahora consumen este crate. API:
- spawn(card) fire-and-forget
- spawn_with_handle(config) con JoinHandle
Example "presence" útil para demos: módulo dummy con label tomado
del primer arg que se queda vivo hasta SIGTERM.
(3) crates/core/brahman-admin: observabilidad del broker
Socket Unix paralelo en \$BRAHMAN_ADMIN_SOCKET (default
\$XDG_RUNTIME_DIR/brahman-admin.sock). Cada conexión recibe un
StatusSnapshot JSON line-delimited y se cierra. Compatible con nc/socat.
- StatusSnapshot { server, protocol, init_attached, sessions, matches }
- server::AdminServer
- client::query(path)
- example "brahman-status" CLI
(4) Wiring de ente-zero
En primordial_loop, junto al handshake server, ahora también levanta
AdminServer con misma política de degradación grácil.
(5) brahman-broker: BrokeredCard ahora incluye lifecycle. Endpoint y
Match derivan Serialize/Deserialize. Nuevo método cards() expone
iterador de BrokeredCard para que el admin pueda construir snapshots.
(6) brahman-card: re-export pub use ulid::* para que módulos no
necesiten depender de ulid directamente.
(7) yahweh-shell migrado al sidecar compartido. Su brahman_client.rs
pasa de 96 a 53 líneas: sólo declara la Card, delega el spawn.
Demo end-to-end:
$ ente-zero &
$ presence demo.producer &
$ presence demo.consumer &
$ brahman-status
Init: server=0.1.0 protocol=0.1.0 attached=true
Sessions (2):
01KR42TY1J... demo.producer lifecycle=Daemon priority=Normal
01KR42TY1K... demo.consumer lifecycle=Daemon priority=Normal
Matches (2):
demo.producer.in ← demo.consumer.out via Exact
demo.consumer.in ← demo.producer.out via Exact
El broker matchea bidireccional por tipo. El admin lo expone.
Tests: 27/27. cargo check --workspace: 0 errores.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
44 lines
1.1 KiB
TOML
44 lines
1.1 KiB
TOML
[package]
|
|
name = "nakui-core"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
|
|
[features]
|
|
default = []
|
|
# Pulls in surrealdb's pure-Rust SurrealKV backend so SurrealStore can
|
|
# persist to disk across process restarts. Lighter compile cost than
|
|
# RocksDB (which would otherwise pull in a C++ build); opt-in only.
|
|
persistent = ["surrealdb/kv-surrealkv"]
|
|
|
|
[dependencies]
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
rhai = { version = "1.20", features = ["serde"] }
|
|
uuid = { version = "1", features = ["v4", "serde"] }
|
|
thiserror = "1"
|
|
petgraph = "0.6"
|
|
sha2 = "0.10"
|
|
surrealdb = { version = "2", default-features = false, features = ["kv-mem"] }
|
|
tokio = { version = "1", features = ["rt", "macros"] }
|
|
|
|
# Brahman protocol — presencia ante el Init cuando `nakui run` arranca.
|
|
brahman-card = { path = "../../../core/brahman-card" }
|
|
brahman-sidecar = { path = "../../../shared/brahman-sidecar" }
|
|
ulid = { version = "1" }
|
|
|
|
[[bin]]
|
|
name = "nakui"
|
|
path = "src/bin/nakui.rs"
|
|
|
|
[[bin]]
|
|
name = "demo"
|
|
path = "src/bin/demo.rs"
|
|
|
|
[[bin]]
|
|
name = "inventory_demo"
|
|
path = "src/bin/inventory_demo.rs"
|
|
|
|
[[bin]]
|
|
name = "sales_demo"
|
|
path = "src/bin/sales_demo.rs"
|