diff --git a/CHANGELOG.md b/CHANGELOG.md index 156af8c..c986739 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ Histórico particionado el 2026-05-19 por proyecto/intención. Cada archivo bajo `docs/changelog/` consolida las entradas de un subdirectorio del workspace. -- [`akasha`](docs/changelog/akasha.md) — 15 entradas +- [`chasqui`](docs/changelog/chasqui.md) — 15 entradas - [`init`](docs/changelog/init.md) — 1 entradas - [`minga`](docs/changelog/minga.md) — 5 entradas - [`misc`](docs/changelog/misc.md) — 2 entradas diff --git a/Cargo.lock b/Cargo.lock index 88352fe..225933b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -115,97 +115,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "akasha-card" -version = "0.1.0" -dependencies = [ - "brahman-card", - "serde", - "serde_json", - "thiserror 2.0.18", - "ulid", -] - -[[package]] -name = "akasha-core" -version = "0.1.0" -dependencies = [ - "akasha-card", - "akasha-nous", - "blake3", - "brahman-card", - "brahman-handshake", - "brahman-sidecar", - "notify", - "serde", - "serde_json", - "shuma-discern", - "sled", - "tempfile", - "thiserror 2.0.18", - "tokio", - "ulid", - "walkdir", -] - -[[package]] -name = "akasha-explorer" -version = "0.1.0" -dependencies = [ - "akasha-card", - "brahman-card", - "brahman-sidecar", - "gpui", - "nahual-launcher", - "nahual-theme", - "nahual-widget-app-header", - "nahual-widget-banner", - "nahual-widget-card", -] - -[[package]] -name = "akasha-nous" -version = "0.1.0" -dependencies = [ - "serde", - "serde_json", - "thiserror 2.0.18", -] - -[[package]] -name = "akasha-nous-mock" -version = "0.1.0" -dependencies = [ - "akasha-card", - "akasha-core", - "akasha-nous", - "brahman-card", - "brahman-sidecar", - "serde_json", - "tokio", - "tracing", - "tracing-subscriber", - "ulid", -] - -[[package]] -name = "akasha-nous-real" -version = "0.1.0" -dependencies = [ - "akasha-nous", - "brahman-card", - "brahman-sidecar", - "ente-cas", - "fastembed", - "serde_json", - "sled", - "tempfile", - "tokio", - "tracing", - "tracing-subscriber", - "ulid", -] - [[package]] name = "aliasable" version = "0.1.3" @@ -376,6 +285,339 @@ dependencies = [ "password-hash", ] +[[package]] +name = "arje-binfmt-compat" +version = "0.0.1" +dependencies = [ + "anyhow", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "arje-brain" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-card", + "arje-cas", + "base64 0.22.1", + "bincode", + "postcard", + "serde", + "serde_json", + "tokio", + "tracing", + "ulid", +] + +[[package]] +name = "arje-bus" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-card", + "arje-echo", + "postcard", + "serde", + "tokio", + "tracing", + "ulid", +] + +[[package]] +name = "arje-card" +version = "0.0.1" +dependencies = [ + "brahman-card", +] + +[[package]] +name = "arje-cas" +version = "0.0.1" +dependencies = [ + "anyhow", + "sha2", + "tracing", +] + +[[package]] +name = "arje-echo" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-bus", + "arje-card", + "tokio", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "arje-hostnamed-compat" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-bus", + "arje-card", + "libc", + "nix 0.29.0", + "tokio", + "tracing", + "tracing-subscriber", + "zbus 4.4.0", +] + +[[package]] +name = "arje-incarnate" +version = "0.1.0" +dependencies = [ + "anyhow", + "brahman-card", + "libc", + "nix 0.29.0", + "tempfile", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "arje-journald-compat" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-bus", + "arje-card", + "arje-cas", + "libc", + "nix 0.29.0", + "tokio", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "arje-kernel" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-card", + "libc", + "nix 0.29.0", + "tokio", + "tracing", +] + +[[package]] +name = "arje-localed-compat" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-bus", + "arje-card", + "tokio", + "tracing", + "tracing-subscriber", + "zbus 4.4.0", +] + +[[package]] +name = "arje-logind-compat" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-bus", + "arje-card", + "tokio", + "tracing", + "tracing-subscriber", + "zbus 4.4.0", +] + +[[package]] +name = "arje-machined-compat" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-bus", + "arje-card", + "tokio", + "tracing", + "tracing-subscriber", + "zbus 4.4.0", +] + +[[package]] +name = "arje-notify-compat" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-bus", + "arje-card", + "libc", + "nix 0.29.0", + "tokio", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "arje-policy-provider" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-bus", + "arje-card", + "serde", + "serde_json", + "tokio", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "arje-polkit-compat" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-bus", + "arje-card", + "tokio", + "tracing", + "tracing-subscriber", + "zbus 4.4.0", +] + +[[package]] +name = "arje-resolved-compat" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-bus", + "arje-card", + "libc", + "tokio", + "tracing", + "tracing-subscriber", + "zbus 4.4.0", +] + +[[package]] +name = "arje-snapshot" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-card", + "serde", + "serde_json", + "ulid", +] + +[[package]] +name = "arje-soma" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-bus", + "arje-card", + "arje-incarnate", + "nix 0.29.0", + "tracing", +] + +[[package]] +name = "arje-systemd1-compat" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-bus", + "arje-card", + "tokio", + "tracing", + "tracing-subscriber", + "zbus 4.4.0", +] + +[[package]] +name = "arje-timedated-compat" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-bus", + "arje-card", + "tokio", + "tracing", + "tracing-subscriber", + "zbus 4.4.0", +] + +[[package]] +name = "arje-timer-compat" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-bus", + "arje-card", + "serde", + "serde_json", + "tokio", + "tracing", + "tracing-subscriber", + "ulid", +] + +[[package]] +name = "arje-tmpfiles-compat" +version = "0.0.1" +dependencies = [ + "anyhow", + "libc", + "nix 0.29.0", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "arje-wasm" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-card", + "tracing", + "ulid", + "wasmi", + "wat", +] + +[[package]] +name = "arje-zero" +version = "0.0.1" +dependencies = [ + "anyhow", + "arje-brain", + "arje-bus", + "arje-card", + "arje-cas", + "arje-echo", + "arje-kernel", + "arje-snapshot", + "arje-soma", + "arje-wasm", + "brahman-admin", + "brahman-broker", + "brahman-handshake", + "brahman-net", + "libc", + "nix 0.29.0", + "serde", + "serde_json", + "tempfile", + "tokio", + "tracing", + "tracing-subscriber", + "ulid", +] + [[package]] name = "arraydeque" version = "0.5.1" @@ -1438,8 +1680,8 @@ dependencies = [ name = "brahman-cards" version = "0.1.0" dependencies = [ - "akasha-card", "brahman-card", + "chasqui-card", "nahual-meta-schema", "nickel-lang", "serde", @@ -1798,6 +2040,97 @@ dependencies = [ "zeroize", ] +[[package]] +name = "chasqui-card" +version = "0.1.0" +dependencies = [ + "brahman-card", + "serde", + "serde_json", + "thiserror 2.0.18", + "ulid", +] + +[[package]] +name = "chasqui-core" +version = "0.1.0" +dependencies = [ + "blake3", + "brahman-card", + "brahman-handshake", + "brahman-sidecar", + "chasqui-card", + "chasqui-nous", + "notify", + "serde", + "serde_json", + "shuma-discern", + "sled", + "tempfile", + "thiserror 2.0.18", + "tokio", + "ulid", + "walkdir", +] + +[[package]] +name = "chasqui-explorer" +version = "0.1.0" +dependencies = [ + "brahman-card", + "brahman-sidecar", + "chasqui-card", + "gpui", + "nahual-launcher", + "nahual-theme", + "nahual-widget-app-header", + "nahual-widget-banner", + "nahual-widget-card", +] + +[[package]] +name = "chasqui-nous" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "chasqui-nous-mock" +version = "0.1.0" +dependencies = [ + "brahman-card", + "brahman-sidecar", + "chasqui-card", + "chasqui-core", + "chasqui-nous", + "serde_json", + "tokio", + "tracing", + "tracing-subscriber", + "ulid", +] + +[[package]] +name = "chasqui-nous-real" +version = "0.1.0" +dependencies = [ + "arje-cas", + "brahman-card", + "brahman-sidecar", + "chasqui-nous", + "fastembed", + "serde_json", + "sled", + "tempfile", + "tokio", + "tracing", + "tracing-subscriber", + "ulid", +] + [[package]] name = "chrono" version = "0.4.44" @@ -3160,339 +3493,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" -[[package]] -name = "ente-binfmt-compat" -version = "0.0.1" -dependencies = [ - "anyhow", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "ente-brain" -version = "0.0.1" -dependencies = [ - "anyhow", - "base64 0.22.1", - "bincode", - "ente-card", - "ente-cas", - "postcard", - "serde", - "serde_json", - "tokio", - "tracing", - "ulid", -] - -[[package]] -name = "ente-bus" -version = "0.0.1" -dependencies = [ - "anyhow", - "ente-card", - "ente-echo", - "postcard", - "serde", - "tokio", - "tracing", - "ulid", -] - -[[package]] -name = "ente-card" -version = "0.0.1" -dependencies = [ - "brahman-card", -] - -[[package]] -name = "ente-cas" -version = "0.0.1" -dependencies = [ - "anyhow", - "sha2", - "tracing", -] - -[[package]] -name = "ente-echo" -version = "0.0.1" -dependencies = [ - "anyhow", - "ente-bus", - "ente-card", - "tokio", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "ente-hostnamed-compat" -version = "0.0.1" -dependencies = [ - "anyhow", - "ente-bus", - "ente-card", - "libc", - "nix 0.29.0", - "tokio", - "tracing", - "tracing-subscriber", - "zbus 4.4.0", -] - -[[package]] -name = "ente-incarnate" -version = "0.1.0" -dependencies = [ - "anyhow", - "brahman-card", - "libc", - "nix 0.29.0", - "tempfile", - "thiserror 2.0.18", - "tracing", -] - -[[package]] -name = "ente-journald-compat" -version = "0.0.1" -dependencies = [ - "anyhow", - "ente-bus", - "ente-card", - "ente-cas", - "libc", - "nix 0.29.0", - "tokio", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "ente-kernel" -version = "0.0.1" -dependencies = [ - "anyhow", - "ente-card", - "libc", - "nix 0.29.0", - "tokio", - "tracing", -] - -[[package]] -name = "ente-localed-compat" -version = "0.0.1" -dependencies = [ - "anyhow", - "ente-bus", - "ente-card", - "tokio", - "tracing", - "tracing-subscriber", - "zbus 4.4.0", -] - -[[package]] -name = "ente-logind-compat" -version = "0.0.1" -dependencies = [ - "anyhow", - "ente-bus", - "ente-card", - "tokio", - "tracing", - "tracing-subscriber", - "zbus 4.4.0", -] - -[[package]] -name = "ente-machined-compat" -version = "0.0.1" -dependencies = [ - "anyhow", - "ente-bus", - "ente-card", - "tokio", - "tracing", - "tracing-subscriber", - "zbus 4.4.0", -] - -[[package]] -name = "ente-notify-compat" -version = "0.0.1" -dependencies = [ - "anyhow", - "ente-bus", - "ente-card", - "libc", - "nix 0.29.0", - "tokio", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "ente-policy-provider" -version = "0.0.1" -dependencies = [ - "anyhow", - "ente-bus", - "ente-card", - "serde", - "serde_json", - "tokio", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "ente-polkit-compat" -version = "0.0.1" -dependencies = [ - "anyhow", - "ente-bus", - "ente-card", - "tokio", - "tracing", - "tracing-subscriber", - "zbus 4.4.0", -] - -[[package]] -name = "ente-resolved-compat" -version = "0.0.1" -dependencies = [ - "anyhow", - "ente-bus", - "ente-card", - "libc", - "tokio", - "tracing", - "tracing-subscriber", - "zbus 4.4.0", -] - -[[package]] -name = "ente-snapshot" -version = "0.0.1" -dependencies = [ - "anyhow", - "ente-card", - "serde", - "serde_json", - "ulid", -] - -[[package]] -name = "ente-soma" -version = "0.0.1" -dependencies = [ - "anyhow", - "ente-bus", - "ente-card", - "ente-incarnate", - "nix 0.29.0", - "tracing", -] - -[[package]] -name = "ente-systemd1-compat" -version = "0.0.1" -dependencies = [ - "anyhow", - "ente-bus", - "ente-card", - "tokio", - "tracing", - "tracing-subscriber", - "zbus 4.4.0", -] - -[[package]] -name = "ente-timedated-compat" -version = "0.0.1" -dependencies = [ - "anyhow", - "ente-bus", - "ente-card", - "tokio", - "tracing", - "tracing-subscriber", - "zbus 4.4.0", -] - -[[package]] -name = "ente-timer-compat" -version = "0.0.1" -dependencies = [ - "anyhow", - "ente-bus", - "ente-card", - "serde", - "serde_json", - "tokio", - "tracing", - "tracing-subscriber", - "ulid", -] - -[[package]] -name = "ente-tmpfiles-compat" -version = "0.0.1" -dependencies = [ - "anyhow", - "libc", - "nix 0.29.0", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "ente-wasm" -version = "0.0.1" -dependencies = [ - "anyhow", - "ente-card", - "tracing", - "ulid", - "wasmi", - "wat", -] - -[[package]] -name = "ente-zero" -version = "0.0.1" -dependencies = [ - "anyhow", - "brahman-admin", - "brahman-broker", - "brahman-handshake", - "brahman-net", - "ente-brain", - "ente-bus", - "ente-card", - "ente-cas", - "ente-echo", - "ente-kernel", - "ente-snapshot", - "ente-soma", - "ente-wasm", - "libc", - "nix 0.29.0", - "serde", - "serde_json", - "tempfile", - "tokio", - "tracing", - "tracing-subscriber", - "ulid", -] - [[package]] name = "enum-as-inner" version = "0.6.1" @@ -3747,6 +3747,24 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" +[[package]] +name = "fana-md" +version = "0.1.0" +dependencies = [ + "pulldown-cmark", +] + +[[package]] +name = "fana-md-reader-web" +version = "0.1.0" +dependencies = [ + "fana-md", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "fastembed" version = "4.9.1" @@ -4390,10 +4408,10 @@ name = "gioser-web" version = "0.1.0" dependencies = [ "barra-web", + "fana-md-reader-web", "gioser-canvas-web", "js-sys", - "pluma-reader-web", - "vista-web", + "revista-web", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -8624,24 +8642,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" -[[package]] -name = "pluma-md" -version = "0.1.0" -dependencies = [ - "pulldown-cmark", -] - -[[package]] -name = "pluma-reader-web" -version = "0.1.0" -dependencies = [ - "js-sys", - "pluma-md", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - [[package]] name = "png" version = "0.17.16" @@ -9550,6 +9550,20 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "revista-core" +version = "0.1.0" + +[[package]] +name = "revista-web" +version = "0.1.0" +dependencies = [ + "js-sys", + "revista-core", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "rgb" version = "0.8.53" @@ -10512,8 +10526,8 @@ name = "shuma-core" version = "0.1.0" dependencies = [ "anyhow", + "arje-incarnate", "brahman-card", - "ente-incarnate", "libc", "nix 0.29.0", "serde", @@ -10532,9 +10546,9 @@ name = "shuma-daemon" version = "0.1.0" dependencies = [ "anyhow", + "arje-incarnate", "brahman-card", "brahman-sidecar", - "ente-incarnate", "libc", "nix 0.29.0", "shuma-card", @@ -12530,20 +12544,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "vista-core" -version = "0.1.0" - -[[package]] -name = "vista-web" -version = "0.1.0" -dependencies = [ - "js-sys", - "vista-core", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "vswhom" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 73ffac3..5fa01bf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,43 +12,43 @@ members = [ "crates/protocol/brahman-admin", "crates/protocol/brahman-sidecar", "crates/protocol/brahman-net", - "crates/protocol/ente-card", + "crates/protocol/arje-card", # ============================================================ # init/ — PID 1 + encarnación Linux (arje) # ============================================================ - "crates/init/ente-zero", - "crates/init/ente-kernel", - "crates/init/ente-soma", - "crates/init/ente-snapshot", - "crates/init/ente-incarnate", + "crates/init/arje-zero", + "crates/init/arje-kernel", + "crates/init/arje-soma", + "crates/init/arje-snapshot", + "crates/init/arje-incarnate", # ============================================================ # runtime/ — Infraestructura de ejecución (bus + cas + wasm + brain) # ============================================================ - "crates/runtime/ente-bus", - "crates/runtime/ente-cas", - "crates/runtime/ente-wasm", - "crates/runtime/ente-brain", - "crates/runtime/ente-echo", + "crates/runtime/arje-bus", + "crates/runtime/arje-cas", + "crates/runtime/arje-wasm", + "crates/runtime/arje-brain", + "crates/runtime/arje-echo", # ============================================================ # compat/ — Shims D-Bus para correr software systemd-aware # ============================================================ - "crates/compat/ente-policy-provider", - "crates/compat/ente-logind-compat", - "crates/compat/ente-hostnamed-compat", - "crates/compat/ente-timedated-compat", - "crates/compat/ente-localed-compat", - "crates/compat/ente-journald-compat", - "crates/compat/ente-resolved-compat", - "crates/compat/ente-polkit-compat", - "crates/compat/ente-machined-compat", - "crates/compat/ente-tmpfiles-compat", - "crates/compat/ente-systemd1-compat", - "crates/compat/ente-notify-compat", - "crates/compat/ente-binfmt-compat", - "crates/compat/ente-timer-compat", + "crates/compat/arje-policy-provider", + "crates/compat/arje-logind-compat", + "crates/compat/arje-hostnamed-compat", + "crates/compat/arje-timedated-compat", + "crates/compat/arje-localed-compat", + "crates/compat/arje-journald-compat", + "crates/compat/arje-resolved-compat", + "crates/compat/arje-polkit-compat", + "crates/compat/arje-machined-compat", + "crates/compat/arje-tmpfiles-compat", + "crates/compat/arje-systemd1-compat", + "crates/compat/arje-notify-compat", + "crates/compat/arje-binfmt-compat", + "crates/compat/arje-timer-compat", # ============================================================ # modules/semantic_dht/ (minga) — DHT semántico de código @@ -106,13 +106,13 @@ members = [ "crates/modules/nakui/core", # ============================================================ - # modules/akasha/ — Explorador semántico de Mónadas (era nouser) + # modules/chasqui/ — Explorador semántico de nómadas (ex-nouser, ex-akasha) # ============================================================ - "crates/modules/akasha/card", - "crates/modules/akasha/core", - "crates/modules/akasha/nous", - "crates/modules/akasha/nous-mock", - "crates/modules/akasha/nous-real", + "crates/modules/chasqui/card", + "crates/modules/chasqui/core", + "crates/modules/chasqui/nous", + "crates/modules/chasqui/nous-mock", + "crates/modules/chasqui/nous-real", # ============================================================ # modules/shuma/ — Runtime de espacios aislados (era shipote) @@ -132,16 +132,16 @@ members = [ "crates/modules/gioser/gioser-canvas-web", # ============================================================ - # modules/pluma/ — Markdown agnóstico + visor web + # modules/fana/ — Writer DAG editor (absorbe pluma) # ============================================================ - "crates/modules/pluma/pluma-md", - "crates/modules/pluma/pluma-reader-web", + "crates/modules/fana/fana-md", + "crates/modules/fana/fana-md-reader-web", # ============================================================ - # modules/vista/ — Deck horizontal swipe (Flutter PageView) + # modules/revista/ — Deck horizontal swipe (Flutter PageView) # ============================================================ - "crates/modules/vista/vista-core", - "crates/modules/vista/vista-web", + "crates/modules/revista/revista-core", + "crates/modules/revista/revista-web", # ============================================================ # modules/barra/ — Taskbar agnóstica estilo Windows @@ -174,7 +174,7 @@ members = [ "crates/apps/nahual-database-explorer", "crates/apps/nahual-text-viewer", "crates/apps/nahual-image-viewer", - "crates/apps/akasha-explorer", + "crates/apps/chasqui-explorer", "crates/apps/nakui-explorer", "crates/apps/nakui-ui", "crates/apps/minga-explorer", diff --git a/crates/apps/akasha-explorer/Cargo.toml b/crates/apps/chasqui-explorer/Cargo.toml similarity index 87% rename from crates/apps/akasha-explorer/Cargo.toml rename to crates/apps/chasqui-explorer/Cargo.toml index 3fe5ce1..8595008 100644 --- a/crates/apps/akasha-explorer/Cargo.toml +++ b/crates/apps/chasqui-explorer/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "akasha-explorer" +name = "chasqui-explorer" version.workspace = true edition.workspace = true license.workspace = true @@ -8,7 +8,7 @@ description = "Explorador GPUI de Mónadas: panel que descubre al daemon nouser [dependencies] brahman-card = { path = "../../protocol/brahman-card" } brahman-sidecar = { path = "../../protocol/brahman-sidecar" } -akasha-card = { path = "../../modules/akasha/card" } +chasqui-card = { path = "../../modules/chasqui/card" } nahual-theme = { path = "../../modules/nahual/libs/theme" } nahual-launcher = { path = "../../modules/nahual/libs/launcher" } nahual-widget-banner = { path = "../../modules/nahual/widgets/banner" } @@ -17,5 +17,5 @@ nahual-widget-app-header = { path = "../../modules/nahual/widgets/app-header" } gpui = { workspace = true } [[bin]] -name = "akasha-explorer" +name = "chasqui-explorer" path = "src/main.rs" diff --git a/crates/apps/akasha-explorer/src/main.rs b/crates/apps/chasqui-explorer/src/main.rs similarity index 95% rename from crates/apps/akasha-explorer/src/main.rs rename to crates/apps/chasqui-explorer/src/main.rs index e9db07c..327f2aa 100644 --- a/crates/apps/akasha-explorer/src/main.rs +++ b/crates/apps/chasqui-explorer/src/main.rs @@ -1,8 +1,8 @@ -//! `akasha-explorer` — panel GPUI que descubre al daemon `akasha` +//! `chasqui-explorer` — panel GPUI que descubre al daemon `chasqui` //! vía broker brahman y muestra sus Mónadas en vivo. //! //! Diseño: ventana standalone que cada N segundos consulta el query -//! socket del daemon (`akasha_core::engine_socket::client::list_monads`). +//! socket del daemon (`chasqui_core::engine_socket::client::list_monads`). //! El path del socket NO está hardcoded — se descubre vía //! `brahman_sidecar::await_provider_blocking` para el flow //! `monad-list:json`. Si el daemon cae, el socket cacheado se invalida @@ -13,9 +13,9 @@ //! //! Uso: //! ```sh -//! cargo run -p akasha-explorer +//! cargo run -p chasqui-explorer //! # con override del init socket (heredado de brahman-handshake): -//! BRAHMAN_INIT_SOCKET=/tmp/init.sock cargo run -p akasha-explorer +//! BRAHMAN_INIT_SOCKET=/tmp/init.sock cargo run -p chasqui-explorer //! ``` use std::path::PathBuf; @@ -25,9 +25,9 @@ use brahman_sidecar::{await_provider_blocking, build_consumer_card, ConsumerErro use gpui::{ div, prelude::*, px, rgb, Context, IntoElement, Render, SharedString, Window, }; -use akasha_card::query::client as query_client; -use akasha_card::query::{transport, ListMonadsResponse, FLOW_MONAD_LIST, FLOW_TYPE_NAME}; -use akasha_card::Lens; +use chasqui_card::query::client as query_client; +use chasqui_card::query::{transport, ListMonadsResponse, FLOW_MONAD_LIST, FLOW_TYPE_NAME}; +use chasqui_card::Lens; use nahual_launcher::launch_app; use nahual_theme::Theme; use nahual_widget_app_header::app_header; @@ -176,7 +176,7 @@ fn resolve_socket() -> Result<(PathBuf, &'static str), String> { /// Card con `flow.input = monad-list:json`, espera al primer /// `MatchEvent::Available`, devuelve el `producer_service_socket`. fn discover_via_broker() -> Result { - let card = build_consumer_card("akasha-explorer", FLOW_MONAD_LIST, FLOW_TYPE_NAME); + let card = build_consumer_card("chasqui-explorer", FLOW_MONAD_LIST, FLOW_TYPE_NAME); await_provider_blocking(card, DISCOVERY_TIMEOUT) } @@ -184,7 +184,7 @@ impl Render for Explorer { fn render(&mut self, _w: &mut Window, cx: &mut Context) -> impl IntoElement { // Chrome viene del Theme global; los acentos por kind // (engine cyan, data purple) son señales semánticas del - // dominio akasha y se mantienen locales. + // dominio chasqui y se mantienen locales. let theme = Theme::global(cx).clone(); let bg = theme.bg_app.clone(); let text = theme.fg_text; @@ -205,7 +205,7 @@ impl Render for Explorer { .map(|w| format!(" · watching: {}", w)) .unwrap_or_default() ), - _ => "Buscando daemon akasha vía brahman-broker…".to_string(), + _ => "Buscando daemon chasqui vía brahman-broker…".to_string(), }; // Header standard via widget compartido. diff --git a/crates/apps/gioser-web/Cargo.toml b/crates/apps/gioser-web/Cargo.toml index 3fcd66f..c9d0cf6 100644 --- a/crates/apps/gioser-web/Cargo.toml +++ b/crates/apps/gioser-web/Cargo.toml @@ -11,8 +11,8 @@ crate-type = ["cdylib", "rlib"] [dependencies] gioser-canvas-web = { path = "../../modules/gioser/gioser-canvas-web" } -pluma-reader-web = { path = "../../modules/pluma/pluma-reader-web" } -vista-web = { path = "../../modules/vista/vista-web" } +fana-md-reader-web = { path = "../../modules/fana/fana-md-reader-web" } +revista-web = { path = "../../modules/revista/revista-web" } barra-web = { path = "../../modules/barra/barra-web" } wasm-bindgen.workspace = true wasm-bindgen-futures.workspace = true diff --git a/crates/apps/gioser-web/src/lib.rs b/crates/apps/gioser-web/src/lib.rs index 03af2fb..9a22053 100644 --- a/crates/apps/gioser-web/src/lib.rs +++ b/crates/apps/gioser-web/src/lib.rs @@ -21,8 +21,8 @@ use std::rc::Rc; use barra_web::{Task, TaskList}; use gioser_canvas_web::{tips, Renderer}; -use pluma_reader_web::Reader; -use vista_web::Deck; +use fana_md_reader_web::Reader; +use revista_web::Deck; use wasm_bindgen::prelude::*; use wasm_bindgen::JsCast; use web_sys::{ diff --git a/crates/apps/minga-explorer/src/main.rs b/crates/apps/minga-explorer/src/main.rs index 2af1a92..97c4eb1 100644 --- a/crates/apps/minga-explorer/src/main.rs +++ b/crates/apps/minga-explorer/src/main.rs @@ -14,7 +14,7 @@ //! //! Stack visual: nahual-theme + banner_themed + card_themed + //! theme_switcher. Mismo patrón que `nakui-explorer` / -//! `akasha-explorer`. +//! `chasqui-explorer`. //! //! Uso: //! ```sh diff --git a/crates/apps/nakui-explorer/src/main.rs b/crates/apps/nakui-explorer/src/main.rs index 479a20a..6cd1e5f 100644 --- a/crates/apps/nakui-explorer/src/main.rs +++ b/crates/apps/nakui-explorer/src/main.rs @@ -10,7 +10,7 @@ //! producción que va escribiendo). Sin discovery dinámico vía broker //! brahman porque nakui hoy es CLI/library/demos, no daemon — cuando //! se daemonice, sustituir el lector de archivo por un sidecar -//! consumer (mismo patrón que `akasha-explorer`). +//! consumer (mismo patrón que `chasqui-explorer`). //! //! ## Uso //! diff --git a/crates/apps/shuma-daemon/Cargo.toml b/crates/apps/shuma-daemon/Cargo.toml index e1f0143..f7bfdc2 100644 --- a/crates/apps/shuma-daemon/Cargo.toml +++ b/crates/apps/shuma-daemon/Cargo.toml @@ -17,7 +17,7 @@ shuma-card = { path = "../../modules/shuma/shuma-card" } shuma-protocol = { path = "../../modules/shuma/shuma-protocol" } shuma-discern = { path = "../../modules/shuma/shuma-discern" } shuma-core = { path = "../../modules/shuma/shuma-core" } -ente-incarnate = { path = "../../init/ente-incarnate" } +arje-incarnate = { path = "../../init/arje-incarnate" } brahman-card = { path = "../../protocol/brahman-card" } brahman-sidecar = { path = "../../protocol/brahman-sidecar" } anyhow = { workspace = true } diff --git a/crates/apps/shuma-daemon/src/main.rs b/crates/apps/shuma-daemon/src/main.rs index 76d4a62..81c7042 100644 --- a/crates/apps/shuma-daemon/src/main.rs +++ b/crates/apps/shuma-daemon/src/main.rs @@ -12,7 +12,7 @@ use anyhow::Context; use brahman_card::{Card, CardKind, Flow, Flows, Lifecycle, Payload, Supervision, TypeRef}; -use ente_incarnate::IncarnatorConfig; +use arje_incarnate::IncarnatorConfig; use shuma_core::WorkspaceManager; use shuma_discern::{DiscernPipeline, Hint}; use shuma_protocol::{ diff --git a/crates/compat/SDD.md b/crates/compat/SDD.md index 1363b23..95ddd1f 100644 --- a/crates/compat/SDD.md +++ b/crates/compat/SDD.md @@ -1,7 +1,7 @@ # compat/ — Shims D-Bus systemd **Propósito.** Permitir que software systemd-aware (GNOME, KDE, -PolicyKit, NetworkManager, etc.) corra sobre `ente-zero` sin systemd. +PolicyKit, NetworkManager, etc.) corra sobre `arje-zero` sin systemd. Cada shim es un binario standalone que se anuncia con un nombre well-known D-Bus y traduce las llamadas al bus interno. @@ -9,24 +9,24 @@ well-known D-Bus y traduce las llamadas al bus interno. | binario | reemplaza | D-Bus name | | --------------------------- | --------------------- | ----------------------------------- | -| `ente-logind-compat` | systemd-logind | `org.freedesktop.login1` | -| `ente-hostnamed-compat` | systemd-hostnamed | `org.freedesktop.hostname1` | -| `ente-timedated-compat` | systemd-timedated | `org.freedesktop.timedate1` | -| `ente-localed-compat` | systemd-localed | `org.freedesktop.locale1` | -| `ente-journald-compat` | systemd-journald | `org.freedesktop.LogControl1` | -| `ente-resolved-compat` | systemd-resolved | `org.freedesktop.resolve1` | -| `ente-polkit-compat` | polkitd | `org.freedesktop.PolicyKit1` | -| `ente-machined-compat` | systemd-machined | `org.freedesktop.machine1` | -| `ente-systemd1-compat` | systemd Manager | `org.freedesktop.systemd1` | -| `ente-notify-compat` | sd_notify socket | `/run/systemd/notify` (datagram) | -| `ente-timer-compat` | systemd timers | (cron-like, sin D-Bus) | -| `ente-tmpfiles-compat` | systemd-tmpfiles | (aplica tmpfiles.d al boot) | -| `ente-binfmt-compat` | systemd-binfmt | (registra handlers binfmt_misc) | -| `ente-policy-provider` | (interno) | provider de decisiones polkit | +| `arje-logind-compat` | systemd-logind | `org.freedesktop.login1` | +| `arje-hostnamed-compat` | systemd-hostnamed | `org.freedesktop.hostname1` | +| `arje-timedated-compat` | systemd-timedated | `org.freedesktop.timedate1` | +| `arje-localed-compat` | systemd-localed | `org.freedesktop.locale1` | +| `arje-journald-compat` | systemd-journald | `org.freedesktop.LogControl1` | +| `arje-resolved-compat` | systemd-resolved | `org.freedesktop.resolve1` | +| `arje-polkit-compat` | polkitd | `org.freedesktop.PolicyKit1` | +| `arje-machined-compat` | systemd-machined | `org.freedesktop.machine1` | +| `arje-systemd1-compat` | systemd Manager | `org.freedesktop.systemd1` | +| `arje-notify-compat` | sd_notify socket | `/run/systemd/notify` (datagram) | +| `arje-timer-compat` | systemd timers | (cron-like, sin D-Bus) | +| `arje-tmpfiles-compat` | systemd-tmpfiles | (aplica tmpfiles.d al boot) | +| `arje-binfmt-compat` | systemd-binfmt | (registra handlers binfmt_misc) | +| `arje-policy-provider` | (interno) | provider de decisiones polkit | ## Dependencias -- Todos ← `zbus`, `ente-bus`, `protocol/brahman-card`. Sin tests +- Todos ← `zbus`, `arje-bus`, `protocol/brahman-card`. Sin tests (esperado: stubs D-Bus que delegan al bus interno). ## Patrón común @@ -35,7 +35,7 @@ Cada shim: 1. Se conecta a `/run/brahman/bus`. 2. Reclama un well-known name vía zbus. 3. Implementa los métodos de la interfaz mínima usada por el ecosistema. -4. Loggea eventos al audit log de `ente-brain`. +4. Loggea eventos al audit log de `arje-brain`. ## Estado diff --git a/crates/compat/ente-binfmt-compat/Cargo.toml b/crates/compat/arje-binfmt-compat/Cargo.toml similarity index 81% rename from crates/compat/ente-binfmt-compat/Cargo.toml rename to crates/compat/arje-binfmt-compat/Cargo.toml index f972677..df8e102 100644 --- a/crates/compat/ente-binfmt-compat/Cargo.toml +++ b/crates/compat/arje-binfmt-compat/Cargo.toml @@ -1,12 +1,12 @@ [package] -name = "ente-binfmt-compat" +name = "arje-binfmt-compat" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [[bin]] -name = "ente-binfmt-compat" +name = "arje-binfmt-compat" path = "src/main.rs" [dependencies] diff --git a/crates/compat/ente-binfmt-compat/src/main.rs b/crates/compat/arje-binfmt-compat/src/main.rs similarity index 98% rename from crates/compat/ente-binfmt-compat/src/main.rs rename to crates/compat/arje-binfmt-compat/src/main.rs index 9789d5c..18f64ec 100644 --- a/crates/compat/ente-binfmt-compat/src/main.rs +++ b/crates/compat/arje-binfmt-compat/src/main.rs @@ -104,6 +104,6 @@ fn register(line: &str) -> Result { fn init_tracing() { let filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("ente_binfmt_compat=info")); + .unwrap_or_else(|_| EnvFilter::new("arje_binfmt_compat=info")); tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init(); } diff --git a/crates/compat/ente-hostnamed-compat/Cargo.toml b/crates/compat/arje-hostnamed-compat/Cargo.toml similarity index 72% rename from crates/compat/ente-hostnamed-compat/Cargo.toml rename to crates/compat/arje-hostnamed-compat/Cargo.toml index c8545e2..5f6ac90 100644 --- a/crates/compat/ente-hostnamed-compat/Cargo.toml +++ b/crates/compat/arje-hostnamed-compat/Cargo.toml @@ -1,17 +1,17 @@ [package] -name = "ente-hostnamed-compat" +name = "arje-hostnamed-compat" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [[bin]] -name = "ente-hostnamed-compat" +name = "arje-hostnamed-compat" path = "src/main.rs" [dependencies] -ente-card = { path = "../../protocol/ente-card" } -ente-bus = { path = "../../runtime/ente-bus" } +arje-card = { path = "../../protocol/arje-card" } +arje-bus = { path = "../../runtime/arje-bus" } nix = { workspace = true } libc = { workspace = true } anyhow = { workspace = true } diff --git a/crates/compat/ente-hostnamed-compat/src/main.rs b/crates/compat/arje-hostnamed-compat/src/main.rs similarity index 98% rename from crates/compat/ente-hostnamed-compat/src/main.rs rename to crates/compat/arje-hostnamed-compat/src/main.rs index 54d861a..738aa1a 100644 --- a/crates/compat/ente-hostnamed-compat/src/main.rs +++ b/crates/compat/arje-hostnamed-compat/src/main.rs @@ -8,8 +8,8 @@ //! Set* methods: log + forward al bus interno (no aplicamos cambios reales //! en el stub — un siguiente paso es persistir a /etc/* y rehash). -use ente_bus::{BusClient, BusRequest, BusResponse}; -use ente_card::Capability; +use arje_bus::{BusClient, BusRequest, BusResponse}; +use arje_card::Capability; use std::sync::Mutex; use tokio::signal::unix::{signal, SignalKind}; use tracing::{info, warn}; @@ -311,7 +311,7 @@ async fn announce_to_fractal() { if let Ok(mut client) = BusClient::from_env().await { let req = BusRequest::Announce { capabilities: vec![Capability::Endpoint { - interface: ente_card::InterfaceId([0xa0; 16]), + interface: arje_card::InterfaceId([0xa0; 16]), version: 1, }], }; @@ -335,6 +335,6 @@ async fn wait_for_term() -> anyhow::Result<()> { fn init_tracing() { let filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("ente_hostnamed_compat=info")); + .unwrap_or_else(|_| EnvFilter::new("arje_hostnamed_compat=info")); tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init(); } diff --git a/crates/compat/ente-journald-compat/Cargo.toml b/crates/compat/arje-journald-compat/Cargo.toml similarity index 61% rename from crates/compat/ente-journald-compat/Cargo.toml rename to crates/compat/arje-journald-compat/Cargo.toml index b766b6c..bae99e5 100644 --- a/crates/compat/ente-journald-compat/Cargo.toml +++ b/crates/compat/arje-journald-compat/Cargo.toml @@ -1,22 +1,22 @@ [package] -name = "ente-journald-compat" +name = "arje-journald-compat" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [[bin]] -name = "ente-journald-compat" +name = "arje-journald-compat" path = "src/main.rs" [[bin]] -name = "ente-journalctl" +name = "arje-journalctl" path = "src/journalctl.rs" [dependencies] -ente-card = { path = "../../protocol/ente-card" } -ente-bus = { path = "../../runtime/ente-bus" } -ente-cas = { path = "../../runtime/ente-cas" } +arje-card = { path = "../../protocol/arje-card" } +arje-bus = { path = "../../runtime/arje-bus" } +arje-cas = { path = "../../runtime/arje-cas" } nix = { workspace = true } libc = { workspace = true } anyhow = { workspace = true } diff --git a/crates/compat/ente-journald-compat/src/journalctl.rs b/crates/compat/arje-journald-compat/src/journalctl.rs similarity index 99% rename from crates/compat/ente-journald-compat/src/journalctl.rs rename to crates/compat/arje-journald-compat/src/journalctl.rs index 8164bea..5f10786 100644 --- a/crates/compat/ente-journald-compat/src/journalctl.rs +++ b/crates/compat/arje-journald-compat/src/journalctl.rs @@ -155,7 +155,7 @@ fn main() -> anyhow::Result<()> { let mut out: Vec<(IndexEntry, String)> = entries.into_iter() .filter_map(|e| { let sha = parse_sha(&e.sha_hex)?; - let bytes = ente_cas::resolve(&sha).ok()?; + let bytes = arje_cas::resolve(&sha).ok()?; let body = String::from_utf8_lossy(&bytes).into_owned(); Some((e, body)) }) diff --git a/crates/compat/ente-journald-compat/src/main.rs b/crates/compat/arje-journald-compat/src/main.rs similarity index 96% rename from crates/compat/ente-journald-compat/src/main.rs rename to crates/compat/arje-journald-compat/src/main.rs index 620cfd2..75ef2f7 100644 --- a/crates/compat/ente-journald-compat/src/main.rs +++ b/crates/compat/arje-journald-compat/src/main.rs @@ -7,8 +7,8 @@ //! Para una implementación real: persistir a CAS por timestamp+sha, //! exponer query API, indexar por unidad/usuario. -use ente_bus::{BusClient, BusRequest, BusResponse}; -use ente_card::Capability; +use arje_bus::{BusClient, BusRequest, BusResponse}; +use arje_card::Capability; use std::os::fd::{AsRawFd, OwnedFd}; use std::path::{Path, PathBuf}; use std::sync::Mutex; @@ -127,13 +127,13 @@ fn now_ms() -> u128 { /// `:::`. Errores se logean pero /// no abortan — perder un mensaje no debe romper journald. fn persist_to_cas(buf: &[u8], source: &'static str, unit: Option<&str>) { - let sha = match ente_cas::store(buf) { + let sha = match arje_cas::store(buf) { Ok(s) => s, Err(e) => { warn!(?e, "CAS store falló"); return; } }; let line = format!( "{}:{}:{}:{}\n", - now_ms(), source, unit.unwrap_or("-"), ente_cas::hex(&sha) + now_ms(), source, unit.unwrap_or("-"), arje_cas::hex(&sha) ); let path = index_path(); let _guard = INDEX_FILE.lock().unwrap(); @@ -213,6 +213,6 @@ async fn wait_for_term() -> anyhow::Result<()> { fn init_tracing() { let filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("ente_journald_compat=info,journal=info,syslog=info")); + .unwrap_or_else(|_| EnvFilter::new("arje_journald_compat=info,journal=info,syslog=info")); tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init(); } diff --git a/crates/compat/ente-localed-compat/Cargo.toml b/crates/compat/arje-localed-compat/Cargo.toml similarity index 69% rename from crates/compat/ente-localed-compat/Cargo.toml rename to crates/compat/arje-localed-compat/Cargo.toml index 9e4c0d8..12aca62 100644 --- a/crates/compat/ente-localed-compat/Cargo.toml +++ b/crates/compat/arje-localed-compat/Cargo.toml @@ -1,17 +1,17 @@ [package] -name = "ente-localed-compat" +name = "arje-localed-compat" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [[bin]] -name = "ente-localed-compat" +name = "arje-localed-compat" path = "src/main.rs" [dependencies] -ente-card = { path = "../../protocol/ente-card" } -ente-bus = { path = "../../runtime/ente-bus" } +arje-card = { path = "../../protocol/arje-card" } +arje-bus = { path = "../../runtime/arje-bus" } anyhow = { workspace = true } tokio = { workspace = true } tracing = { workspace = true } diff --git a/crates/compat/ente-localed-compat/src/main.rs b/crates/compat/arje-localed-compat/src/main.rs similarity index 97% rename from crates/compat/ente-localed-compat/src/main.rs rename to crates/compat/arje-localed-compat/src/main.rs index f553c54..67b4703 100644 --- a/crates/compat/ente-localed-compat/src/main.rs +++ b/crates/compat/arje-localed-compat/src/main.rs @@ -3,8 +3,8 @@ //! GNOME settings panel "Region & Language" llama aquí. Properties leen //! /etc/locale.conf y /etc/vconsole.conf; setters log + forward. -use ente_bus::{BusClient, BusRequest, BusResponse}; -use ente_card::Capability; +use arje_bus::{BusClient, BusRequest, BusResponse}; +use arje_card::Capability; use std::sync::Mutex; use tokio::signal::unix::{signal, SignalKind}; use tracing::{info, warn}; @@ -190,7 +190,7 @@ async fn announce_to_fractal() { if let Ok(mut client) = BusClient::from_env().await { let req = BusRequest::Announce { capabilities: vec![Capability::Endpoint { - interface: ente_card::InterfaceId([0xa2; 16]), + interface: arje_card::InterfaceId([0xa2; 16]), version: 1, }], }; @@ -214,6 +214,6 @@ async fn wait_for_term() -> anyhow::Result<()> { fn init_tracing() { let filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("ente_localed_compat=info")); + .unwrap_or_else(|_| EnvFilter::new("arje_localed_compat=info")); tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init(); } diff --git a/crates/compat/ente-polkit-compat/Cargo.toml b/crates/compat/arje-logind-compat/Cargo.toml similarity index 69% rename from crates/compat/ente-polkit-compat/Cargo.toml rename to crates/compat/arje-logind-compat/Cargo.toml index 66fc0b6..bdef1fb 100644 --- a/crates/compat/ente-polkit-compat/Cargo.toml +++ b/crates/compat/arje-logind-compat/Cargo.toml @@ -1,17 +1,17 @@ [package] -name = "ente-polkit-compat" +name = "arje-logind-compat" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [[bin]] -name = "ente-polkit-compat" +name = "arje-logind-compat" path = "src/main.rs" [dependencies] -ente-card = { path = "../../protocol/ente-card" } -ente-bus = { path = "../../runtime/ente-bus" } +arje-card = { path = "../../protocol/arje-card" } +arje-bus = { path = "../../runtime/arje-bus" } anyhow = { workspace = true } tokio = { workspace = true } tracing = { workspace = true } diff --git a/crates/compat/ente-logind-compat/src/main.rs b/crates/compat/arje-logind-compat/src/main.rs similarity index 98% rename from crates/compat/ente-logind-compat/src/main.rs rename to crates/compat/arje-logind-compat/src/main.rs index ce1736f..1cd1b9e 100644 --- a/crates/compat/ente-logind-compat/src/main.rs +++ b/crates/compat/arje-logind-compat/src/main.rs @@ -18,8 +18,8 @@ //! El stub responde "no hay sesiones" y "sí puedo apagar" — suficiente para //! que GNOME complete arranque sin marcar fallo. -use ente_bus::{BusClient, BusRequest, BusResponse}; -use ente_card::Capability; +use arje_bus::{BusClient, BusRequest, BusResponse}; +use arje_card::Capability; use std::sync::atomic::{AtomicU32, Ordering}; use std::time::Duration; use tokio::signal::unix::{signal, SignalKind}; @@ -120,7 +120,7 @@ async fn wait_for_term() -> anyhow::Result<()> { fn init_tracing() { let filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("ente_logind_compat=info")); + .unwrap_or_else(|_| EnvFilter::new("arje_logind_compat=info")); tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init(); } diff --git a/crates/compat/ente-machined-compat/Cargo.toml b/crates/compat/arje-machined-compat/Cargo.toml similarity index 69% rename from crates/compat/ente-machined-compat/Cargo.toml rename to crates/compat/arje-machined-compat/Cargo.toml index 04cc159..043ba24 100644 --- a/crates/compat/ente-machined-compat/Cargo.toml +++ b/crates/compat/arje-machined-compat/Cargo.toml @@ -1,17 +1,17 @@ [package] -name = "ente-machined-compat" +name = "arje-machined-compat" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [[bin]] -name = "ente-machined-compat" +name = "arje-machined-compat" path = "src/main.rs" [dependencies] -ente-card = { path = "../../protocol/ente-card" } -ente-bus = { path = "../../runtime/ente-bus" } +arje-card = { path = "../../protocol/arje-card" } +arje-bus = { path = "../../runtime/arje-bus" } anyhow = { workspace = true } tokio = { workspace = true } tracing = { workspace = true } diff --git a/crates/compat/ente-machined-compat/src/main.rs b/crates/compat/arje-machined-compat/src/main.rs similarity index 96% rename from crates/compat/ente-machined-compat/src/main.rs rename to crates/compat/arje-machined-compat/src/main.rs index 4ad7e00..9a2551c 100644 --- a/crates/compat/ente-machined-compat/src/main.rs +++ b/crates/compat/arje-machined-compat/src/main.rs @@ -13,8 +13,8 @@ //! Producción real: integrar con el graph del fractal — ListMachines query //! BusRequest::ListEntes filtrado por `card.soma.namespaces.pid`. -use ente_bus::{BusClient, BusRequest, BusResponse}; -use ente_card::Capability; +use arje_bus::{BusClient, BusRequest, BusResponse}; +use arje_card::Capability; use std::collections::HashMap; use tokio::signal::unix::{signal, SignalKind}; use tracing::{info, warn}; @@ -157,7 +157,7 @@ async fn announce_to_fractal() { if let Ok(mut client) = BusClient::from_env().await { let req = BusRequest::Announce { capabilities: vec![Capability::Endpoint { - interface: ente_card::InterfaceId([0xa5; 16]), + interface: arje_card::InterfaceId([0xa5; 16]), version: 1, }], }; @@ -181,6 +181,6 @@ async fn wait_for_term() -> anyhow::Result<()> { fn init_tracing() { let filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("ente_machined_compat=info")); + .unwrap_or_else(|_| EnvFilter::new("arje_machined_compat=info")); tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init(); } diff --git a/crates/compat/ente-notify-compat/Cargo.toml b/crates/compat/arje-notify-compat/Cargo.toml similarity index 68% rename from crates/compat/ente-notify-compat/Cargo.toml rename to crates/compat/arje-notify-compat/Cargo.toml index c3662d9..baf0e1e 100644 --- a/crates/compat/ente-notify-compat/Cargo.toml +++ b/crates/compat/arje-notify-compat/Cargo.toml @@ -1,17 +1,17 @@ [package] -name = "ente-notify-compat" +name = "arje-notify-compat" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [[bin]] -name = "ente-notify-compat" +name = "arje-notify-compat" path = "src/main.rs" [dependencies] -ente-card = { path = "../../protocol/ente-card" } -ente-bus = { path = "../../runtime/ente-bus" } +arje-card = { path = "../../protocol/arje-card" } +arje-bus = { path = "../../runtime/arje-bus" } nix = { workspace = true } libc = { workspace = true } anyhow = { workspace = true } diff --git a/crates/compat/ente-notify-compat/src/main.rs b/crates/compat/arje-notify-compat/src/main.rs similarity index 96% rename from crates/compat/ente-notify-compat/src/main.rs rename to crates/compat/arje-notify-compat/src/main.rs index afcf275..f75c8e9 100644 --- a/crates/compat/ente-notify-compat/src/main.rs +++ b/crates/compat/arje-notify-compat/src/main.rs @@ -15,8 +15,8 @@ //! en el envp de cada Ente encarnado. Eso ya lo hace via build_env() — //! aquí sólo necesitamos que el path sea coherente. -use ente_bus::{BusClient, BusRequest, BusResponse}; -use ente_card::Capability; +use arje_bus::{BusClient, BusRequest, BusResponse}; +use arje_card::Capability; use std::os::fd::{AsRawFd, OwnedFd}; use std::path::Path; use tokio::io::unix::AsyncFd; @@ -131,7 +131,7 @@ async fn announce_to_fractal() { if let Ok(mut client) = BusClient::from_env().await { let req = BusRequest::Announce { capabilities: vec![Capability::Endpoint { - interface: ente_card::InterfaceId([0xa7; 16]), + interface: arje_card::InterfaceId([0xa7; 16]), version: 1, }], }; @@ -155,6 +155,6 @@ async fn wait_for_term() -> anyhow::Result<()> { fn init_tracing() { let filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("ente_notify_compat=info")); + .unwrap_or_else(|_| EnvFilter::new("arje_notify_compat=info")); tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init(); } diff --git a/crates/compat/ente-policy-provider/Cargo.toml b/crates/compat/arje-policy-provider/Cargo.toml similarity index 68% rename from crates/compat/ente-policy-provider/Cargo.toml rename to crates/compat/arje-policy-provider/Cargo.toml index f035fcb..751cdd7 100644 --- a/crates/compat/ente-policy-provider/Cargo.toml +++ b/crates/compat/arje-policy-provider/Cargo.toml @@ -1,17 +1,17 @@ [package] -name = "ente-policy-provider" +name = "arje-policy-provider" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [[bin]] -name = "ente-policy-provider" +name = "arje-policy-provider" path = "src/main.rs" [dependencies] -ente-card = { path = "../../protocol/ente-card" } -ente-bus = { path = "../../runtime/ente-bus" } +arje-card = { path = "../../protocol/arje-card" } +arje-bus = { path = "../../runtime/arje-bus" } serde = { workspace = true } serde_json = { workspace = true } anyhow = { workspace = true } diff --git a/crates/compat/ente-policy-provider/src/main.rs b/crates/compat/arje-policy-provider/src/main.rs similarity index 98% rename from crates/compat/ente-policy-provider/src/main.rs rename to crates/compat/arje-policy-provider/src/main.rs index 3777ddc..26afa88 100644 --- a/crates/compat/ente-policy-provider/src/main.rs +++ b/crates/compat/arje-policy-provider/src/main.rs @@ -20,8 +20,8 @@ //! } //! ``` -use ente_bus::{BusResponse, BusServer, InvokeHandler, POLKIT_DECISION_IFACE}; -use ente_card::Capability; +use arje_bus::{BusResponse, BusServer, InvokeHandler, POLKIT_DECISION_IFACE}; +use arje_card::Capability; use serde::Deserialize; use std::sync::Arc; use tokio::signal::unix::{signal, SignalKind}; @@ -216,6 +216,6 @@ fn load_policy() -> PolicyConfig { fn init_tracing() { let filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("ente_policy_provider=info")); + .unwrap_or_else(|_| EnvFilter::new("arje_policy_provider=info")); tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init(); } diff --git a/crates/compat/ente-logind-compat/Cargo.toml b/crates/compat/arje-polkit-compat/Cargo.toml similarity index 69% rename from crates/compat/ente-logind-compat/Cargo.toml rename to crates/compat/arje-polkit-compat/Cargo.toml index c84dbf1..eeff401 100644 --- a/crates/compat/ente-logind-compat/Cargo.toml +++ b/crates/compat/arje-polkit-compat/Cargo.toml @@ -1,17 +1,17 @@ [package] -name = "ente-logind-compat" +name = "arje-polkit-compat" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [[bin]] -name = "ente-logind-compat" +name = "arje-polkit-compat" path = "src/main.rs" [dependencies] -ente-card = { path = "../../protocol/ente-card" } -ente-bus = { path = "../../runtime/ente-bus" } +arje-card = { path = "../../protocol/arje-card" } +arje-bus = { path = "../../runtime/arje-bus" } anyhow = { workspace = true } tokio = { workspace = true } tracing = { workspace = true } diff --git a/crates/compat/ente-polkit-compat/src/main.rs b/crates/compat/arje-polkit-compat/src/main.rs similarity index 98% rename from crates/compat/ente-polkit-compat/src/main.rs rename to crates/compat/arje-polkit-compat/src/main.rs index 8ff4b6b..a340515 100644 --- a/crates/compat/ente-polkit-compat/src/main.rs +++ b/crates/compat/arje-polkit-compat/src/main.rs @@ -14,8 +14,8 @@ //! CheckAuthorization solicita un token al graph y devuelve true/false //! según el resultado. -use ente_bus::{BusClient, BusRequest, BusResponse, POLKIT_DECISION_IFACE, POLKIT_SERVICE_IFACE}; -use ente_card::Capability; +use arje_bus::{BusClient, BusRequest, BusResponse, POLKIT_DECISION_IFACE, POLKIT_SERVICE_IFACE}; +use arje_card::Capability; use std::collections::HashMap; use tokio::signal::unix::{signal, SignalKind}; use tracing::{debug, info, warn}; @@ -259,6 +259,6 @@ async fn wait_for_term() -> anyhow::Result<()> { fn init_tracing() { let filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("ente_polkit_compat=info")); + .unwrap_or_else(|_| EnvFilter::new("arje_polkit_compat=info")); tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init(); } diff --git a/crates/compat/ente-resolved-compat/Cargo.toml b/crates/compat/arje-resolved-compat/Cargo.toml similarity index 70% rename from crates/compat/ente-resolved-compat/Cargo.toml rename to crates/compat/arje-resolved-compat/Cargo.toml index ca71285..ce78e9c 100644 --- a/crates/compat/ente-resolved-compat/Cargo.toml +++ b/crates/compat/arje-resolved-compat/Cargo.toml @@ -1,17 +1,17 @@ [package] -name = "ente-resolved-compat" +name = "arje-resolved-compat" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [[bin]] -name = "ente-resolved-compat" +name = "arje-resolved-compat" path = "src/main.rs" [dependencies] -ente-card = { path = "../../protocol/ente-card" } -ente-bus = { path = "../../runtime/ente-bus" } +arje-card = { path = "../../protocol/arje-card" } +arje-bus = { path = "../../runtime/arje-bus" } libc = { workspace = true } anyhow = { workspace = true } tokio = { workspace = true } diff --git a/crates/compat/ente-resolved-compat/src/main.rs b/crates/compat/arje-resolved-compat/src/main.rs similarity index 97% rename from crates/compat/ente-resolved-compat/src/main.rs rename to crates/compat/arje-resolved-compat/src/main.rs index a103bbe..d989297 100644 --- a/crates/compat/ente-resolved-compat/src/main.rs +++ b/crates/compat/arje-resolved-compat/src/main.rs @@ -9,8 +9,8 @@ //! - ResolveAddress (address → name reverse) //! - ResolveRecord (TXT/SRV/etc) — NotSupported (requiere DNS query directa) -use ente_bus::{BusClient, BusRequest, BusResponse}; -use ente_card::Capability; +use arje_bus::{BusClient, BusRequest, BusResponse}; +use arje_card::Capability; use std::net::IpAddr; use tokio::signal::unix::{signal, SignalKind}; use tracing::{info, warn}; @@ -181,7 +181,7 @@ async fn announce_to_fractal() { if let Ok(mut client) = BusClient::from_env().await { let req = BusRequest::Announce { capabilities: vec![Capability::Endpoint { - interface: ente_card::InterfaceId([0xa3; 16]), + interface: arje_card::InterfaceId([0xa3; 16]), version: 1, }], }; @@ -205,6 +205,6 @@ async fn wait_for_term() -> anyhow::Result<()> { fn init_tracing() { let filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("ente_resolved_compat=info")); + .unwrap_or_else(|_| EnvFilter::new("arje_resolved_compat=info")); tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init(); } diff --git a/crates/compat/arje-systemd1-compat/Cargo.toml b/crates/compat/arje-systemd1-compat/Cargo.toml new file mode 100644 index 0000000..40aea04 --- /dev/null +++ b/crates/compat/arje-systemd1-compat/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "arje-systemd1-compat" +version = "0.0.1" +edition.workspace = true +license.workspace = true +publish.workspace = true + +[[bin]] +name = "arje-systemd1-compat" +path = "src/main.rs" + +[dependencies] +arje-card = { path = "../../protocol/arje-card" } +arje-bus = { path = "../../runtime/arje-bus" } +anyhow = { workspace = true } +tokio = { workspace = true } +tracing = { workspace = true } +tracing-subscriber = { workspace = true } +zbus = { version = "4", default-features = false, features = ["tokio"] } diff --git a/crates/compat/ente-systemd1-compat/src/main.rs b/crates/compat/arje-systemd1-compat/src/main.rs similarity index 97% rename from crates/compat/ente-systemd1-compat/src/main.rs rename to crates/compat/arje-systemd1-compat/src/main.rs index 81ae1ba..aa09b22 100644 --- a/crates/compat/ente-systemd1-compat/src/main.rs +++ b/crates/compat/arje-systemd1-compat/src/main.rs @@ -18,8 +18,8 @@ //! - ListUnitFiles (vacío) //! - GetVersion / Environment / Architecture (properties) -use ente_bus::{BusClient, BusRequest, BusResponse}; -use ente_card::Capability; +use arje_bus::{BusClient, BusRequest, BusResponse}; +use arje_card::Capability; use std::collections::HashMap; use tokio::signal::unix::{signal, SignalKind}; use tracing::{info, warn}; @@ -223,7 +223,7 @@ impl SystemdManager { } /// Pregunta al bus interno por la lista de Entes vivos. -async fn query_list_entes() -> Option> { +async fn query_list_entes() -> Option> { let mut client = match BusClient::from_env().await { Ok(c) => c, Err(e) => { warn!(?e, "no bus client — devuelvo vacío"); return None; } @@ -248,7 +248,7 @@ async fn announce_to_fractal() { if let Ok(mut client) = BusClient::from_env().await { let req = BusRequest::Announce { capabilities: vec![Capability::Endpoint { - interface: ente_card::InterfaceId([0xa6; 16]), + interface: arje_card::InterfaceId([0xa6; 16]), version: 1, }], }; @@ -272,7 +272,7 @@ async fn wait_for_term() -> anyhow::Result<()> { fn init_tracing() { let filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("ente_systemd1_compat=info")); + .unwrap_or_else(|_| EnvFilter::new("arje_systemd1_compat=info")); tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init(); } diff --git a/crates/compat/arje-timedated-compat/Cargo.toml b/crates/compat/arje-timedated-compat/Cargo.toml new file mode 100644 index 0000000..387c37a --- /dev/null +++ b/crates/compat/arje-timedated-compat/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "arje-timedated-compat" +version = "0.0.1" +edition.workspace = true +license.workspace = true +publish.workspace = true + +[[bin]] +name = "arje-timedated-compat" +path = "src/main.rs" + +[dependencies] +arje-card = { path = "../../protocol/arje-card" } +arje-bus = { path = "../../runtime/arje-bus" } +anyhow = { workspace = true } +tokio = { workspace = true } +tracing = { workspace = true } +tracing-subscriber = { workspace = true } +zbus = { version = "4", default-features = false, features = ["tokio"] } diff --git a/crates/compat/ente-timedated-compat/src/main.rs b/crates/compat/arje-timedated-compat/src/main.rs similarity index 96% rename from crates/compat/ente-timedated-compat/src/main.rs rename to crates/compat/arje-timedated-compat/src/main.rs index a224c41..77d6711 100644 --- a/crates/compat/ente-timedated-compat/src/main.rs +++ b/crates/compat/arje-timedated-compat/src/main.rs @@ -3,8 +3,8 @@ //! GNOME settings panel "Date & Time" llama aquí. Properties read-only se //! mapean a syscalls/lecturas del sistema; setters log + forward. -use ente_bus::{BusClient, BusRequest, BusResponse}; -use ente_card::Capability; +use arje_bus::{BusClient, BusRequest, BusResponse}; +use arje_card::Capability; use std::time::{SystemTime, UNIX_EPOCH}; use tokio::signal::unix::{signal, SignalKind}; use tracing::{info, warn}; @@ -153,7 +153,7 @@ async fn announce_to_fractal() { if let Ok(mut client) = BusClient::from_env().await { let req = BusRequest::Announce { capabilities: vec![Capability::Endpoint { - interface: ente_card::InterfaceId([0xa1; 16]), + interface: arje_card::InterfaceId([0xa1; 16]), version: 1, }], }; @@ -177,6 +177,6 @@ async fn wait_for_term() -> anyhow::Result<()> { fn init_tracing() { let filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("ente_timedated_compat=info")); + .unwrap_or_else(|_| EnvFilter::new("arje_timedated_compat=info")); tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init(); } diff --git a/crates/compat/ente-timer-compat/Cargo.toml b/crates/compat/arje-timer-compat/Cargo.toml similarity index 71% rename from crates/compat/ente-timer-compat/Cargo.toml rename to crates/compat/arje-timer-compat/Cargo.toml index f4bcf4b..a98f7e9 100644 --- a/crates/compat/ente-timer-compat/Cargo.toml +++ b/crates/compat/arje-timer-compat/Cargo.toml @@ -1,17 +1,17 @@ [package] -name = "ente-timer-compat" +name = "arje-timer-compat" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [[bin]] -name = "ente-timer-compat" +name = "arje-timer-compat" path = "src/main.rs" [dependencies] -ente-card = { path = "../../protocol/ente-card" } -ente-bus = { path = "../../runtime/ente-bus" } +arje-card = { path = "../../protocol/arje-card" } +arje-bus = { path = "../../runtime/arje-bus" } serde = { workspace = true } serde_json = { workspace = true } ulid = { workspace = true } diff --git a/crates/compat/ente-timer-compat/src/main.rs b/crates/compat/arje-timer-compat/src/main.rs similarity index 97% rename from crates/compat/ente-timer-compat/src/main.rs rename to crates/compat/arje-timer-compat/src/main.rs index f018e22..84fe3e2 100644 --- a/crates/compat/ente-timer-compat/src/main.rs +++ b/crates/compat/arje-timer-compat/src/main.rs @@ -31,8 +31,8 @@ //! Para el demo: log "FIRE" cada vez que el schedule matchea, sin spawn real //! (requiere mover SpawnRequest al protocolo del bus, fuera de scope). -use ente_bus::{BusClient, BusRequest, BusResponse}; -use ente_card::Capability; +use arje_bus::{BusClient, BusRequest, BusResponse}; +use arje_card::Capability; use serde::Deserialize; use std::time::{SystemTime, UNIX_EPOCH}; use tokio::signal::unix::{signal, SignalKind}; @@ -209,7 +209,7 @@ async fn announce_to_fractal() { if let Ok(mut client) = BusClient::from_env().await { let req = BusRequest::Announce { capabilities: vec![Capability::Endpoint { - interface: ente_card::InterfaceId([0xa8; 16]), + interface: arje_card::InterfaceId([0xa8; 16]), version: 1, }], }; @@ -223,6 +223,6 @@ async fn announce_to_fractal() { fn init_tracing() { let filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("ente_timer_compat=info")); + .unwrap_or_else(|_| EnvFilter::new("arje_timer_compat=info")); tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init(); } diff --git a/crates/compat/ente-tmpfiles-compat/Cargo.toml b/crates/compat/arje-tmpfiles-compat/Cargo.toml similarity index 83% rename from crates/compat/ente-tmpfiles-compat/Cargo.toml rename to crates/compat/arje-tmpfiles-compat/Cargo.toml index b3b6123..e2d050e 100644 --- a/crates/compat/ente-tmpfiles-compat/Cargo.toml +++ b/crates/compat/arje-tmpfiles-compat/Cargo.toml @@ -1,12 +1,12 @@ [package] -name = "ente-tmpfiles-compat" +name = "arje-tmpfiles-compat" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [[bin]] -name = "ente-tmpfiles-compat" +name = "arje-tmpfiles-compat" path = "src/main.rs" [dependencies] diff --git a/crates/compat/ente-tmpfiles-compat/src/main.rs b/crates/compat/arje-tmpfiles-compat/src/main.rs similarity index 99% rename from crates/compat/ente-tmpfiles-compat/src/main.rs rename to crates/compat/arje-tmpfiles-compat/src/main.rs index 58de1c4..0c414a5 100644 --- a/crates/compat/ente-tmpfiles-compat/src/main.rs +++ b/crates/compat/arje-tmpfiles-compat/src/main.rs @@ -276,6 +276,6 @@ fn lookup_gid(name: &str) -> anyhow::Result { fn init_tracing() { let filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("ente_tmpfiles_compat=info")); + .unwrap_or_else(|_| EnvFilter::new("arje_tmpfiles_compat=info")); tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init(); } diff --git a/crates/compat/ente-systemd1-compat/Cargo.toml b/crates/compat/ente-systemd1-compat/Cargo.toml deleted file mode 100644 index be7fb94..0000000 --- a/crates/compat/ente-systemd1-compat/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "ente-systemd1-compat" -version = "0.0.1" -edition.workspace = true -license.workspace = true -publish.workspace = true - -[[bin]] -name = "ente-systemd1-compat" -path = "src/main.rs" - -[dependencies] -ente-card = { path = "../../protocol/ente-card" } -ente-bus = { path = "../../runtime/ente-bus" } -anyhow = { workspace = true } -tokio = { workspace = true } -tracing = { workspace = true } -tracing-subscriber = { workspace = true } -zbus = { version = "4", default-features = false, features = ["tokio"] } diff --git a/crates/compat/ente-timedated-compat/Cargo.toml b/crates/compat/ente-timedated-compat/Cargo.toml deleted file mode 100644 index f1b61fb..0000000 --- a/crates/compat/ente-timedated-compat/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "ente-timedated-compat" -version = "0.0.1" -edition.workspace = true -license.workspace = true -publish.workspace = true - -[[bin]] -name = "ente-timedated-compat" -path = "src/main.rs" - -[dependencies] -ente-card = { path = "../../protocol/ente-card" } -ente-bus = { path = "../../runtime/ente-bus" } -anyhow = { workspace = true } -tokio = { workspace = true } -tracing = { workspace = true } -tracing-subscriber = { workspace = true } -zbus = { version = "4", default-features = false, features = ["tokio"] } diff --git a/crates/init/SDD.md b/crates/init/SDD.md index 3e89d01..43d9a44 100644 --- a/crates/init/SDD.md +++ b/crates/init/SDD.md @@ -1,6 +1,6 @@ # init/ — Init (PID 1) y encarnación Linux -**Propósito.** `ente-zero` arranca como PID 1 del fractal. Provee el +**Propósito.** `arje-zero` arranca como PID 1 del fractal. Provee el bucle primordial (reap + bus + handshake), bootstrap del kernel surface, encarnación de Cards en procesos aislados con namespaces + cgroups, y snapshot/restore del grafo. @@ -9,21 +9,21 @@ cgroups, y snapshot/restore del grafo. | crate | tipo | rol | | ---------------- | ------- | ----------------------------------------------------- | -| `ente-zero` | binario | PID 1: reap + handshake server + bus dispatcher | -| `ente-kernel` | lib | `bootstrap_kernel_surface`, subreaper, SIGCHLD/uevent | -| `ente-soma` | lib | Wrapper 44 LOC sobre `ente-incarnate` (compat API) | -| `ente-incarnate` | lib | `clone(2) + namespaces + cgroup + rlimits + cpu` | -| `ente-snapshot` | lib | `FractalSnapshot` JSON: checkpoint del grafo Cards | +| `arje-zero` | binario | PID 1: reap + handshake server + bus dispatcher | +| `arje-kernel` | lib | `bootstrap_kernel_surface`, subreaper, SIGCHLD/uevent | +| `arje-soma` | lib | Wrapper 44 LOC sobre `arje-incarnate` (compat API) | +| `arje-incarnate` | lib | `clone(2) + namespaces + cgroup + rlimits + cpu` | +| `arje-snapshot` | lib | `FractalSnapshot` JSON: checkpoint del grafo Cards | ## Dependencias -- `ente-kernel` ← `nix`, `libc`, syscalls Linux puras. -- `ente-incarnate` reusable: shuma (sandboxes) y supervisores no-PID-1. +- `arje-kernel` ← `nix`, `libc`, syscalls Linux puras. +- `arje-incarnate` reusable: shuma (sandboxes) y supervisores no-PID-1. - Consume `protocol/` (handshake server, brahman-net opcional). ## Boot path -1. Kernel pasa control → `ente-zero` arranca como `/sbin/init`. +1. Kernel pasa control → `arje-zero` arranca como `/sbin/init`. 2. Levanta sockets: `/run/brahman/bus`, `/run/brahman/handshake`. 3. Lee `Card` semilla (`seeds/arje-{minimal,host,prod}.card.json`). 4. Para cada `genesis` child Card: `incarnate(card)` → spawn aislado. diff --git a/crates/init/ente-incarnate/Cargo.toml b/crates/init/arje-incarnate/Cargo.toml similarity index 96% rename from crates/init/ente-incarnate/Cargo.toml rename to crates/init/arje-incarnate/Cargo.toml index 1395616..bb53a51 100644 --- a/crates/init/ente-incarnate/Cargo.toml +++ b/crates/init/arje-incarnate/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "ente-incarnate" +name = "arje-incarnate" version.workspace = true edition.workspace = true rust-version.workspace = true diff --git a/crates/init/ente-incarnate/src/caps.rs b/crates/init/arje-incarnate/src/caps.rs similarity index 100% rename from crates/init/ente-incarnate/src/caps.rs rename to crates/init/arje-incarnate/src/caps.rs diff --git a/crates/init/ente-incarnate/src/cgroup.rs b/crates/init/arje-incarnate/src/cgroup.rs similarity index 100% rename from crates/init/ente-incarnate/src/cgroup.rs rename to crates/init/arje-incarnate/src/cgroup.rs diff --git a/crates/init/ente-incarnate/src/child.rs b/crates/init/arje-incarnate/src/child.rs similarity index 100% rename from crates/init/ente-incarnate/src/child.rs rename to crates/init/arje-incarnate/src/child.rs diff --git a/crates/init/ente-incarnate/src/env.rs b/crates/init/arje-incarnate/src/env.rs similarity index 100% rename from crates/init/ente-incarnate/src/env.rs rename to crates/init/arje-incarnate/src/env.rs diff --git a/crates/init/ente-incarnate/src/error.rs b/crates/init/arje-incarnate/src/error.rs similarity index 100% rename from crates/init/ente-incarnate/src/error.rs rename to crates/init/arje-incarnate/src/error.rs diff --git a/crates/init/ente-incarnate/src/lib.rs b/crates/init/arje-incarnate/src/lib.rs similarity index 100% rename from crates/init/ente-incarnate/src/lib.rs rename to crates/init/arje-incarnate/src/lib.rs diff --git a/crates/init/ente-incarnate/src/namespaced.rs b/crates/init/arje-incarnate/src/namespaced.rs similarity index 100% rename from crates/init/ente-incarnate/src/namespaced.rs rename to crates/init/arje-incarnate/src/namespaced.rs diff --git a/crates/init/ente-incarnate/src/plain.rs b/crates/init/arje-incarnate/src/plain.rs similarity index 100% rename from crates/init/ente-incarnate/src/plain.rs rename to crates/init/arje-incarnate/src/plain.rs diff --git a/crates/init/ente-incarnate/src/pre_exec.rs b/crates/init/arje-incarnate/src/pre_exec.rs similarity index 100% rename from crates/init/ente-incarnate/src/pre_exec.rs rename to crates/init/arje-incarnate/src/pre_exec.rs diff --git a/crates/init/ente-kernel/Cargo.toml b/crates/init/arje-kernel/Cargo.toml similarity index 78% rename from crates/init/ente-kernel/Cargo.toml rename to crates/init/arje-kernel/Cargo.toml index 2ef77f8..44414d2 100644 --- a/crates/init/ente-kernel/Cargo.toml +++ b/crates/init/arje-kernel/Cargo.toml @@ -1,12 +1,12 @@ [package] -name = "ente-kernel" +name = "arje-kernel" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [dependencies] -ente-card = { path = "../../protocol/ente-card" } +arje-card = { path = "../../protocol/arje-card" } nix = { workspace = true } libc = { workspace = true } tokio = { workspace = true } diff --git a/crates/init/ente-kernel/src/lib.rs b/crates/init/arje-kernel/src/lib.rs similarity index 100% rename from crates/init/ente-kernel/src/lib.rs rename to crates/init/arje-kernel/src/lib.rs diff --git a/crates/init/ente-kernel/src/sigchld.rs b/crates/init/arje-kernel/src/sigchld.rs similarity index 100% rename from crates/init/ente-kernel/src/sigchld.rs rename to crates/init/arje-kernel/src/sigchld.rs diff --git a/crates/init/ente-kernel/src/surface.rs b/crates/init/arje-kernel/src/surface.rs similarity index 100% rename from crates/init/ente-kernel/src/surface.rs rename to crates/init/arje-kernel/src/surface.rs diff --git a/crates/init/ente-kernel/src/uevent.rs b/crates/init/arje-kernel/src/uevent.rs similarity index 99% rename from crates/init/ente-kernel/src/uevent.rs rename to crates/init/arje-kernel/src/uevent.rs index 6e8f0fd..d7ce4bd 100644 --- a/crates/init/ente-kernel/src/uevent.rs +++ b/crates/init/arje-kernel/src/uevent.rs @@ -5,7 +5,7 @@ //! continuar sin grafo de dispositivos. use anyhow::Context; -use ente_card::DeviceClass; +use arje_card::DeviceClass; use nix::sys::socket::{bind, socket, AddressFamily, NetlinkAddr, SockFlag, SockProtocol, SockType}; use std::collections::HashMap; use std::os::fd::{AsRawFd, OwnedFd}; diff --git a/crates/init/ente-snapshot/Cargo.toml b/crates/init/arje-snapshot/Cargo.toml similarity index 76% rename from crates/init/ente-snapshot/Cargo.toml rename to crates/init/arje-snapshot/Cargo.toml index 38ec4dd..0af070f 100644 --- a/crates/init/ente-snapshot/Cargo.toml +++ b/crates/init/arje-snapshot/Cargo.toml @@ -1,12 +1,12 @@ [package] -name = "ente-snapshot" +name = "arje-snapshot" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [dependencies] -ente-card = { path = "../../protocol/ente-card" } +arje-card = { path = "../../protocol/arje-card" } serde = { workspace = true } serde_json = { workspace = true } ulid = { workspace = true } diff --git a/crates/init/ente-snapshot/src/lib.rs b/crates/init/arje-snapshot/src/lib.rs similarity index 98% rename from crates/init/ente-snapshot/src/lib.rs rename to crates/init/arje-snapshot/src/lib.rs index 6eb0d1c..1e11614 100644 --- a/crates/init/ente-snapshot/src/lib.rs +++ b/crates/init/arje-snapshot/src/lib.rs @@ -9,7 +9,7 @@ //! - pending_invokes (en vuelo, se descartan) //! - device presence (uevents reconstruyen el índice) -use ente_card::EntityCard; +use arje_card::EntityCard; use serde::{Deserialize, Serialize}; use std::path::Path; use ulid::Ulid; diff --git a/crates/init/arje-soma/Cargo.toml b/crates/init/arje-soma/Cargo.toml new file mode 100644 index 0000000..f83d82b --- /dev/null +++ b/crates/init/arje-soma/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "arje-soma" +version = "0.0.1" +edition.workspace = true +license.workspace = true +publish.workspace = true +description = "Wrapper histórico sobre arje-incarnate para mantener la API set_bus_sock+incarnate que usa arje-zero. Toda la lógica vive en arje-incarnate." + +[dependencies] +arje-card = { path = "../../protocol/arje-card" } +arje-bus = { path = "../../runtime/arje-bus" } +arje-incarnate = { path = "../arje-incarnate" } +nix = { workspace = true } +anyhow = { workspace = true } +tracing = { workspace = true } diff --git a/crates/init/ente-soma/src/lib.rs b/crates/init/arje-soma/src/lib.rs similarity index 89% rename from crates/init/ente-soma/src/lib.rs rename to crates/init/arje-soma/src/lib.rs index e66b32a..7d136c8 100644 --- a/crates/init/ente-soma/src/lib.rs +++ b/crates/init/arje-soma/src/lib.rs @@ -1,17 +1,17 @@ -//! `ente-soma` — wrapper histórico sobre [`ente_incarnate`]. +//! `ente-soma` — wrapper histórico sobre [`arje_incarnate`]. //! //! La rutina de namespacing fue extraída a `ente-incarnate` para que //! shuma, exploradores y cualquier supervisor no-PID-1 puedan reusarla. //! Este crate sobrevive como compat para `ente-zero` y otros que importan -//! `ente_soma::{set_bus_sock, incarnate}`. +//! `arje_soma::{set_bus_sock, incarnate}`. //! //! Semántica preservada: //! - `BUS_SOCK_PATH` global vía `OnceLock` (init lo setea una vez). //! - `NOTIFY_SOCKET=/run/systemd/notify` se inyecta automáticamente. //! - `strict_caps = false` (errores no-fatales se loguean, encarnación sigue). -use ente_card::EntityCard; -use ente_incarnate::{Incarnator, IncarnatorConfig}; +use arje_card::EntityCard; +use arje_incarnate::{Incarnator, IncarnatorConfig}; use nix::unistd::Pid; use std::path::PathBuf; use std::sync::OnceLock; diff --git a/crates/init/ente-zero/Cargo.toml b/crates/init/arje-zero/Cargo.toml similarity index 66% rename from crates/init/ente-zero/Cargo.toml rename to crates/init/arje-zero/Cargo.toml index 0e8e2f3..60df7ab 100644 --- a/crates/init/ente-zero/Cargo.toml +++ b/crates/init/arje-zero/Cargo.toml @@ -1,25 +1,25 @@ [package] -name = "ente-zero" +name = "arje-zero" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [[bin]] -name = "ente-zero" +name = "arje-zero" path = "src/main.rs" [dependencies] # Lib crates del fractal — orden: contratos → infra → encarnación → orquestación -ente-card = { path = "../../protocol/ente-card" } -ente-bus = { path = "../../runtime/ente-bus" } -ente-cas = { path = "../../runtime/ente-cas" } -ente-kernel = { path = "../ente-kernel" } -ente-soma = { path = "../ente-soma" } -ente-wasm = { path = "../../runtime/ente-wasm" } -ente-snapshot = { path = "../ente-snapshot" } -ente-brain = { path = "../../runtime/ente-brain" } -ente-echo = { path = "../../runtime/ente-echo" } # solo para constantes del demo +arje-card = { path = "../../protocol/arje-card" } +arje-bus = { path = "../../runtime/arje-bus" } +arje-cas = { path = "../../runtime/arje-cas" } +arje-kernel = { path = "../arje-kernel" } +arje-soma = { path = "../arje-soma" } +arje-wasm = { path = "../../runtime/arje-wasm" } +arje-snapshot = { path = "../arje-snapshot" } +arje-brain = { path = "../../runtime/arje-brain" } +arje-echo = { path = "../../runtime/arje-echo" } # solo para constantes del demo # Brahman protocol — handshake para módulos brahman conscientes brahman-handshake = { path = "../../protocol/brahman-handshake" } diff --git a/crates/init/ente-zero/src/brain_glue.rs b/crates/init/arje-zero/src/brain_glue.rs similarity index 90% rename from crates/init/ente-zero/src/brain_glue.rs rename to crates/init/arje-zero/src/brain_glue.rs index 261afe5..8762ddb 100644 --- a/crates/init/ente-zero/src/brain_glue.rs +++ b/crates/init/arje-zero/src/brain_glue.rs @@ -1,7 +1,7 @@ //! Glue entre el bucle primordial y `ente-brain`. //! //! Tres responsabilidades: -//! 1. Traducir eventos del grafo (`GraphEvent`) a `ente_brain::EventKind` +//! 1. Traducir eventos del grafo (`GraphEvent`) a `arje_brain::EventKind` //! + `SubjectInfo` para el observador y el motor. //! 2. Implementar `ActionSink` para que las Acciones del cerebro tengan //! un canal de salida hacia el grafo (Spawn → SpawnRequest, etc.). @@ -10,8 +10,8 @@ use crate::events::GraphEvent; use crate::graph::EnteGraph; -use ente_brain::{ActionSink, EventKind as BrainEventKind, SubjectInfo}; -use ente_card::Capability; +use arje_brain::{ActionSink, EventKind as BrainEventKind, SubjectInfo}; +use arje_card::Capability; use serde::Deserialize; use tokio::sync::mpsc; use tracing::warn; @@ -40,8 +40,8 @@ pub fn graph_event_to_brain<'a>( } GraphEvent::BusRequest { from, request, .. } => { let kind = match request { - ente_bus::BusRequest::Announce { .. } => BrainEventKind::BusAnnounce, - ente_bus::BusRequest::Invoke { cap, .. } => { + arje_bus::BusRequest::Announce { .. } => BrainEventKind::BusAnnounce, + arje_bus::BusRequest::Invoke { cap, .. } => { BrainEventKind::BusInvokeOf(cap.clone()) } _ => BrainEventKind::BusInvoke, @@ -83,7 +83,7 @@ pub struct GraphSink { impl ActionSink for GraphSink { fn spawn(&self, card_blob: &str) { // El blob es JSON de EntityCard. - match serde_json::from_str::(card_blob) { + match serde_json::from_str::(card_blob) { Ok(card) => { let evt = GraphEvent::SpawnRequest { card, requester: self.requester }; if self.graph_tx.try_send(evt).is_err() { @@ -112,11 +112,11 @@ impl ActionSink for GraphSink { /// Helper para que el grafo exponga la Card de un Ente vivo. Lo añadimos como /// trait extension porque graph::EnteGraph mantiene `incarnated` privado. pub trait GraphCardLookup { - fn card_for(&self, id: &Ulid) -> Option<&ente_card::EntityCard>; + fn card_for(&self, id: &Ulid) -> Option<&arje_card::EntityCard>; } impl GraphCardLookup for EnteGraph { - fn card_for(&self, id: &Ulid) -> Option<&ente_card::EntityCard> { + fn card_for(&self, id: &Ulid) -> Option<&arje_card::EntityCard> { // Acceso vía método público que añadiremos en graph/mod.rs. self.peek_card(id) } diff --git a/crates/init/ente-zero/src/bus.rs b/crates/init/arje-zero/src/bus.rs similarity index 96% rename from crates/init/ente-zero/src/bus.rs rename to crates/init/arje-zero/src/bus.rs index 6086b79..7ee3a06 100644 --- a/crates/init/ente-zero/src/bus.rs +++ b/crates/init/arje-zero/src/bus.rs @@ -10,7 +10,7 @@ //! escritura de su conexión y lo usa para forwardear. use crate::events::GraphEvent; -use ente_bus::{read_frame, write_frame, BusMessage, BusPayload, BusResponse, PeerCreds}; +use arje_bus::{read_frame, write_frame, BusMessage, BusPayload, BusResponse, PeerCreds}; use nix::sys::socket::{getsockopt, sockopt::PeerCredentials}; use std::path::PathBuf; use tokio::net::{UnixListener, UnixStream}; @@ -19,7 +19,7 @@ use tracing::{error, info, trace, warn}; use ulid::Ulid; pub fn default_socket_path() -> PathBuf { - if let Ok(p) = std::env::var(ente_bus::ENV_BUS_SOCK) { + if let Ok(p) = std::env::var(arje_bus::ENV_BUS_SOCK) { return p.into(); } let runtime = std::env::var("XDG_RUNTIME_DIR") @@ -97,7 +97,7 @@ async fn handle_conn(stream: UnixStream, graph_tx: mpsc::Sender) -> }; match msg.payload { BusPayload::Request(req) => { - let is_announce = matches!(req, ente_bus::BusRequest::Announce { .. }); + let is_announce = matches!(req, arje_bus::BusRequest::Announce { .. }); let (reply_tx, reply_rx) = oneshot::channel(); if graph_tx.send(GraphEvent::BusRequest { peer, diff --git a/crates/init/ente-zero/src/events.rs b/crates/init/arje-zero/src/events.rs similarity index 95% rename from crates/init/ente-zero/src/events.rs rename to crates/init/arje-zero/src/events.rs index 2102dd3..ca25915 100644 --- a/crates/init/ente-zero/src/events.rs +++ b/crates/init/arje-zero/src/events.rs @@ -8,8 +8,8 @@ #![allow(dead_code)] -use ente_bus::{BusMessage, BusRequest, BusResponse, PeerCreds}; -use ente_card::{Capability, EntityCard}; +use arje_bus::{BusMessage, BusRequest, BusResponse, PeerCreds}; +use arje_card::{Capability, EntityCard}; use nix::sys::signal::Signal; use tokio::sync::{mpsc, oneshot}; use ulid::Ulid; diff --git a/crates/init/ente-zero/src/graph/bus_mediator.rs b/crates/init/arje-zero/src/graph/bus_mediator.rs similarity index 99% rename from crates/init/ente-zero/src/graph/bus_mediator.rs rename to crates/init/arje-zero/src/graph/bus_mediator.rs index 51d3f1a..0c90752 100644 --- a/crates/init/ente-zero/src/graph/bus_mediator.rs +++ b/crates/init/arje-zero/src/graph/bus_mediator.rs @@ -8,8 +8,8 @@ //! - Cleanup en cierre de conexión use super::{EnteGraph, SERVER_SEQ_FLAG}; -use ente_bus::{BusMessage, BusPayload, BusRequest, BusResponse, EnteInfo, PeerCreds}; -use ente_card::Capability; +use arje_bus::{BusMessage, BusPayload, BusRequest, BusResponse, EnteInfo, PeerCreds}; +use arje_card::Capability; use tokio::sync::{mpsc, oneshot}; use tracing::{debug, info, warn}; use ulid::Ulid; diff --git a/crates/init/ente-zero/src/graph/capabilities.rs b/crates/init/arje-zero/src/graph/capabilities.rs similarity index 99% rename from crates/init/ente-zero/src/graph/capabilities.rs rename to crates/init/arje-zero/src/graph/capabilities.rs index 9d75ae4..0d8b9d9 100644 --- a/crates/init/ente-zero/src/graph/capabilities.rs +++ b/crates/init/arje-zero/src/graph/capabilities.rs @@ -6,7 +6,7 @@ use super::{quota_for_capability, ttl_for_capability, EnteGraph, GrantedCapability}; use crate::events::CapabilityGrant; -use ente_card::Capability; +use arje_card::Capability; use std::time::Instant; use tokio::sync::oneshot; use tracing::debug; diff --git a/crates/init/ente-zero/src/graph/devices.rs b/crates/init/arje-zero/src/graph/devices.rs similarity index 96% rename from crates/init/ente-zero/src/graph/devices.rs rename to crates/init/arje-zero/src/graph/devices.rs index 9a2a189..26d81f7 100644 --- a/crates/init/ente-zero/src/graph/devices.rs +++ b/crates/init/arje-zero/src/graph/devices.rs @@ -3,8 +3,8 @@ use super::EnteGraph; use crate::events::GraphEvent; -use ente_card::{Capability, DeviceClass}; -use ente_kernel::{UAction, UEvent}; +use arje_card::{Capability, DeviceClass}; +use arje_kernel::{UAction, UEvent}; use tokio::sync::mpsc; use tracing::{debug, info, warn}; diff --git a/crates/init/ente-zero/src/graph/lifecycle.rs b/crates/init/arje-zero/src/graph/lifecycle.rs similarity index 93% rename from crates/init/ente-zero/src/graph/lifecycle.rs rename to crates/init/arje-zero/src/graph/lifecycle.rs index 2613878..2b62825 100644 --- a/crates/init/ente-zero/src/graph/lifecycle.rs +++ b/crates/init/arje-zero/src/graph/lifecycle.rs @@ -5,8 +5,8 @@ use super::{EnteGraph, Incarnated}; use crate::events::{ExitStatus, GraphEvent}; -use ente_bus::{BusMessage, BusPayload, BusRequest}; -use ente_card::{Capability, EntityCard, Payload, Supervision}; +use arje_bus::{BusMessage, BusPayload, BusRequest}; +use arje_card::{Capability, EntityCard, Payload, Supervision}; use tokio::sync::mpsc; use tracing::{info, warn}; use ulid::Ulid; @@ -35,7 +35,7 @@ impl EnteGraph { /// Spawn solicitado por un Ente con `Capability::Spawn`. Verifica auth, /// requires del grafo, y delega la encarnación al backend correspondiente - /// (`ente_soma` para procesos, `ente_wasm` para Wasm). + /// (`arje_soma` para procesos, `arje_wasm` para Wasm). pub async fn authorize_and_spawn( &mut self, mut card: EntityCard, @@ -64,14 +64,14 @@ impl EnteGraph { let pid = match &card.payload { Payload::Virtual => None, Payload::Native { .. } | Payload::Legacy { .. } => { - Some(ente_soma::incarnate(&card)?) + Some(arje_soma::incarnate(&card)?) } Payload::Wasm { module_sha256, entry } => { // Wasm: hilo dedicado, sin PID. Su muerte se observa por // estado del runtime, no por SIGCHLD. - let bytes = ente_cas::resolve(module_sha256) + let bytes = arje_cas::resolve(module_sha256) .map_err(|e| anyhow::anyhow!("CAS resolve para {}: {e}", card.label))?; - ente_wasm::incarnate_wasm(&card, bytes, entry.clone())?; + arje_wasm::incarnate_wasm(&card, bytes, entry.clone())?; None } }; @@ -142,7 +142,7 @@ impl EnteGraph { seq, payload: BusPayload::Request(BusRequest::Invoke { cap: Capability::Endpoint { - interface: ente_card::InterfaceId([0xde; 16]), + interface: arje_card::InterfaceId([0xde; 16]), version: 1, }, blob: blob.into_bytes(), diff --git a/crates/init/ente-zero/src/graph/mod.rs b/crates/init/arje-zero/src/graph/mod.rs similarity index 96% rename from crates/init/ente-zero/src/graph/mod.rs rename to crates/init/arje-zero/src/graph/mod.rs index bf3409c..12b75de 100644 --- a/crates/init/ente-zero/src/graph/mod.rs +++ b/crates/init/arje-zero/src/graph/mod.rs @@ -16,8 +16,8 @@ mod lifecycle; mod shutdown; mod topology; -use ente_bus::{BusMessage, BusResponse}; -use ente_card::{Capability, EntityCard}; +use arje_bus::{BusMessage, BusResponse}; +use arje_card::{Capability, EntityCard}; use nix::unistd::Pid; use std::collections::{BTreeMap, BTreeSet, HashMap}; use tokio::sync::{mpsc, oneshot}; @@ -41,7 +41,7 @@ pub struct EnteGraph { pub(in crate::graph) next_token: u64, pub(in crate::graph) grants: HashMap, /// Dispositivos del kernel presentes (devpath → última UEvent). - pub(in crate::graph) devices: HashMap, + pub(in crate::graph) devices: HashMap, /// Cards genesis pendientes de instanciar (extraídas de la Semilla). pub(in crate::graph) pending_genesis: Vec, /// Hijos directos por lineage. parent → [child, ...]. @@ -166,14 +166,14 @@ impl EnteGraph { /// Captura el estado live como snapshot serializable. Excluye la Semilla /// (será re-sintetizada al restore con su seed_id preservado). - pub fn snapshot(&self) -> ente_snapshot::FractalSnapshot { + pub fn snapshot(&self) -> arje_snapshot::FractalSnapshot { let entes: Vec = self.incarnated.iter() .filter(|(id, _)| **id != self.seed.id) .map(|(_, inc)| inc.card.clone()) .collect(); - ente_snapshot::FractalSnapshot { - version: ente_snapshot::SNAPSHOT_VERSION, - timestamp_ms: ente_snapshot::now_ms(), + arje_snapshot::FractalSnapshot { + version: arje_snapshot::SNAPSHOT_VERSION, + timestamp_ms: arje_snapshot::now_ms(), seed_id: self.seed.id, seed_label: self.seed.label.clone(), entes, diff --git a/crates/init/ente-zero/src/graph/shutdown.rs b/crates/init/arje-zero/src/graph/shutdown.rs similarity index 100% rename from crates/init/ente-zero/src/graph/shutdown.rs rename to crates/init/arje-zero/src/graph/shutdown.rs diff --git a/crates/init/ente-zero/src/graph/topology.rs b/crates/init/arje-zero/src/graph/topology.rs similarity index 100% rename from crates/init/ente-zero/src/graph/topology.rs rename to crates/init/arje-zero/src/graph/topology.rs diff --git a/crates/init/ente-zero/src/keypair_store.rs b/crates/init/arje-zero/src/keypair_store.rs similarity index 100% rename from crates/init/ente-zero/src/keypair_store.rs rename to crates/init/arje-zero/src/keypair_store.rs diff --git a/crates/init/ente-zero/src/main.rs b/crates/init/arje-zero/src/main.rs similarity index 95% rename from crates/init/ente-zero/src/main.rs rename to crates/init/arje-zero/src/main.rs index b2cab6a..d4f7932 100644 --- a/crates/init/ente-zero/src/main.rs +++ b/crates/init/arje-zero/src/main.rs @@ -23,8 +23,8 @@ mod keypair_store; mod seed; use anyhow::Context; -use ente_brain::{BrainState, IntrospectServer}; -use ente_kernel::{become_child_subreaper, bootstrap_kernel_surface, spawn_sigchld_stream, spawn_uevent_stream}; +use arje_brain::{BrainState, IntrospectServer}; +use arje_kernel::{become_child_subreaper, bootstrap_kernel_surface, spawn_sigchld_stream, spawn_uevent_stream}; use events::{ExitStatus, GraphEvent, ShutdownReason}; use graph::EnteGraph; use nix::errno::Errno; @@ -106,7 +106,7 @@ fn main() -> anyhow::Result<()> { } async fn primordial_loop( - seed_card: ente_card::EntityCard, + seed_card: arje_card::EntityCard, dev_mode: bool, checkpoint_path: Option, restore_path: Option, @@ -127,7 +127,7 @@ async fn primordial_loop( Ok(rx) => rx, Err(e) => { warn!(?e, "uevents deshabilitados (probablemente falta CAP_NET_ADMIN)"); - let (_keep_tx, rx) = mpsc::channel::(1); + let (_keep_tx, rx) = mpsc::channel::(1); std::mem::forget(_keep_tx); rx } @@ -137,7 +137,7 @@ async fn primordial_loop( // tenga adónde llegar. Su path se inyecta en ENTE_BUS_SOCK por soma. let bus_sock = bus::default_socket_path(); let bus_path = bus::spawn_bus(bus_sock, graph_tx.clone())?; - ente_soma::set_bus_sock(bus_path.to_string_lossy().into_owned()); + arje_soma::set_bus_sock(bus_path.to_string_lossy().into_owned()); // Brahman protocol: handshake socket + broker compartido. // @@ -285,7 +285,7 @@ async fn primordial_loop( // Umbrales relajados para que el demo (pocos eventos) produzca // cristales observables. Con P(b|a) normalizada a [0,1], los // valores típicos en muestras pequeñas son 0.2-0.5. - BrainState::with_params(1024, ente_brain::CrystallizationParams { + BrainState::with_params(1024, arje_brain::CrystallizationParams { min_support: 2, min_conditional_prob: 0.3, min_pmi: 1.0, @@ -300,13 +300,13 @@ async fn primordial_loop( let mut obs = brain.observer.write().await; // Reemplazar con un observer nuevo que tenga half-life. Estado // anterior (vacío en este punto) descartado. - *obs = ente_brain::Observer::new(1024).with_half_life(hl); + *obs = arje_brain::Observer::new(1024).with_half_life(hl); info!(hl_secs = hl, "observer con time-decay activo"); } if let Some(secs) = autopromote_secs { - ente_brain::spawn_autopromote_loop( + arje_brain::spawn_autopromote_loop( brain.clone(), - ente_brain::AutopromoteParams { + arje_brain::AutopromoteParams { interval_secs: secs, threshold: brain.params, // mismo threshold que crystals manuales }, @@ -322,7 +322,7 @@ async fn primordial_loop( Ok(snap) => { let total = snap.total; let kinds = snap.marginal.len(); - let restored = ente_brain::Observer::from_snapshot(snap); + let restored = arje_brain::Observer::from_snapshot(snap); *brain.observer.write().await = restored; info!( path = %brain_path.display(), @@ -337,7 +337,7 @@ async fn primordial_loop( // Si --audit-head, configuramos el head pointer y arrancamos auto-flush. if let Some(head_path) = audit_head { // Re-creamos el AuditLog con head pointer. - let new_audit = ente_brain::audit::AuditLog::new() + let new_audit = arje_brain::audit::AuditLog::new() .with_head_pointer(head_path); *brain.audit.write().await = new_audit; spawn_audit_auto_flush(brain.clone()); @@ -345,7 +345,7 @@ async fn primordial_loop( // Carga inicial de reglas desde JSON/JSONL si --rules path proporcionado. if let Some(path) = &rules_path { - match ente_brain::load_rules_file(path) { + match arje_brain::load_rules_file(path) { Ok(rules) => { let mut engine = brain.engine.write().await; for r in rules { @@ -367,7 +367,7 @@ async fn primordial_loop( Ok(addr) => { let s = brain.clone(); tokio::spawn(async move { - if let Err(e) = ente_brain::serve_metrics(s, addr).await { + if let Err(e) = arje_brain::serve_metrics(s, addr).await { warn!(?e, "metrics server cayó"); } }); @@ -536,14 +536,14 @@ async fn emit_death( fn spawn_echo_smoke_test(bus_path: PathBuf) { tokio::spawn(async move { tokio::time::sleep(Duration::from_millis(300)).await; - match ente_bus::BusClient::connect(&bus_path).await { + match arje_bus::BusClient::connect(&bus_path).await { Ok(mut client) => { - let req = ente_bus::BusRequest::Invoke { - cap: ente_echo::echo_capability(), + let req = arje_bus::BusRequest::Invoke { + cap: arje_echo::echo_capability(), blob: b"hola fractal forwardeado".to_vec(), }; match client.call(req).await { - Ok(ente_bus::BusResponse::Invoked { result }) => { + Ok(arje_bus::BusResponse::Invoked { result }) => { info!(echo = %String::from_utf8_lossy(&result), "Invoke ECHO round-trip OK"); } Ok(other) => warn!(?other, "Invoke ECHO respuesta inesperada"), @@ -555,7 +555,7 @@ fn spawn_echo_smoke_test(bus_path: PathBuf) { }); } -fn write_brain_snapshot(path: &std::path::Path, snap: &ente_brain::observer::ObserverSnapshot) -> anyhow::Result<()> { +fn write_brain_snapshot(path: &std::path::Path, snap: &arje_brain::observer::ObserverSnapshot) -> anyhow::Result<()> { let bytes = serde_json::to_vec_pretty(snap)?; if let Some(parent) = path.parent() { let _ = std::fs::create_dir_all(parent); } let tmp = path.with_extension("tmp"); @@ -564,16 +564,16 @@ fn write_brain_snapshot(path: &std::path::Path, snap: &ente_brain::observer::Obs Ok(()) } -fn read_brain_snapshot(path: &std::path::Path) -> anyhow::Result { +fn read_brain_snapshot(path: &std::path::Path) -> anyhow::Result { let bytes = std::fs::read(path)?; - let snap: ente_brain::observer::ObserverSnapshot = serde_json::from_slice(&bytes)?; + let snap: arje_brain::observer::ObserverSnapshot = serde_json::from_slice(&bytes)?; Ok(snap) } fn init_tracing() { use tracing_subscriber::{fmt, EnvFilter}; let filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("ente_zero=debug,info")); + .unwrap_or_else(|_| EnvFilter::new("arje_zero=debug,info")); fmt().with_env_filter(filter).with_target(true).init(); } @@ -625,7 +625,7 @@ async fn feed_brain( evt: &GraphEvent, ) { let Some((kind, subj)) = brain_glue::graph_event_to_brain(evt, graph) else { return }; - let history: Vec = { + let history: Vec = { let mut obs = brain.observer.write().await; obs.record(kind.clone()); // Snapshot de los últimos 16 eventos — suficiente para cualquier @@ -637,7 +637,7 @@ async fn feed_brain( engine.dispatch(&kind, &subj, &history) }; if !rules.is_empty() { - ente_brain::dispatch_actions(&rules, sink).await; + arje_brain::dispatch_actions(&rules, sink).await; } } diff --git a/crates/init/ente-zero/src/seed.rs b/crates/init/arje-zero/src/seed.rs similarity index 95% rename from crates/init/ente-zero/src/seed.rs rename to crates/init/arje-zero/src/seed.rs index fe01689..6d404f5 100644 --- a/crates/init/ente-zero/src/seed.rs +++ b/crates/init/arje-zero/src/seed.rs @@ -8,7 +8,7 @@ //! todas las capacidades del fractal. use anyhow::Context; -use ente_card::{ +use arje_card::{ Capability, CardError, CgroupSpec, EntityCard, NamespaceSet, Payload, ResourceLimits, SomaSpec, Supervision, CARD_SCHEMA_VERSION, }; @@ -33,7 +33,7 @@ pub fn load(dev_mode: bool, restore: Option<&Path>) -> anyhow::Result anyhow::Result { - let snap = ente_snapshot::FractalSnapshot::read(path) + let snap = arje_snapshot::FractalSnapshot::read(path) .with_context(|| format!("read snapshot {}", path.display()))?; info!( path = %path.display(), @@ -66,7 +66,7 @@ fn load_from_snapshot(path: &Path) -> anyhow::Result { fn load_or_synthesize(dev_mode: bool) -> anyhow::Result { // Buscamos primero `.json` (canónico), luego sin extensión por // compatibilidad con instalaciones que dejan el archivo crudo. La puerta - // genética se cruza vía `ente_brain::load_card_file` que pasa por + // genética se cruza vía `arje_brain::load_card_file` que pasa por // `validate()` extendido. let candidates: &[&str] = if dev_mode { &["seed.card.json", SEED_PATH_DEV] @@ -76,7 +76,7 @@ fn load_or_synthesize(dev_mode: bool) -> anyhow::Result { for cand in candidates { let path = PathBuf::from(cand); if !path.exists() { continue; } - let card = ente_brain::load_card_file(&path) + let card = arje_brain::load_card_file(&path) .with_context(|| format!("load {}", path.display()))?; info!(path = %path.display(), "Tarjeta Semilla cargada y validada"); return Ok(card); @@ -96,8 +96,8 @@ fn synthesize_dev_seed() -> EntityCard { // Pre-registramos el módulo Wasm demo en el CAS y obtenemos su SHA real. // Si el CAS no es escribible (raro en dev) caemos a un SHA cero — la // resolución fallará y el Wasm no encarnará, pero el resto queda intacto. - let demo_wasm_sha = match ente_wasm::demo_module_bytes() - .and_then(|b| ente_cas::store(&b)) + let demo_wasm_sha = match arje_wasm::demo_module_bytes() + .and_then(|b| arje_cas::store(&b)) { Ok(sha) => sha, Err(e) => { @@ -134,7 +134,7 @@ fn synthesize_dev_seed() -> EntityCard { if let Some(card) = optional_native_card( "demo-echo", "target/debug/ente-echo", - [ente_echo::echo_capability()].into_iter().collect(), + [arje_echo::echo_capability()].into_iter().collect(), restart_supervision(), ) { genesis.push(card); diff --git a/crates/init/ente-soma/Cargo.toml b/crates/init/ente-soma/Cargo.toml deleted file mode 100644 index dba4f57..0000000 --- a/crates/init/ente-soma/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "ente-soma" -version = "0.0.1" -edition.workspace = true -license.workspace = true -publish.workspace = true -description = "Wrapper histórico sobre ente-incarnate para mantener la API set_bus_sock+incarnate que usa ente-zero. Toda la lógica vive en ente-incarnate." - -[dependencies] -ente-card = { path = "../../protocol/ente-card" } -ente-bus = { path = "../../runtime/ente-bus" } -ente-incarnate = { path = "../ente-incarnate" } -nix = { workspace = true } -anyhow = { workspace = true } -tracing = { workspace = true } diff --git a/crates/modules/akasha/SDD.md b/crates/modules/chasqui/SDD.md similarity index 100% rename from crates/modules/akasha/SDD.md rename to crates/modules/chasqui/SDD.md diff --git a/crates/modules/akasha/card/Cargo.toml b/crates/modules/chasqui/card/Cargo.toml similarity index 95% rename from crates/modules/akasha/card/Cargo.toml rename to crates/modules/chasqui/card/Cargo.toml index 2af214c..8d966c6 100644 --- a/crates/modules/akasha/card/Cargo.toml +++ b/crates/modules/chasqui/card/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "akasha-card" +name = "chasqui-card" version.workspace = true edition.workspace = true rust-version.workspace = true diff --git a/crates/modules/akasha/card/src/lib.rs b/crates/modules/chasqui/card/src/lib.rs similarity index 98% rename from crates/modules/akasha/card/src/lib.rs rename to crates/modules/chasqui/card/src/lib.rs index c1c435d..c46181f 100644 --- a/crates/modules/akasha/card/src/lib.rs +++ b/crates/modules/chasqui/card/src/lib.rs @@ -1,4 +1,4 @@ -//! `akasha-card` — manifiesto de Mónada. +//! `chasqui-card` — manifiesto de Mónada. //! //! Una **Mónada** es una agrupación semántica de archivos: el archivo //! físico no se mueve, pero su pertenencia se modela por un objeto @@ -10,7 +10,7 @@ //! //! Diferencia con `brahman-card::Card`: //! -//! | brahman::Card | akasha::MonadManifest | +//! | brahman::Card | chasqui::MonadManifest | //! |-------------------------------------|-------------------------------| //! | Describe una **entidad runtime** | Describe una **agrupación** | //! | Tiene `payload`/`soma`/`supervision`| No tiene proceso detrás | @@ -18,7 +18,7 @@ //! | Fluye por handshake/postcard | Fluye por queries del backend | //! //! Este crate sólo define los tipos. La lógica de scan, cluster, -//! attraction vive en `akasha-core`. +//! attraction vive en `chasqui-core`. #![forbid(unsafe_code)] #![warn(rust_2018_idioms)] diff --git a/crates/modules/akasha/card/src/query.rs b/crates/modules/chasqui/card/src/query.rs similarity index 96% rename from crates/modules/akasha/card/src/query.rs rename to crates/modules/chasqui/card/src/query.rs index 125ba27..c4debb9 100644 --- a/crates/modules/akasha/card/src/query.rs +++ b/crates/modules/chasqui/card/src/query.rs @@ -1,12 +1,12 @@ -//! Wire types para consultar al daemon `akasha` por sus Mónadas. +//! Wire types para consultar al daemon `chasqui` por sus Mónadas. //! //! El daemon expone un Unix socket (cuyo path se publica en //! `Card.service_socket` y se descubre vía broker MatchEvent). Cada //! conexión es single-shot: una request JSON terminada en `\n`, //! una response JSON terminada en `\n`, cierre. //! -//! Mismo patrón que `akasha-nous` (mock/real ↔ akasha-core), reusado -//! ahora para que la UI (`akasha-explorer`) descubra y consulte al +//! Mismo patrón que `chasqui-nous` (mock/real ↔ chasqui-core), reusado +//! ahora para que la UI (`chasqui-explorer`) descubra y consulte al //! daemon sin hardcodear sockets ni pasar por brahman-admin. //! //! ## Contrato @@ -118,7 +118,7 @@ impl MonadView { /// Error de protocolo retornado en lugar de la response normal. #[derive(Debug, Clone, Serialize, Deserialize, Error)] -#[error("akasha-engine: {error}")] +#[error("chasqui-engine: {error}")] pub struct ErrorResponse { pub error: String, } @@ -135,7 +135,7 @@ pub mod transport { pub const SOCKET_ENV: &str = "NOUSER_ENGINE_SOCKET"; /// Nombre por defecto del socket. - pub const SOCKET_NAME: &str = "akasha-engine.sock"; + pub const SOCKET_NAME: &str = "chasqui-engine.sock"; /// Ruta canónica al socket del daemon. Honra `NOUSER_ENGINE_SOCKET` /// si está set, sino arma sobre `$XDG_RUNTIME_DIR` (con fallback @@ -154,7 +154,7 @@ pub mod transport { // ===================================================================== // Cliente blocking — vive con los wire types para que un consumer // (UI, CLI, otro módulo) pueda hablar con el daemon importando sólo -// `akasha-card`, sin arrastrar `akasha-core` (notify/walkdir/sled/blake3). +// `chasqui-card`, sin arrastrar `chasqui-core` (notify/walkdir/sled/blake3). // ===================================================================== /// Cliente síncrono para el query socket del daemon. Sólo Unix (el diff --git a/crates/modules/akasha/core/Cargo.toml b/crates/modules/chasqui/core/Cargo.toml similarity index 88% rename from crates/modules/akasha/core/Cargo.toml rename to crates/modules/chasqui/core/Cargo.toml index 4b7f88f..7b9e084 100644 --- a/crates/modules/akasha/core/Cargo.toml +++ b/crates/modules/chasqui/core/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "akasha-core" +name = "chasqui-core" version.workspace = true edition.workspace = true rust-version.workspace = true @@ -9,8 +9,8 @@ publish.workspace = true description = "Nouser — explorador de Mónadas: scanner, clustering determinista, DB en memoria." [dependencies] -akasha-card = { path = "../card" } -akasha-nous = { path = "../nous" } +chasqui-card = { path = "../card" } +chasqui-nous = { path = "../nous" } shuma-discern = { path = "../../shuma/shuma-discern" } brahman-card = { path = "../../../protocol/brahman-card" } brahman-handshake = { path = "../../../protocol/brahman-handshake" } @@ -29,5 +29,5 @@ notify = { workspace = true } tempfile = { workspace = true } [[bin]] -name = "akasha" +name = "chasqui" path = "src/bin/nouser.rs" diff --git a/crates/modules/akasha/core/src/bin/nouser.rs b/crates/modules/chasqui/core/src/bin/nouser.rs similarity index 91% rename from crates/modules/akasha/core/src/bin/nouser.rs rename to crates/modules/chasqui/core/src/bin/nouser.rs index 1209993..d652059 100644 --- a/crates/modules/akasha/core/src/bin/nouser.rs +++ b/crates/modules/chasqui/core/src/bin/nouser.rs @@ -1,4 +1,4 @@ -//! `akasha` CLI — explorador de Mónadas. +//! `chasqui` CLI — explorador de Mónadas. //! //! Subcomandos: //! @@ -13,14 +13,14 @@ use std::path::PathBuf; use std::process::ExitCode; -use akasha_core::{ +use chasqui_core::{ cluster, db, embed, scanner::{self, ScanConfig}, }; fn main() -> ExitCode { let args: Vec = std::env::args().collect(); - let prog = args.first().cloned().unwrap_or_else(|| "akasha".into()); + let prog = args.first().cloned().unwrap_or_else(|| "chasqui".into()); let sub = match args.get(1).map(String::as_str) { Some(s) => s, None => { @@ -41,7 +41,7 @@ fn main() -> ExitCode { return ExitCode::SUCCESS; } other => { - eprintln!("akasha: comando desconocido '{other}'"); + eprintln!("chasqui: comando desconocido '{other}'"); print_usage(&prog); return ExitCode::from(2); } @@ -50,7 +50,7 @@ fn main() -> ExitCode { match result { Ok(()) => ExitCode::SUCCESS, Err(e) => { - eprintln!("akasha: {e}"); + eprintln!("chasqui: {e}"); ExitCode::from(1) } } @@ -181,7 +181,7 @@ fn cmd_daemon(args: &[String]) -> Cmd { // 1. Decidir el path del query socket ANTES de armar el engine // Card (porque viaja como service_socket en la Card). - let query_socket = akasha_card::query::transport::default_socket_path(); + let query_socket = chasqui_card::query::transport::default_socket_path(); // 2. Engine como Ente. Declara service_socket + flow.output para // que el broker pueda emitir MatchEvent::Available a consumers @@ -190,7 +190,7 @@ fn cmd_daemon(args: &[String]) -> Cmd { let engine_id = engine_card.id; let engine_label = engine_card.label.clone(); eprintln!( - "akasha daemon: publicando engine '{}' (kind=Ente, id={}, socket={})", + "chasqui daemon: publicando engine '{}' (kind=Ente, id={}, socket={})", engine_label, engine_id, query_socket.display() @@ -227,7 +227,7 @@ fn cmd_daemon(args: &[String]) -> Cmd { hydrated += 1; } eprintln!( - "akasha daemon: hidratadas {} mónadas previas{} en O(1)", + "chasqui daemon: hidratadas {} mónadas previas{} en O(1)", hydrated, if skipped_model > 0 { format!(" ({} dropeadas por centroid_model distinto)", skipped_model) @@ -245,7 +245,7 @@ fn cmd_daemon(args: &[String]) -> Cmd { let monads = cluster::by_directory_hydrated(&files, min_files(), Some(&db)); let scanned_count = monads.len(); eprintln!( - "akasha daemon: re-scan {} archivos en {} → {} mónadas", + "chasqui daemon: re-scan {} archivos en {} → {} mónadas", n_files, dir.display(), scanned_count @@ -276,7 +276,7 @@ fn cmd_daemon(args: &[String]) -> Cmd { db.replace_monads(monads); eprintln!( - "akasha daemon: 1 ente + {} mónadas vivas ({} nuevas vs hidratación)", + "chasqui daemon: 1 ente + {} mónadas vivas ({} nuevas vs hidratación)", scanned_count, newly_spawned ); @@ -285,8 +285,8 @@ fn cmd_daemon(args: &[String]) -> Cmd { // Si el bind falla, seguimos sin él — la UI degrada a "no // alcanzable" pero el daemon sigue procesando cambios. let db_shared = std::sync::Arc::new(std::sync::Mutex::new(db)); - let _query_listener = match akasha_core::engine_socket::spawn_listener( - akasha_core::engine_socket::ListenerConfig { + let _query_listener = match chasqui_core::engine_socket::spawn_listener( + chasqui_core::engine_socket::ListenerConfig { socket_path: query_socket.clone(), engine_id, engine_label: engine_label.clone(), @@ -296,14 +296,14 @@ fn cmd_daemon(args: &[String]) -> Cmd { ) { Ok(h) => { eprintln!( - "akasha daemon: query socket activo en {} (proto: akasha_card::query)", + "chasqui daemon: query socket activo en {} (proto: chasqui_card::query)", query_socket.display() ); Some(h) } Err(e) => { eprintln!( - "akasha daemon: query socket NO disponible ({e}) — explorer no podrá consultar" + "chasqui daemon: query socket NO disponible ({e}) — explorer no podrá consultar" ); None } @@ -322,14 +322,14 @@ fn cmd_daemon(args: &[String]) -> Cmd { ) { Ok(w) => { eprintln!( - "akasha daemon: watcher activo en {} (debounce 150ms, re-publish on) — Ctrl-C para terminar.", + "chasqui daemon: watcher activo en {} (debounce 150ms, re-publish on) — Ctrl-C para terminar.", dir.display() ); Some(w) } Err(e) => { eprintln!( - "akasha daemon: watcher deshabilitado ({e}) — Ctrl-C para terminar." + "chasqui daemon: watcher deshabilitado ({e}) — Ctrl-C para terminar." ); None } @@ -385,7 +385,7 @@ fn spawn_fs_watcher( // Dispatcher: notify → filtro → canal de paths. let dispatch_dir = dir.clone(); std::thread::Builder::new() - .name("akasha-watcher-dispatch".into()) + .name("chasqui-watcher-dispatch".into()) .spawn(move || { for res in notify_rx { let event = match res { @@ -416,7 +416,7 @@ fn spawn_fs_watcher( // Coordinator: debounce + batch dispatch. let coord_dir = dir; std::thread::Builder::new() - .name("akasha-watcher-coord".into()) + .name("chasqui-watcher-coord".into()) .spawn(move || { let debounce = std::time::Duration::from_millis(WATCHER_DEBOUNCE_MS); let mut pending: std::collections::HashMap< @@ -494,7 +494,7 @@ fn process_change_batch( } }; - let prior_monads: Vec = db_lock.monads().cloned().collect(); + let prior_monads: Vec = db_lock.monads().cloned().collect(); let prior_ref: &db::MonadDb = &db_lock; let monads = cluster::by_directory_hydrated(&files, min_files(), Some(prior_ref)); @@ -601,8 +601,8 @@ fn cmd_attract(args: &[String]) -> Cmd { .and_then(|t| t.duration_since(std::time::UNIX_EPOCH).ok()) .map(|d| d.as_millis() as u64) .unwrap_or(0); - let target = akasha_card::FileEntry { - id: akasha_card::FileId::from(akasha_card::ulid::Ulid::new()), + let target = chasqui_card::FileEntry { + id: chasqui_card::FileId::from(chasqui_card::ulid::Ulid::new()), path: file_path.clone(), content_hash: None, size: metadata.len(), @@ -630,7 +630,7 @@ fn cmd_attract(args: &[String]) -> Cmd { // Filtramos Mónadas cuyo centroid_model NO matchee. Mezclar // 32-d con 384-d daría scores sin sentido (diferente semántica // y cosine no compara cross-modelo). - let mut ranked: Vec<(&akasha_card::MonadManifest, f32)> = db + let mut ranked: Vec<(&chasqui_card::MonadManifest, f32)> = db .monads() .filter(|m| !m.centroid.is_empty()) .filter(|m| match &m.centroid_model { @@ -700,7 +700,7 @@ fn cmd_attract(args: &[String]) -> Cmd { /// Devuelve `(embedding, model_id)` — el caller necesita ambos para /// comparar contra centroides taggeados con su mismo `centroid_model`. fn remote_embed( - file: &akasha_card::FileEntry, + file: &chasqui_card::FileEntry, ) -> Result<(Vec, String), Box> { if let Ok(explicit) = std::env::var("NOUSER_NOUS_SOCKET") { let sock = std::path::PathBuf::from(explicit); @@ -708,9 +708,9 @@ fn remote_embed( } let consumer = brahman_sidecar::build_consumer_card( - "akasha.attract-cli", - akasha_nous::FLOW_EMBED_RESULT, - akasha_nous::FLOW_TYPE_NAME, + "chasqui.attract-cli", + chasqui_nous::FLOW_EMBED_RESULT, + chasqui_nous::FLOW_TYPE_NAME, ); let producer_sock = brahman_sidecar::await_provider_blocking( consumer, @@ -719,12 +719,12 @@ fn remote_embed( embed_via(&producer_sock, file) } -/// RPC blocking contra un socket akasha-nous concreto. Devuelve +/// RPC blocking contra un socket chasqui-nous concreto. Devuelve /// `(embedding, model_id)` — el `model_id` viaja en la response y /// permite al caller saber qué centroides son comparables. fn embed_via( sock_path: &std::path::Path, - file: &akasha_card::FileEntry, + file: &chasqui_card::FileEntry, ) -> Result<(Vec, String), Box> { use std::io::{BufRead, BufReader, Write}; use std::os::unix::net::UnixStream; @@ -734,9 +734,9 @@ fn embed_via( } let mut stream = UnixStream::connect(sock_path)?; - let req = akasha_nous::EmbedRequest { - kind: akasha_nous::RequestKind::EmbedFile, - payload: serde_json::to_value(akasha_nous::EmbedFilePayload { + let req = chasqui_nous::EmbedRequest { + kind: chasqui_nous::RequestKind::EmbedFile, + payload: serde_json::to_value(chasqui_nous::EmbedFilePayload { path: file.path.display().to_string(), extension: file.extension.clone(), size: file.size, @@ -752,14 +752,14 @@ fn embed_via( let mut response = String::new(); reader.read_line(&mut response)?; if response.is_empty() { - return Err("akasha-nous cerró sin respuesta".into()); + return Err("chasqui-nous cerró sin respuesta".into()); } - if let Ok(resp) = serde_json::from_str::(&response) { + if let Ok(resp) = serde_json::from_str::(&response) { return Ok((resp.embedding, resp.model)); } - let err: akasha_nous::ErrorResponse = serde_json::from_str(&response)?; - Err(format!("akasha-nous: {}", err.error).into()) + let err: chasqui_nous::ErrorResponse = serde_json::from_str(&response)?; + Err(format!("chasqui-nous: {}", err.error).into()) } /// Card del propio engine (kind=Ente). Es el "ser" que produce y @@ -771,7 +771,7 @@ fn embed_via( /// brahman-admin. fn build_engine_card(service_socket: std::path::PathBuf) -> brahman_card::Card { use brahman_card::{Card, CardKind, Flow, Flows, Lifecycle, Payload, Priority, Supervision, TypeRef}; - use akasha_card::query::{FLOW_MONAD_LIST, FLOW_TYPE_NAME}; + use chasqui_card::query::{FLOW_MONAD_LIST, FLOW_TYPE_NAME}; Card { payload: Payload::Virtual, diff --git a/crates/modules/akasha/core/src/cluster.rs b/crates/modules/chasqui/core/src/cluster.rs similarity index 99% rename from crates/modules/akasha/core/src/cluster.rs rename to crates/modules/chasqui/core/src/cluster.rs index 2aad513..85af5b5 100644 --- a/crates/modules/akasha/core/src/cluster.rs +++ b/crates/modules/chasqui/core/src/cluster.rs @@ -15,7 +15,7 @@ use std::collections::BTreeMap; use std::path::PathBuf; -use akasha_card::{FileEntry, Lens, MonadManifest}; +use chasqui_card::{FileEntry, Lens, MonadManifest}; use crate::embed; @@ -236,7 +236,7 @@ fn shannon_entropy_normalized(files: &[&FileEntry]) -> f32 { #[cfg(test)] mod tests { use super::*; - use akasha_card::FileId; + use chasqui_card::FileId; use std::path::PathBuf; use ulid::Ulid; diff --git a/crates/modules/akasha/core/src/db.rs b/crates/modules/chasqui/core/src/db.rs similarity index 99% rename from crates/modules/akasha/core/src/db.rs rename to crates/modules/chasqui/core/src/db.rs index 0045a86..6674015 100644 --- a/crates/modules/akasha/core/src/db.rs +++ b/crates/modules/chasqui/core/src/db.rs @@ -12,7 +12,7 @@ use std::collections::BTreeMap; use std::path::Path; -use akasha_card::{FileEntry, FileId, MonadId, MonadManifest}; +use chasqui_card::{FileEntry, FileId, MonadId, MonadManifest}; use thiserror::Error; #[derive(Debug, Error)] @@ -188,7 +188,7 @@ fn decode_key(k: &[u8]) -> Result { #[cfg(test)] mod tests { use super::*; - use akasha_card::Lens; + use chasqui_card::Lens; use ulid::Ulid; fn mk_file(path: &str) -> FileEntry { diff --git a/crates/modules/akasha/core/src/embed.rs b/crates/modules/chasqui/core/src/embed.rs similarity index 98% rename from crates/modules/akasha/core/src/embed.rs rename to crates/modules/chasqui/core/src/embed.rs index 245ebbf..4113d5e 100644 --- a/crates/modules/akasha/core/src/embed.rs +++ b/crates/modules/chasqui/core/src/embed.rs @@ -27,7 +27,7 @@ //! - Dirs distintos + misma ext → similitud ~ 0.5. //! - Sin parecido → similitud < 0.3. -use akasha_card::{FileEntry, MonadId, MonadManifest}; +use chasqui_card::{FileEntry, MonadId, MonadManifest}; /// Dimensión del vector embedding. pub const EMBED_DIM: usize = 32; @@ -37,7 +37,7 @@ pub const EMBED_DIM: usize = 32; /// este string contra el suyo antes de hacer cosine similarity. /// Mezclar centroides de distinto MODEL_ID corrompe scores /// silenciosamente (dimensiones distintas, semántica distinta). -pub const MODEL_ID: &str = "akasha-pseudo-32d"; +pub const MODEL_ID: &str = "chasqui-pseudo-32d"; /// Computa el embedding de un archivo. Determinístico: misma input /// → mismo vector. El vector queda L2-normalizado. @@ -185,7 +185,7 @@ pub const DEFAULT_ATTRACTION_THRESHOLD: f32 = 0.7; #[cfg(test)] mod tests { use super::*; - use akasha_card::FileId; + use chasqui_card::FileId; use std::path::PathBuf; use ulid::Ulid; diff --git a/crates/modules/akasha/core/src/engine_socket.rs b/crates/modules/chasqui/core/src/engine_socket.rs similarity index 90% rename from crates/modules/akasha/core/src/engine_socket.rs rename to crates/modules/chasqui/core/src/engine_socket.rs index 2b81de1..988aeaa 100644 --- a/crates/modules/akasha/core/src/engine_socket.rs +++ b/crates/modules/chasqui/core/src/engine_socket.rs @@ -1,13 +1,13 @@ -//! Listener Unix-socket que sirve [`akasha_card::query::QueryRequest`]. +//! Listener Unix-socket que sirve [`chasqui_card::query::QueryRequest`]. //! -//! El daemon `akasha` lo monta para que cualquier consumer (UI, CLI, +//! El daemon `chasqui` lo monta para que cualquier consumer (UI, CLI, //! otro módulo) pueda preguntarle por sus Mónadas sin pasar por //! brahman-admin. El path del socket viaja en el `Card.service_socket` //! del engine; el broker brahman lo enseña vía MatchEvent::Available //! cuando un consumer declara `flow.input = monad-list:json`. //! //! Wire: line-delimited JSON, single-shot por conexión. Mismo patrón -//! que `akasha-nous` (mock/real ↔ akasha-core), reutilizado. +//! que `chasqui-nous` (mock/real ↔ chasqui-core), reutilizado. //! //! Threading: un thread dedicado, blocking I/O. No vale la pena traer //! tokio acá — la frecuencia esperada es muy baja (UI poll cada 2s) @@ -18,10 +18,10 @@ use std::os::unix::net::{UnixListener, UnixStream}; use std::path::PathBuf; use std::sync::{Arc, Mutex}; -use akasha_card::query::{ +use chasqui_card::query::{ EngineInfo, ErrorResponse, ListMonadsResponse, MonadView, QueryRequest, }; -use akasha_card::ulid::Ulid; +use chasqui_card::ulid::Ulid; use crate::db::MonadDb; @@ -54,7 +54,7 @@ pub fn spawn_listener( let listener = UnixListener::bind(&config.socket_path)?; let handle = std::thread::Builder::new() - .name("akasha-engine-listener".into()) + .name("chasqui-engine-listener".into()) .spawn(move || { for conn in listener.incoming() { match conn { @@ -126,17 +126,17 @@ fn encode_error(msg: String) -> String { serde_json::to_string(&err).unwrap_or_else(|_| "{\"error\":\"encode\"}".into()) } -// El cliente blocking vive en `akasha_card::query::client` — junto a +// El cliente blocking vive en `chasqui_card::query::client` — junto a // los wire types — para que un consumer pueda hablar con el daemon -// importando sólo `akasha-card`, sin arrastrar el peso de -// `akasha-core` (scanner / db / sled / notify / walkdir / blake3). +// importando sólo `chasqui-card`, sin arrastrar el peso de +// `chasqui-core` (scanner / db / sled / notify / walkdir / blake3). #[cfg(test)] mod tests { use super::*; use crate::db::MonadDb; - use akasha_card::query::client as query_client; - use akasha_card::MonadManifest; + use chasqui_card::query::client as query_client; + use chasqui_card::MonadManifest; use std::time::Duration; fn fresh_socket_path(name: &str) -> PathBuf { @@ -147,7 +147,7 @@ mod tests { #[test] fn list_monads_roundtrip_empty() { - let socket = fresh_socket_path("akasha-engine-test"); + let socket = fresh_socket_path("chasqui-engine-test"); let db = Arc::new(Mutex::new(MonadDb::new())); let engine_id = Ulid::new(); let _h = spawn_listener( @@ -178,7 +178,7 @@ mod tests { #[test] fn list_monads_returns_views() { - let socket = fresh_socket_path("akasha-engine-test-views"); + let socket = fresh_socket_path("chasqui-engine-test-views"); let db = Arc::new(Mutex::new(MonadDb::new())); let m1 = MonadManifest::new("alpha"); let m2 = MonadManifest::new("beta"); @@ -209,7 +209,7 @@ mod tests { #[test] fn invalid_request_returns_error_response() { - let socket = fresh_socket_path("akasha-engine-test-bad"); + let socket = fresh_socket_path("chasqui-engine-test-bad"); let db = Arc::new(Mutex::new(MonadDb::new())); let _h = spawn_listener( ListenerConfig { diff --git a/crates/modules/akasha/core/src/lib.rs b/crates/modules/chasqui/core/src/lib.rs similarity index 93% rename from crates/modules/akasha/core/src/lib.rs rename to crates/modules/chasqui/core/src/lib.rs index 8572c84..e0ce4f1 100644 --- a/crates/modules/akasha/core/src/lib.rs +++ b/crates/modules/chasqui/core/src/lib.rs @@ -1,4 +1,4 @@ -//! `akasha-core` — el explorador de Mónadas. +//! `chasqui-core` — el explorador de Mónadas. //! //! Implementa la pipeline determinista descrita en el diseño de Kairos: //! @@ -31,4 +31,4 @@ pub mod embed; pub mod engine_socket; pub mod scanner; -pub use akasha_card::*; +pub use chasqui_card::*; diff --git a/crates/modules/akasha/core/src/scanner.rs b/crates/modules/chasqui/core/src/scanner.rs similarity index 99% rename from crates/modules/akasha/core/src/scanner.rs rename to crates/modules/chasqui/core/src/scanner.rs index 3c12cf5..520263c 100644 --- a/crates/modules/akasha/core/src/scanner.rs +++ b/crates/modules/chasqui/core/src/scanner.rs @@ -6,7 +6,7 @@ use std::path::{Path, PathBuf}; use std::time::UNIX_EPOCH; -use akasha_card::{FileEntry, FileId}; +use chasqui_card::{FileEntry, FileId}; use thiserror::Error; use ulid::Ulid; use walkdir::WalkDir; diff --git a/crates/modules/akasha/nous-mock/Cargo.toml b/crates/modules/chasqui/nous-mock/Cargo.toml similarity index 80% rename from crates/modules/akasha/nous-mock/Cargo.toml rename to crates/modules/chasqui/nous-mock/Cargo.toml index ed40eb8..f05d903 100644 --- a/crates/modules/akasha/nous-mock/Cargo.toml +++ b/crates/modules/chasqui/nous-mock/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "akasha-nous-mock" +name = "chasqui-nous-mock" version.workspace = true edition.workspace = true rust-version.workspace = true @@ -11,9 +11,9 @@ description = "Nouser — Nous mock determinístico: implementa el contrato nous [dependencies] brahman-card = { path = "../../../protocol/brahman-card" } brahman-sidecar = { path = "../../../protocol/brahman-sidecar" } -akasha-card = { path = "../card" } -akasha-core = { path = "../core" } -akasha-nous = { path = "../nous" } +chasqui-card = { path = "../card" } +chasqui-core = { path = "../core" } +chasqui-nous = { path = "../nous" } serde_json = { workspace = true } tokio = { workspace = true } tracing = { workspace = true } @@ -21,5 +21,5 @@ tracing-subscriber = { workspace = true } ulid = { workspace = true } [[bin]] -name = "akasha-nous-mock" +name = "chasqui-nous-mock" path = "src/main.rs" diff --git a/crates/modules/akasha/nous-mock/src/main.rs b/crates/modules/chasqui/nous-mock/src/main.rs similarity index 92% rename from crates/modules/akasha/nous-mock/src/main.rs rename to crates/modules/chasqui/nous-mock/src/main.rs index 6d2d2ed..8793857 100644 --- a/crates/modules/akasha/nous-mock/src/main.rs +++ b/crates/modules/chasqui/nous-mock/src/main.rs @@ -1,7 +1,7 @@ -//! `akasha-nous-mock` — proveedor de embeddings determinista (sin LLM). +//! `chasqui-nous-mock` — proveedor de embeddings determinista (sin LLM). //! -//! Implementa el contrato `akasha-nous` usando los pseudo-embeddings -//! de Phase C (`akasha_core::embed`). Sirve como: +//! Implementa el contrato `chasqui-nous` usando los pseudo-embeddings +//! de Phase C (`chasqui_core::embed`). Sirve como: //! //! - **Mock para tests**: en `BRAHMAN_BROKER_CONTEXT=test`, el //! `priority_offset` per-contexto declarado en su Card lo prioriza @@ -16,7 +16,7 @@ //! `priority_contexts.test = { priority_offset: +1 }` lo prioriza //! cuando el broker corre bajo contexto test. //! 2. Bind del Unix socket en `$NOUSER_NOUS_SOCKET` (default -//! `$XDG_RUNTIME_DIR/akasha-nous.sock`). +//! `$XDG_RUNTIME_DIR/chasqui-nous.sock`). //! 3. Loop: accept → read line JSON → process → write line JSON → close. //! 4. Cada request se loggea (info) — útil para verificar que el //! consumidor está usando este proveedor. @@ -29,9 +29,9 @@ use brahman_card::{ ulid::Ulid, Card, CardKind, ContextBias, Flow, Flows, Lifecycle, Payload, Priority, Supervision, TypeRef, }; -use akasha_card::FileEntry; -use akasha_core::embed; -use akasha_nous::{ +use chasqui_card::FileEntry; +use chasqui_core::embed; +use chasqui_nous::{ transport, EmbedFilePayload, EmbedRequest, EmbedResponse, EmbedTextPayload, ErrorResponse, PingResponse, RequestKind, FLOW_EMBED_REQUEST, FLOW_EMBED_RESULT, FLOW_TYPE_NAME, }; @@ -39,11 +39,11 @@ use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader}; use tokio::net::{UnixListener, UnixStream}; use tracing::{info, warn}; -/// El mock implementa el MISMO algoritmo que `akasha_core::embed`, +/// El mock implementa el MISMO algoritmo que `chasqui_core::embed`, /// así que reportamos el mismo `MODEL_ID` que él. De otro modo el /// consumer filtraría las Mónadas como "modelo distinto" y los /// scores quedarían vacíos. -const MODEL_ID: &str = akasha_core::embed::MODEL_ID; +const MODEL_ID: &str = chasqui_core::embed::MODEL_ID; #[tokio::main(flavor = "current_thread")] async fn main() -> std::io::Result<()> { @@ -60,7 +60,7 @@ async fn main() -> std::io::Result<()> { std::fs::create_dir_all(parent)?; } let listener = UnixListener::bind(&sock_path)?; - info!(socket = %sock_path.display(), "akasha-nous-mock escuchando"); + info!(socket = %sock_path.display(), "chasqui-nous-mock escuchando"); // 2. Sidecar al brahman-init con la Card que declara el socket. let card = build_card(sock_path.clone()); @@ -107,7 +107,7 @@ fn build_card(service_socket: std::path::PathBuf) -> Card { Card { schema_version: brahman_card::CARD_SCHEMA_VERSION, id: Ulid::new(), - label: "akasha.nous_mock".into(), + label: "chasqui.nous_mock".into(), payload: Payload::Virtual, supervision: Supervision::Delegate, lifecycle: Lifecycle::Daemon, @@ -178,7 +178,7 @@ fn handle_embed_file(payload: serde_json::Value, started: Instant) -> Result Result PathBuf { .map(|h| PathBuf::from(h).join(".cache")) }) .unwrap_or_else(std::env::temp_dir); - base.join("brahman").join("akasha-nous-real-embed-cache.sled") + base.join("brahman").join("chasqui-nous-real-embed-cache.sled") } fn build_key(file_sha: &[u8; 32], model_id: &str) -> Vec { @@ -139,7 +139,7 @@ mod tests { use super::*; fn sha(s: &[u8]) -> [u8; 32] { - ente_cas::sha256_of(s) + arje_cas::sha256_of(s) } #[test] diff --git a/crates/modules/akasha/nous-real/src/embeddings.rs b/crates/modules/chasqui/nous-real/src/embeddings.rs similarity index 96% rename from crates/modules/akasha/nous-real/src/embeddings.rs rename to crates/modules/chasqui/nous-real/src/embeddings.rs index abd9e85..28b0078 100644 --- a/crates/modules/akasha/nous-real/src/embeddings.rs +++ b/crates/modules/chasqui/nous-real/src/embeddings.rs @@ -20,7 +20,7 @@ use std::sync::Arc; use std::time::Instant; use fastembed::{EmbeddingModel, InitOptions, TextEmbedding}; -use akasha_nous::{ +use chasqui_nous::{ EmbedFilePayload, EmbedRequest, EmbedResponse, EmbedTextPayload, ErrorResponse, PingResponse, RequestKind, }; @@ -135,13 +135,13 @@ fn handle_file( // bajo la semántica del proveedor (el modelo nunca vio los bytes // adicionales). Si la cabeza cambia, el hash cambia y caemos a // re-embed naturalmente. - let file_sha = ente_cas::sha256_of(&buf); + let file_sha = arje_cas::sha256_of(&buf); if let Some(cache) = cache { if let Some(cached) = cache.get(&file_sha, model_id) { info!( path = %p.path, - sha = %ente_cas::hex(&file_sha), + sha = %arje_cas::hex(&file_sha), bytes = n, "embed_file: cache HIT" ); @@ -156,7 +156,7 @@ fn handle_file( info!( path = %p.path, - sha = %ente_cas::hex(&file_sha), + sha = %arje_cas::hex(&file_sha), bytes = n, "embed_file: cache MISS — invocando modelo" ); @@ -166,9 +166,9 @@ fn handle_file( // el cache (sled lo es) pero deja un registro consultable por // herramientas como `ente-cas gc` y permite que otros consumers // resuelvan los bytes por hash. - if let Err(e) = ente_cas::store(&buf) { + if let Err(e) = arje_cas::store(&buf) { // No-fatal: si CAS no escribe, cacheamos el embedding igual. - warn!(error = %e, "ente_cas::store falló (no-fatal)"); + warn!(error = %e, "arje_cas::store falló (no-fatal)"); } let text = String::from_utf8_lossy(&buf).to_string(); diff --git a/crates/modules/akasha/nous-real/src/main.rs b/crates/modules/chasqui/nous-real/src/main.rs similarity index 89% rename from crates/modules/akasha/nous-real/src/main.rs rename to crates/modules/chasqui/nous-real/src/main.rs index 0a4ea99..8a84f19 100644 --- a/crates/modules/akasha/nous-real/src/main.rs +++ b/crates/modules/chasqui/nous-real/src/main.rs @@ -1,21 +1,21 @@ -//! `akasha-nous-real` — proveedor Nous con LLM real (gated por feature). +//! `chasqui-nous-real` — proveedor Nous con LLM real (gated por feature). //! //! ## Build modes //! -//! - `cargo build -p akasha-nous-real` +//! - `cargo build -p chasqui-nous-real` //! Compila como **stub**: bin que arranca, sidecarea al brahman-init //! pero rechaza toda request con un error explicando que falta la //! feature. Útil para que `cargo build --workspace` no requiera ML //! deps. //! -//! - `cargo build -p akasha-nous-real --features embeddings` +//! - `cargo build -p chasqui-nous-real --features embeddings` //! Compila con `fastembed` + ONNX Runtime descargado por Cargo. //! Modelo default: `all-MiniLM-L6-v2` (384-d, ~80 MB descargado al //! primer run y cacheado en `~/.cache/fastembed`). //! //! ## Diseño //! -//! Mismo contrato wire que `akasha-nous-mock` (`akasha-nous` crate). La +//! Mismo contrato wire que `chasqui-nous-mock` (`chasqui-nous` crate). La //! diferencia operativa: real produce 384-d con semantic content //! (text-embedding del modelo); mock produce 32-d con metadata-hashing. //! No son intercambiables a media-deployment — los centroides de @@ -36,7 +36,7 @@ use brahman_card::{ ulid::Ulid, Card, CardKind, ContextBias, Flow, Flows, Lifecycle, Payload, Priority, Supervision, TypeRef, }; -use akasha_nous::{transport, FLOW_EMBED_REQUEST, FLOW_EMBED_RESULT, FLOW_TYPE_NAME}; +use chasqui_nous::{transport, FLOW_EMBED_REQUEST, FLOW_EMBED_RESULT, FLOW_TYPE_NAME}; use tokio::net::UnixListener; use tracing::info; @@ -63,11 +63,11 @@ async fn main() -> std::io::Result<()> { #[cfg(not(feature = "embeddings"))] info!( - "akasha-nous-real corriendo en modo STUB (compilá con \ + "chasqui-nous-real corriendo en modo STUB (compilá con \ --features embeddings para activar el modelo)" ); - // 1. Resolver socket del data-plane (default `akasha-nous-real.sock`, + // 1. Resolver socket del data-plane (default `chasqui-nous-real.sock`, // distinto del mock para coexistir). let sock_path = transport::provider_socket_path("real"); if sock_path.exists() { @@ -77,7 +77,7 @@ async fn main() -> std::io::Result<()> { std::fs::create_dir_all(parent)?; } let listener = UnixListener::bind(&sock_path)?; - info!(socket = %sock_path.display(), "akasha-nous-real escuchando"); + info!(socket = %sock_path.display(), "chasqui-nous-real escuchando"); // 2. Sidecar al brahman-init con Card declarando el socket. let card = build_card(sock_path.clone()); @@ -144,7 +144,7 @@ fn init_tracing() { } /// Card que real-nous anuncia. Idéntica al mock excepto por: -/// - label distinto (`akasha.nous_real`) para que coexistan en el broker. +/// - label distinto (`chasqui.nous_real`) para que coexistan en el broker. /// - `priority_contexts.prod = +1` (gana en contexto prod). /// - `service_socket` propio para que clientes lo descubran directo. fn build_card(service_socket: std::path::PathBuf) -> Card { @@ -160,7 +160,7 @@ fn build_card(service_socket: std::path::PathBuf) -> Card { Card { schema_version: brahman_card::CARD_SCHEMA_VERSION, id: Ulid::new(), - label: "akasha.nous_real".into(), + label: "chasqui.nous_real".into(), payload: Payload::Virtual, supervision: Supervision::Delegate, lifecycle: Lifecycle::Daemon, diff --git a/crates/modules/akasha/nous-real/src/stub.rs b/crates/modules/chasqui/nous-real/src/stub.rs similarity index 84% rename from crates/modules/akasha/nous-real/src/stub.rs rename to crates/modules/chasqui/nous-real/src/stub.rs index 8665960..78004aa 100644 --- a/crates/modules/akasha/nous-real/src/stub.rs +++ b/crates/modules/chasqui/nous-real/src/stub.rs @@ -1,7 +1,7 @@ //! Modo stub: arranca el bin pero rechaza las requests con un error //! que explica que falta la feature `embeddings`. -use akasha_nous::{EmbedRequest, ErrorResponse}; +use chasqui_nous::{EmbedRequest, ErrorResponse}; use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader}; use tokio::net::UnixStream; use tracing::warn; @@ -21,8 +21,8 @@ pub async fn handle_conn(stream: UnixStream) -> std::io::Result<()> { let resp = ErrorResponse { error: format!( - "akasha-nous-real compilado sin la feature `embeddings`. \ - Rebuild con: cargo build -p akasha-nous-real --features embeddings" + "chasqui-nous-real compilado sin la feature `embeddings`. \ + Rebuild con: cargo build -p chasqui-nous-real --features embeddings" ), }; let mut stream = reader.into_inner(); diff --git a/crates/modules/akasha/nous/Cargo.toml b/crates/modules/chasqui/nous/Cargo.toml similarity index 95% rename from crates/modules/akasha/nous/Cargo.toml rename to crates/modules/chasqui/nous/Cargo.toml index 29d0bf4..db8df3f 100644 --- a/crates/modules/akasha/nous/Cargo.toml +++ b/crates/modules/chasqui/nous/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "akasha-nous" +name = "chasqui-nous" version.workspace = true edition.workspace = true rust-version.workspace = true diff --git a/crates/modules/akasha/nous/src/lib.rs b/crates/modules/chasqui/nous/src/lib.rs similarity index 92% rename from crates/modules/akasha/nous/src/lib.rs rename to crates/modules/chasqui/nous/src/lib.rs index 4a6b957..d85e37d 100644 --- a/crates/modules/akasha/nous/src/lib.rs +++ b/crates/modules/chasqui/nous/src/lib.rs @@ -1,6 +1,6 @@ -//! `akasha-nous` — el contrato del proveedor de embeddings. +//! `chasqui-nous` — el contrato del proveedor de embeddings. //! -//! Define el wire-format compartido entre `akasha-core` (consumidor) y +//! Define el wire-format compartido entre `chasqui-core` (consumidor) y //! cualquier implementación de Nous (mock determinista o LLM real). El //! protocolo es **line-delimited JSON** sobre Unix socket: cada conexión //! envía una request, recibe una response, y cierra. Single-shot por @@ -21,8 +21,8 @@ //! //! ## Por qué un crate aparte //! -//! El consumidor (akasha-core) y el proveedor (akasha-nous-mock, -//! akasha-nous-real) deben acordar en types EXACTOS. Tener el contrato +//! El consumidor (chasqui-core) y el proveedor (chasqui-nous-mock, +//! chasqui-nous-real) deben acordar en types EXACTOS. Tener el contrato //! en su crate evita que cada lado declare structs paralelos que se //! desincronizan. Si bumpeás el wire, bumpeás aquí. //! @@ -32,7 +32,7 @@ //! el mismo `flow.output: { name: "embed-result", type: ... }` y //! `flow.input: "embed-request"`. El broker brahman los matchea contra //! los consumidores; el `priority_offset` per-contexto del Card hace que -//! mock-nous gane en `test` y real-nous en `prod`. akasha-core sólo +//! mock-nous gane en `test` y real-nous en `prod`. chasqui-core sólo //! consume el flow, sin saber cuál implementación corre. #![forbid(unsafe_code)] @@ -118,7 +118,7 @@ pub mod transport { pub const SOCKET_ENV: &str = "NOUSER_NOUS_SOCKET"; /// Nombre genérico del socket cuando hay un solo proveedor. - pub const SOCKET_NAME: &str = "akasha-nous.sock"; + pub const SOCKET_NAME: &str = "chasqui-nous.sock"; /// Ruta canónica al socket cuando un único proveedor está activo /// (consumidores que no quieren elegir). @@ -136,7 +136,7 @@ pub mod transport { if let Ok(p) = std::env::var(SOCKET_ENV) { return PathBuf::from(p); } - runtime_base().join(format!("akasha-nous-{}.sock", provider)) + runtime_base().join(format!("chasqui-nous-{}.sock", provider)) } fn runtime_base() -> PathBuf { diff --git a/crates/modules/fana/SDD.md b/crates/modules/fana/SDD.md new file mode 100644 index 0000000..32f5d5d --- /dev/null +++ b/crates/modules/fana/SDD.md @@ -0,0 +1,71 @@ +# modules/fana/ — Writer DAG editor (absorbe pluma) + +**Propósito.** Editor de escritura multidimensional: el documento es un +DAG de átomos narrativos con ramas (timelines), tracking de coherencia, +e indexación semántica. Absorbe el linaje markdown de `pluma`. Prioridad +alta entre las apps. + +## Estado + +- **Existente (de pluma)**: `fana-md` (parser markdown, ex `pluma-md`), + `fana-md-reader-web` (lector DOM, ex `pluma-reader-web`, aún dep de + `gioser-web`). +- **Planeado**: el resto de sub-crates (writer DAG editor completo). + +## Crates (objetivo) + +| crate | tipo | rol | +| ---------------------- | ---- | ---------------------------------------------------- | +| `fana-core` | lib | `NarrativeAtom` + `NarrativeGraph` + `CoherenceState`| +| `fana-md` | lib | Parser markdown (ex pluma-md) | +| `fana-graph` | lib | DAG ops + `propagate_mutation` topológico | +| `fana-semantic` | lib | Cliente `verbo` + scoring de intensidad adjetiva | +| `fana-store` | lib | Persistencia sled/RocksDB + bincode/rkyv zero-copy | +| `fana-llm` | lib | Cliente HTTP a LLMs remotos (evaluación + merge) | +| `fana-render-plan` | lib | DrawCommands agnósticos (editor + sidepane + ghost) | +| `fana-editor-gpui` | lib | WorkspaceEditor View + OscilloscopeSidepane + Ghost | +| `fana-md-reader-web` | lib | Lector markdown DOM (ex pluma-reader-web) | +| `fana-editor-web` | lib | (futuro) editor WASM | + +## Modelo de datos + +```rust +enum CoherenceState { Valid, InConflict { origin, reason }, PendingEvaluation } + +struct NarrativeAtom { + id: Uuid, + content_hash: [u8; 32], // SHA-256 estricto + content: Arc, // texto compartido (zero-alloc al ramificar) + semantic_vectors: HashMap, // concepto → intensidad + dependencies: Vec, // nodos prerrequisito + branch_id: String, + coherence: CoherenceState, +} + +struct NarrativeGraph { + nodes: HashMap, + adjacency_list: HashMap>, // padre → hijos dependientes +} +``` + +## Dependencias + +- `fana-semantic` ← `verbo` (embeddings, instancia modelo ligero ~384d). +- `fana-md` puro (sin deps de host). +- `fana-md-reader-web` + `fana-editor-web` ← `wasm-bindgen`, `web-sys`. +- `fana-editor-gpui` ← `gpui`, `nahual`. +- `gioser-web` sigue consumiendo `fana-md-reader-web`. + +## Invariantes + +- Toda mutación de texto valida contra el hash binario del contenido. +- Branches comparten texto vía `Arc` — clonar una rama es O(1). +- `propagate_mutation` marca `PendingEvaluation` en cascada topológica + cuando un átomo origen cambia (shock-wave lógica). +- Separabilidad UI estricta: `fana-core/md/graph/semantic/store/llm/ + render-plan` agnósticos; `fana-editor-{gpui,web}` intercambiables. + +## Apps + +- `apps/fana` — binario GPUI (prioridad alta). +- `apps/fana-web` — (futuro) cdylib WASM. diff --git a/crates/modules/pluma/pluma-reader-web/Cargo.toml b/crates/modules/fana/fana-md-reader-web/Cargo.toml similarity index 87% rename from crates/modules/pluma/pluma-reader-web/Cargo.toml rename to crates/modules/fana/fana-md-reader-web/Cargo.toml index 47faec3..6d8de30 100644 --- a/crates/modules/pluma/pluma-reader-web/Cargo.toml +++ b/crates/modules/fana/fana-md-reader-web/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "pluma-reader-web" +name = "fana-md-reader-web" version.workspace = true edition.workspace = true license.workspace = true @@ -7,7 +7,7 @@ authors.workspace = true publish.workspace = true [dependencies] -pluma-md = { path = "../pluma-md" } +fana-md = { path = "../fana-md" } wasm-bindgen.workspace = true wasm-bindgen-futures.workspace = true js-sys.workspace = true diff --git a/crates/modules/pluma/pluma-reader-web/src/lib.rs b/crates/modules/fana/fana-md-reader-web/src/lib.rs similarity index 98% rename from crates/modules/pluma/pluma-reader-web/src/lib.rs rename to crates/modules/fana/fana-md-reader-web/src/lib.rs index 4b242ef..4aca214 100644 --- a/crates/modules/pluma/pluma-reader-web/src/lib.rs +++ b/crates/modules/fana/fana-md-reader-web/src/lib.rs @@ -53,7 +53,7 @@ impl Reader { /// Renderea un string markdown directamente, sin fetch. pub fn render_md(&self, md: &str, theme: &str) { - let html = pluma_md::to_themed_html(md, theme); + let html = fana_md::to_themed_html(md, theme); self.container.set_inner_html(&html); } diff --git a/crates/modules/pluma/pluma-md/Cargo.toml b/crates/modules/fana/fana-md/Cargo.toml similarity index 91% rename from crates/modules/pluma/pluma-md/Cargo.toml rename to crates/modules/fana/fana-md/Cargo.toml index bde0357..515704f 100644 --- a/crates/modules/pluma/pluma-md/Cargo.toml +++ b/crates/modules/fana/fana-md/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "pluma-md" +name = "fana-md" version.workspace = true edition.workspace = true license.workspace = true diff --git a/crates/modules/pluma/pluma-md/src/lib.rs b/crates/modules/fana/fana-md/src/lib.rs similarity index 100% rename from crates/modules/pluma/pluma-md/src/lib.rs rename to crates/modules/fana/fana-md/src/lib.rs diff --git a/crates/modules/nahual/widgets/app-header/src/lib.rs b/crates/modules/nahual/widgets/app-header/src/lib.rs index eb94300..ee7b352 100644 --- a/crates/modules/nahual/widgets/app-header/src/lib.rs +++ b/crates/modules/nahual/widgets/app-header/src/lib.rs @@ -8,7 +8,7 @@ //! border-bottom = `theme.border`. //! - Padding 16/12, text_size 14. //! -//! Patrón emergente: `nakui-explorer`, `akasha-explorer`, +//! Patrón emergente: `nakui-explorer`, `chasqui-explorer`, //! `minga-explorer`, `brahman-broker-explorer` declaran headers //! idénticos sólo cambiando el label. Ahora es 1 línea. //! diff --git a/crates/modules/pluma/SDD.md b/crates/modules/pluma/SDD.md deleted file mode 100644 index 2702e74..0000000 --- a/crates/modules/pluma/SDD.md +++ /dev/null @@ -1,24 +0,0 @@ -# modules/pluma/ — Markdown agnóstico + visor web - -**Propósito.** Parser de markdown que no asume host: produce un árbol -de `Block`. El visor web fetch-ea un `.md` y lo inyecta como HTML, -respetando `data-pluma-theme` del contenedor. - -## Crates - -| crate | tipo | rol | -| -------------------- | ---- | ------------------------------------------------ | -| `pluma-md` | lib | Wrapper sobre `pulldown-cmark` con AST simple | -| `pluma-reader-web` | lib | Reader DOM: fetch + inject HTML + theming | - -## Dependencias - -- `pluma-md` ← `pulldown-cmark` (sin features de host). -- `pluma-reader-web` ← `wasm-bindgen` + `web-sys` (HtmlElement, Response). -- Consumido por: `apps/gioser-web` (renderea los 4 tips elementales - desde `md/agua.md`, `md/aire.md`, `md/fuego.md`, `md/tierra.md`). - -## Estado - -LOC 178. Funcional y pequeño. Sin tests (todavía). Pendiente: AST -con todos los inline elements (links, emphasis) accesibles desde Rust. diff --git a/crates/modules/vista/SDD.md b/crates/modules/revista/SDD.md similarity index 63% rename from crates/modules/vista/SDD.md rename to crates/modules/revista/SDD.md index d9cffe7..2f570fb 100644 --- a/crates/modules/vista/SDD.md +++ b/crates/modules/revista/SDD.md @@ -1,4 +1,4 @@ -# modules/vista/ — Deck horizontal swipe (PageView) +# modules/revista/ — Deck horizontal swipe (PageView) **Propósito.** Carousel/PageView estilo Flutter: gesto horizontal con snap a página, distinción horizontal vs vertical, soporte mouse + @@ -8,15 +8,15 @@ touch + pointer events. Lógica separada del binding DOM. | crate | tipo | rol | | ------------- | ---- | --------------------------------------------------------- | -| `vista-core` | lib | `DeckState` agnóstico: pointer_down/move/end → outcomes | -| `vista-web` | lib | Binding DOM sobre ``: traduce eventos + aplica CSS | +| `revista-core` | lib | `DeckState` agnóstico: pointer_down/move/end → outcomes | +| `revista-web` | lib | Binding DOM sobre ``: traduce eventos + aplica CSS | ## Dependencias -- `vista-core`: sin deps externas. Pura state machine. -- `vista-web` ← `vista-core`, `wasm-bindgen`, `web-sys` (PointerEvent). +- `revista-core`: sin deps externas. Pura state machine. +- `revista-web` ← `revista-core`, `wasm-bindgen`, `web-sys` (PointerEvent). -## API agnóstica (vista-core) +## API agnóstica (revista-core) ```rust let mut deck = DeckState::new(); @@ -35,6 +35,6 @@ if let Some(r) = deck.pointer_end(offset, width, n_pages) { ## Estado -vista-core: 5 tests verdes (drag decision + snap + clamp + goto). -vista-web: binding DOM intacto, ahora delega toda la lógica a core. +revista-core: 5 tests verdes (drag decision + snap + clamp + goto). +revista-web: binding DOM intacto, ahora delega toda la lógica a core. LOC core 177 + web ~355. Reutilizable en backends no-web. diff --git a/crates/modules/vista/vista-core/Cargo.toml b/crates/modules/revista/revista-core/Cargo.toml similarity index 91% rename from crates/modules/vista/vista-core/Cargo.toml rename to crates/modules/revista/revista-core/Cargo.toml index 7024e70..b041cd7 100644 --- a/crates/modules/vista/vista-core/Cargo.toml +++ b/crates/modules/revista/revista-core/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "vista-core" +name = "revista-core" description = "Vista — máquina de estados agnóstica para deck horizontal con snap. Sin dependencias web/DOM." version.workspace = true edition.workspace = true diff --git a/crates/modules/vista/vista-core/src/lib.rs b/crates/modules/revista/revista-core/src/lib.rs similarity index 100% rename from crates/modules/vista/vista-core/src/lib.rs rename to crates/modules/revista/revista-core/src/lib.rs diff --git a/crates/modules/vista/vista-web/Cargo.toml b/crates/modules/revista/revista-web/Cargo.toml similarity index 87% rename from crates/modules/vista/vista-web/Cargo.toml rename to crates/modules/revista/revista-web/Cargo.toml index 046e05a..d93603a 100644 --- a/crates/modules/vista/vista-web/Cargo.toml +++ b/crates/modules/revista/revista-web/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "vista-web" +name = "revista-web" version.workspace = true edition.workspace = true license.workspace = true @@ -7,7 +7,7 @@ authors.workspace = true publish.workspace = true [dependencies] -vista-core = { path = "../vista-core" } +revista-core = { path = "../revista-core" } wasm-bindgen.workspace = true js-sys.workspace = true diff --git a/crates/modules/vista/vista-web/src/lib.rs b/crates/modules/revista/revista-web/src/lib.rs similarity index 99% rename from crates/modules/vista/vista-web/src/lib.rs rename to crates/modules/revista/revista-web/src/lib.rs index 6e85707..738616d 100644 --- a/crates/modules/vista/vista-web/src/lib.rs +++ b/crates/modules/revista/revista-web/src/lib.rs @@ -20,7 +20,7 @@ use std::cell::RefCell; use std::rc::Rc; -use vista_core::{DeckState, DragOutcome}; +use revista_core::{DeckState, DragOutcome}; use wasm_bindgen::prelude::*; use wasm_bindgen::JsCast; use web_sys::{Event, HtmlElement, PointerEvent}; diff --git a/crates/modules/shuma/shuma-core/Cargo.toml b/crates/modules/shuma/shuma-core/Cargo.toml index a9b628a..346d645 100644 --- a/crates/modules/shuma/shuma-core/Cargo.toml +++ b/crates/modules/shuma/shuma-core/Cargo.toml @@ -6,13 +6,13 @@ rust-version.workspace = true license.workspace = true authors.workspace = true publish.workspace = true -description = "Runtime de shipote: WorkspaceManager sobre ente-incarnate. Estado in-memory, lifecycle, reaping." +description = "Runtime de shuma: WorkspaceManager sobre arje-incarnate. Estado in-memory, lifecycle, reaping." [dependencies] shuma-card = { path = "../shuma-card" } shuma-discern = { path = "../shuma-discern" } brahman-card = { path = "../../../protocol/brahman-card" } -ente-incarnate = { path = "../../../init/ente-incarnate" } +arje-incarnate = { path = "../../../init/arje-incarnate" } nix = { workspace = true } libc = { workspace = true } anyhow = { workspace = true } diff --git a/crates/modules/shuma/shuma-core/src/lib.rs b/crates/modules/shuma/shuma-core/src/lib.rs index 4bc2423..5ae41c2 100644 --- a/crates/modules/shuma/shuma-core/src/lib.rs +++ b/crates/modules/shuma/shuma-core/src/lib.rs @@ -18,7 +18,7 @@ pub mod pipeline; pub mod stats; use brahman_card::{Card, Payload, Supervision}; -use ente_incarnate::{Incarnator, IncarnatorConfig}; +use arje_incarnate::{Incarnator, IncarnatorConfig}; use nix::sys::signal::{kill, Signal}; use nix::sys::wait::{waitpid, WaitPidFlag, WaitStatus}; use nix::unistd::Pid; @@ -38,7 +38,7 @@ pub enum CoreError { #[error("compile: {0}")] Compile(#[from] shuma_card::CompileError), #[error("incarnate: {0}")] - Incarnate(#[from] ente_incarnate::IncarnateError), + Incarnate(#[from] arje_incarnate::IncarnateError), } #[derive(Debug)] @@ -682,9 +682,9 @@ impl WorkspaceManager { // hace OOM kill al exceder memory.max — enforcement automático // sin policy adicional. Falla silenciosa si no hay delegation. if !spec.soma.cgroup.path.is_empty() { - if let Ok(abs) = ente_incarnate::cgroup::ensure_cgroup(&spec.soma.cgroup) { + if let Ok(abs) = arje_incarnate::cgroup::ensure_cgroup(&spec.soma.cgroup) { let applied = - ente_incarnate::cgroup::apply_rlimits_to_cgroup(&abs, &spec.soma.rlimits); + arje_incarnate::cgroup::apply_rlimits_to_cgroup(&abs, &spec.soma.rlimits); if !applied.is_empty() { warnings.push(format!("cgroup limits applied: {}", applied.join(", "))); } @@ -842,11 +842,11 @@ impl WorkspaceManager { use std::os::fd::IntoRawFd; let (sout_r, sout_w) = nix::unistd::pipe2(nix::fcntl::OFlag::O_CLOEXEC).map_err(|e| { - CoreError::Incarnate(ente_incarnate::IncarnateError::Pipe(e)) + CoreError::Incarnate(arje_incarnate::IncarnateError::Pipe(e)) })?; let (serr_r, serr_w) = nix::unistd::pipe2(nix::fcntl::OFlag::O_CLOEXEC).map_err(|e| { - CoreError::Incarnate(ente_incarnate::IncarnateError::Pipe(e)) + CoreError::Incarnate(arje_incarnate::IncarnateError::Pipe(e)) })?; let sout_r_fd = sout_r.into_raw_fd(); let sout_w_fd = sout_w.into_raw_fd(); @@ -856,7 +856,7 @@ impl WorkspaceManager { let stdout_buf = logbuf::LogBuf::new(); let stderr_buf = logbuf::LogBuf::new(); - let stdio = ente_incarnate::ChildStdio { + let stdio = arje_incarnate::ChildStdio { stdin_fd: None, stdout_fd: Some(sout_w_fd), stderr_fd: Some(serr_w_fd), diff --git a/crates/modules/shuma/shuma-core/src/persist.rs b/crates/modules/shuma/shuma-core/src/persist.rs index c958028..e9ab8a7 100644 --- a/crates/modules/shuma/shuma-core/src/persist.rs +++ b/crates/modules/shuma/shuma-core/src/persist.rs @@ -282,7 +282,7 @@ pub struct RestoreOutcome { mod tests { use super::*; use crate::WorkspaceManager; - use ente_incarnate::IncarnatorConfig; + use arje_incarnate::IncarnatorConfig; use shuma_card::{ExitPolicy, WorkspaceSpec}; use std::sync::Arc; diff --git a/crates/modules/shuma/shuma-core/src/pipeline.rs b/crates/modules/shuma/shuma-core/src/pipeline.rs index 68a7b55..804adee 100644 --- a/crates/modules/shuma/shuma-core/src/pipeline.rs +++ b/crates/modules/shuma/shuma-core/src/pipeline.rs @@ -1,7 +1,7 @@ //! Pipeline runtime: encadena nodos con pipes y opcionalmente intercepta //! cada flow para discernir su contenido. //! -//! Cada nodo se encarna via [`ente_incarnate::Incarnator`] — eso significa +//! Cada nodo se encarna via [`arje_incarnate::Incarnator`] — eso significa //! que **cada comando puede tener su propio SomaSpec** (namespaces, cgroup, //! rlimits) heredado del workspace. La conexión stdin↔stdout se hace con //! `pipe2(2)` + `ChildStdio` declarativo: el callback de clone(2) hace los @@ -9,7 +9,7 @@ use crate::CoreError; use brahman_card::Payload; -use ente_incarnate::{ChildStdio, Incarnator}; +use arje_incarnate::{ChildStdio, Incarnator}; use nix::fcntl::OFlag; use nix::unistd::pipe2; use shuma_card::PipelineSpec; @@ -87,7 +87,7 @@ pub async fn run_pipeline( let mut edge_w: Vec = vec![-1; spec.edges.len()]; for i in 0..spec.edges.len() { let (r, w) = pipe2(OFlag::O_CLOEXEC).map_err(|e| { - CoreError::Incarnate(ente_incarnate::IncarnateError::Pipe(e)) + CoreError::Incarnate(arje_incarnate::IncarnateError::Pipe(e)) })?; edge_r[i] = r.into_raw_fd(); edge_w[i] = w.into_raw_fd(); @@ -110,7 +110,7 @@ pub async fn run_pipeline( } // Splitter: pipe propio para el productor → splitter lee y replica a edge_w[*]. let (prod_r, prod_w) = pipe2(OFlag::O_CLOEXEC).map_err(|e| { - CoreError::Incarnate(ente_incarnate::IncarnateError::Pipe(e)) + CoreError::Incarnate(arje_incarnate::IncarnateError::Pipe(e)) })?; producer_stdout_fd[i] = Some(prod_w.into_raw_fd()); let prod_r_fd = prod_r.into_raw_fd(); @@ -147,7 +147,7 @@ pub async fn run_pipeline( // Merger: lee de N edge_r y escribe a un nuevo pipe cuyo // read end es el stdin del consumer. let (cons_r, cons_w) = pipe2(OFlag::O_CLOEXEC).map_err(|e| { - CoreError::Incarnate(ente_incarnate::IncarnateError::Pipe(e)) + CoreError::Incarnate(arje_incarnate::IncarnateError::Pipe(e)) })?; consumer_stdin_fd[j] = Some(cons_r.into_raw_fd()); let inputs: Vec = predecessors[j] @@ -169,7 +169,7 @@ pub async fn run_pipeline( Payload::Native { .. } | Payload::Legacy { .. } => {} _ => { return Err(CoreError::Incarnate( - ente_incarnate::IncarnateError::NonExecutablePayload, + arje_incarnate::IncarnateError::NonExecutablePayload, )) } } @@ -638,7 +638,7 @@ fn _keep_raw(_: &dyn AsRawFd) {} mod tests { use super::*; use brahman_card::Payload; - use ente_incarnate::IncarnatorConfig; + use arje_incarnate::IncarnatorConfig; use shuma_card::{CommandRef, DiscernPolicy, FlowEdge, PipelineSpec, WorkspaceId}; fn cmd(label: &str, exec: &str, argv: &[&str]) -> CommandRef { diff --git a/crates/modules/shuma/shuma-discern/src/lib.rs b/crates/modules/shuma/shuma-discern/src/lib.rs index 6b2d3a7..e156fa9 100644 --- a/crates/modules/shuma/shuma-discern/src/lib.rs +++ b/crates/modules/shuma/shuma-discern/src/lib.rs @@ -2,7 +2,7 @@ //! //! Trait + pipeline + discerners default. Devuelve un [`Discernment`] con //! `TypeRef` consistente con el broker, confidence, MIME y un `lens` hint -//! para UIs (reusa el espíritu del `dominant_lens` de akasha). +//! para UIs (reusa el espíritu del `dominant_lens` de chasqui). #![forbid(unsafe_code)] diff --git a/crates/protocol/SDD.md b/crates/protocol/SDD.md index c532e72..d1282f4 100644 --- a/crates/protocol/SDD.md +++ b/crates/protocol/SDD.md @@ -16,7 +16,7 @@ flows por tipo, y wire types de red. No corre lógica de dominio. | `brahman-admin` | lib | Socket admin separado: snapshots de sesiones+matches | | `brahman-sidecar` | lib | `spawn(card)` para que apps se presenten al Init | | `brahman-net` | lib | Malla libp2p opcional (TCP+noise+yamux+kad) | -| `ente-card` | lib | Alias legacy — re-export de `brahman-card` | +| `arje-card` | lib | Alias legacy — re-export de `brahman-card` | ## Struct `Card` (anatomía completa) diff --git a/crates/protocol/ente-card/Cargo.toml b/crates/protocol/arje-card/Cargo.toml similarity index 93% rename from crates/protocol/ente-card/Cargo.toml rename to crates/protocol/arje-card/Cargo.toml index b4dcdfc..ff00485 100644 --- a/crates/protocol/ente-card/Cargo.toml +++ b/crates/protocol/arje-card/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "ente-card" +name = "arje-card" version = "0.0.1" edition.workspace = true license.workspace = true diff --git a/crates/protocol/ente-card/src/lib.rs b/crates/protocol/arje-card/src/lib.rs similarity index 100% rename from crates/protocol/ente-card/src/lib.rs rename to crates/protocol/arje-card/src/lib.rs diff --git a/crates/protocol/brahman-card/src/lib.rs b/crates/protocol/brahman-card/src/lib.rs index 0cda3b0..d9f5167 100644 --- a/crates/protocol/brahman-card/src/lib.rs +++ b/crates/protocol/brahman-card/src/lib.rs @@ -1187,7 +1187,7 @@ mod tests { #[test] fn wirecard_postcard_with_priority_contexts() { - // Repro del bug que rompía akasha-nous-mock: ContextBias con + // Repro del bug que rompía chasqui-nous-mock: ContextBias con // skip_serializing_if causaba que postcard leyera bytes // equivocados. Sin esos atributos, el roundtrip es estable. let src = r#"{ @@ -1266,8 +1266,8 @@ mod tests { #[test] fn new_assigns_real_ulid_and_label() { - let c = Card::new("akasha.engine"); - assert_eq!(c.label, "akasha.engine"); + let c = Card::new("chasqui.engine"); + assert_eq!(c.label, "chasqui.engine"); assert_ne!(c.id, Ulid::nil(), "Card::new no debe dejar id en nil"); } diff --git a/crates/protocol/brahman-cards/Cargo.toml b/crates/protocol/brahman-cards/Cargo.toml index 6e15a05..9e955d5 100644 --- a/crates/protocol/brahman-cards/Cargo.toml +++ b/crates/protocol/brahman-cards/Cargo.toml @@ -14,7 +14,7 @@ serde_json = { workspace = true } thiserror = { workspace = true } ulid = { workspace = true } brahman-card = { path = "../brahman-card" } -akasha-card = { path = "../../modules/akasha/card" } +chasqui-card = { path = "../../modules/chasqui/card" } nahual-meta-schema = { path = "../../modules/nahual/libs/meta-schema" } nickel-lang = "2.0.0" diff --git a/crates/protocol/brahman-cards/src/lib.rs b/crates/protocol/brahman-cards/src/lib.rs index d6b5a6e..3649bb8 100644 --- a/crates/protocol/brahman-cards/src/lib.rs +++ b/crates/protocol/brahman-cards/src/lib.rs @@ -12,7 +12,7 @@ //! ```text //! ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ //! │ Ente JSON │ │ Monad JSON │ │ UiModule │ … futuro -//! │ (brahman- │ │ (akasha- │ │ (nakui-ui- │ +//! │ (brahman- │ │ (chasqui- │ │ (nakui-ui- │ //! │ card) │ │ card) │ │ schema) │ //! └─────┬───────┘ └──────┬───────┘ └──────┬──────┘ //! │ │ │ @@ -48,7 +48,7 @@ use serde_json::Value; use thiserror::Error; pub use brahman_card::Card as EnteCard; -pub use akasha_card::MonadManifest; +pub use chasqui_card::MonadManifest; pub use nahual_meta_schema::Module as UiModuleSpec; /// Estructura canónica única que consumen los downstream del sistema diff --git a/crates/protocol/brahman-cards/src/readers.rs b/crates/protocol/brahman-cards/src/readers.rs index 700fec8..78f23de 100644 --- a/crates/protocol/brahman-cards/src/readers.rs +++ b/crates/protocol/brahman-cards/src/readers.rs @@ -69,10 +69,10 @@ impl CardReader for EnteJsonReader { } // ============================================================================ -// Monad (akasha-card) +// Monad (chasqui-card) // ============================================================================ -/// Reader para el shape JSON de [`akasha_card::MonadManifest`]. +/// Reader para el shape JSON de [`chasqui_card::MonadManifest`]. /// /// Heurística: tiene `members` (BTreeSet) Y `cardinality` /// (u32). La combinación es exclusiva del MonadManifest. diff --git a/crates/protocol/brahman-handshake/tests/network_discovery.rs b/crates/protocol/brahman-handshake/tests/network_discovery.rs index 259d1db..a84bac7 100644 --- a/crates/protocol/brahman-handshake/tests/network_discovery.rs +++ b/crates/protocol/brahman-handshake/tests/network_discovery.rs @@ -21,7 +21,7 @@ //! vía la conexión directa establecida en step 2 y obtiene el record //! del store local de A. //! - El test usa flow `monad-list:json` por familiaridad (es el flow -//! real que `akasha daemon` declara). Sirve también como prueba de +//! real que `chasqui daemon` declara). Sirve también como prueba de //! que el sistema completo (daemon + DHT) funcionaría con cero //! cambios en la Card. diff --git a/crates/protocol/brahman-sidecar/src/discovery.rs b/crates/protocol/brahman-sidecar/src/discovery.rs index b106fac..02f2949 100644 --- a/crates/protocol/brahman-sidecar/src/discovery.rs +++ b/crates/protocol/brahman-sidecar/src/discovery.rs @@ -3,7 +3,7 @@ //! sockets ni reimplementar el patrón a mano. //! //! Es la generalización de `discover_producer_socket` del CLI -//! `akasha attract --remote`: declarás el `TypeRef` que querés +//! `chasqui attract --remote`: declarás el `TypeRef` que querés //! consumir y el broker te empuja un `MatchEvent::Available` con el //! `producer_service_socket` del primer proveedor matched. //! @@ -263,8 +263,8 @@ mod tests { #[test] fn builder_sets_input_flow_with_primitive_type() { - let c = build_consumer_card("akasha.cli", "embed-result", "json"); - assert_eq!(c.label, "akasha.cli"); + let c = build_consumer_card("chasqui.cli", "embed-result", "json"); + assert_eq!(c.label, "chasqui.cli"); assert_eq!(c.kind, CardKind::Ente); assert!(matches!(c.lifecycle, Lifecycle::Oneshot)); assert!(matches!(c.supervision, Supervision::OneShot)); diff --git a/crates/protocol/brahman-sidecar/src/lib.rs b/crates/protocol/brahman-sidecar/src/lib.rs index c10dc45..d9a49cb 100644 --- a/crates/protocol/brahman-sidecar/src/lib.rs +++ b/crates/protocol/brahman-sidecar/src/lib.rs @@ -95,7 +95,7 @@ pub fn spawn_with_handle(config: SidecarConfig) -> std::io::Result>>, _thread: JoinHandle<()>, diff --git a/crates/runtime/SDD.md b/crates/runtime/SDD.md index d16d78e..1ac0f0a 100644 --- a/crates/runtime/SDD.md +++ b/crates/runtime/SDD.md @@ -8,18 +8,18 @@ rule engine + audit log, y un ente de smoke test. | crate | tipo | rol | | ------------- | ---- | ----------------------------------------------------------- | -| `ente-bus` | lib | Unix SOCK_STREAM + postcard framing. Announce/Invoke/List | -| `ente-cas` | lib | Content-addressed storage SHA-256: blobs Wasm + audit log | -| `ente-wasm` | lib | Encarna `Payload::Wasm` vía `wasmi` en thread dedicado | -| `ente-brain` | lib | Rule engine + observer estadístico + audit chain con CAS | -| `ente-echo` | bin | Ente prueba — provee `Capability::Endpoint(echo)` | +| `arje-bus` | lib | Unix SOCK_STREAM + postcard framing. Announce/Invoke/List | +| `arje-cas` | lib | Content-addressed storage SHA-256: blobs Wasm + audit log | +| `arje-wasm` | lib | Encarna `Payload::Wasm` vía `wasmi` en thread dedicado | +| `arje-brain` | lib | Rule engine + observer estadístico + audit chain con CAS | +| `arje-echo` | bin | Ente prueba — provee `Capability::Endpoint(echo)` | ## Dependencias -- `ente-bus` ← `tokio` + `postcard`. Consumido por `init/ente-zero`. -- `ente-cas` ← `sha2` + `sled`. Consumido por `ente-brain` (audit log) - y `ente-wasm` (blobs). -- `ente-brain` ← `ente-bus`, `ente-cas`. Consumido por Init para +- `arje-bus` ← `tokio` + `postcard`. Consumido por `init/arje-zero`. +- `arje-cas` ← `sha2` + `sled`. Consumido por `arje-brain` (audit log) + y `arje-wasm` (blobs). +- `arje-brain` ← `arje-bus`, `arje-cas`. Consumido por Init para observabilidad estadística + reglas declarativas. ## Invariantes diff --git a/crates/runtime/ente-brain/Cargo.toml b/crates/runtime/arje-brain/Cargo.toml similarity index 81% rename from crates/runtime/ente-brain/Cargo.toml rename to crates/runtime/arje-brain/Cargo.toml index 5a0196f..a7a6a6e 100644 --- a/crates/runtime/ente-brain/Cargo.toml +++ b/crates/runtime/arje-brain/Cargo.toml @@ -1,13 +1,13 @@ [package] -name = "ente-brain" +name = "arje-brain" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [dependencies] -ente-card = { path = "../../protocol/ente-card" } -ente-cas = { path = "../ente-cas" } +arje-card = { path = "../../protocol/arje-card" } +arje-cas = { path = "../arje-cas" } serde = { workspace = true } serde_json = { workspace = true } ulid = { workspace = true } diff --git a/crates/runtime/ente-brain/examples/brainctl.rs b/crates/runtime/arje-brain/examples/brainctl.rs similarity index 98% rename from crates/runtime/ente-brain/examples/brainctl.rs rename to crates/runtime/arje-brain/examples/brainctl.rs index 5b051b1..8b9ab9a 100644 --- a/crates/runtime/ente-brain/examples/brainctl.rs +++ b/crates/runtime/arje-brain/examples/brainctl.rs @@ -9,7 +9,7 @@ //! //! Path del socket: $ENTE_BRAIN_SOCK o $XDG_RUNTIME_DIR/ente-brain.sock -use ente_brain::introspect::{call, IntrospectRequest, IntrospectResponse}; +use arje_brain::introspect::{call, IntrospectRequest, IntrospectResponse}; use std::path::{Path, PathBuf}; use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::net::UnixStream; @@ -164,10 +164,10 @@ fn print_response(r: &IntrospectResponse) { println!("{} cristales pattern detectados:", ps.len()); for p in ps { match p { - ente_brain::crystallize::PatternCrystal::Burst { kind, count, frequency_per_sec } => { + arje_brain::crystallize::PatternCrystal::Burst { kind, count, frequency_per_sec } => { println!(" burst: {kind:?} count={count} freq={frequency_per_sec:.2} Hz"); } - ente_brain::crystallize::PatternCrystal::Silence { kind, last_count, since_secs } => { + arje_brain::crystallize::PatternCrystal::Silence { kind, last_count, since_secs } => { println!(" silence: {kind:?} last_count={last_count} ausente={since_secs:.1}s"); } } diff --git a/crates/runtime/ente-brain/src/audit.rs b/crates/runtime/arje-brain/src/audit.rs similarity index 97% rename from crates/runtime/ente-brain/src/audit.rs rename to crates/runtime/arje-brain/src/audit.rs index a95e80f..24a8ec0 100644 --- a/crates/runtime/ente-brain/src/audit.rs +++ b/crates/runtime/arje-brain/src/audit.rs @@ -125,7 +125,7 @@ impl AuditLog { /// snapshots externos — el log en memoria sigue intacto. pub fn persist_to_cas(entry: &AuditEntry) -> anyhow::Result<[u8; 32]> { let bytes = serde_json::to_vec(entry)?; - let sha = ente_cas::store(&bytes)?; + let sha = arje_cas::store(&bytes)?; Ok(sha) } @@ -142,7 +142,7 @@ impl AuditLog { for entry in &self.entries { if entry.seq < self.flushed_count { continue; } let bytes = canonical_bytes(entry); - let sha = ente_cas::store(&bytes)?; + let sha = arje_cas::store(&bytes)?; debug_assert_eq!(sha, entry.sha, "CAS sha != entry.sha — fórmula canónica rota"); last_sha = Some(sha); @@ -230,7 +230,7 @@ pub fn verify_chain_from_cas(start_sha: [u8; 32]) -> VerificationReport { let mut last_seen: Option = None; while let Some(sha) = current { - let path = ente_cas::cas_root().join(ente_cas::hex(&sha)); + let path = arje_cas::cas_root().join(arje_cas::hex(&sha)); let bytes = match std::fs::read(&path) { Ok(b) => b, Err(e) => return VerificationReport { @@ -241,14 +241,14 @@ pub fn verify_chain_from_cas(start_sha: [u8; 32]) -> VerificationReport { }, }; // Verificación 1: el blob hashea a la SHA esperada (CAS contract). - let actual = ente_cas::sha256_of(&bytes); + let actual = arje_cas::sha256_of(&bytes); if actual != sha { return VerificationReport { verified, broken_at_seq: last_seen.as_ref().map(|e| e.seq), error: Some(format!( "CAS tamper en {}: expected {} got {}", - path.display(), ente_cas::hex(&sha), ente_cas::hex(&actual) + path.display(), arje_cas::hex(&sha), arje_cas::hex(&actual) )), genesis_sha: None, }; @@ -288,7 +288,7 @@ pub fn reachable_from_head(start_sha: [u8; 32]) -> std::collections::HashSet<[u8 let mut current = Some(start_sha); while let Some(sha) = current { if !set.insert(sha) { break; } // ciclo (no debería pasar) — corta - let path = ente_cas::cas_root().join(ente_cas::hex(&sha)); + let path = arje_cas::cas_root().join(arje_cas::hex(&sha)); let bytes = match std::fs::read(&path) { Ok(b) => b, Err(_) => break }; let entry: AuditEntry = match serde_json::from_slice(&bytes) { Ok(e) => e, Err(_) => break, @@ -305,7 +305,7 @@ pub fn collect_chain_from_cas(start_sha: [u8; 32]) -> anyhow::Result u64 { } /// SHA256 sobre el entry en forma canónica (sha=[0;32]). Hash y CAS storage -/// ven los mismos bytes, así que `ente_cas::store(canonical)` devuelve el +/// ven los mismos bytes, así que `arje_cas::store(canonical)` devuelve el /// mismo SHA que `compute_sha(entry)`. fn compute_sha(entry: &AuditEntry) -> [u8; 32] { let bytes = canonical_bytes(entry); - ente_cas::sha256_of(&bytes) + arje_cas::sha256_of(&bytes) } /// Forma canónica: el entry serializado JSON con `sha = [0; 32]`. diff --git a/crates/runtime/ente-brain/src/autopromote.rs b/crates/runtime/arje-brain/src/autopromote.rs similarity index 100% rename from crates/runtime/ente-brain/src/autopromote.rs rename to crates/runtime/arje-brain/src/autopromote.rs diff --git a/crates/runtime/ente-brain/src/crystallize.rs b/crates/runtime/arje-brain/src/crystallize.rs similarity index 100% rename from crates/runtime/ente-brain/src/crystallize.rs rename to crates/runtime/arje-brain/src/crystallize.rs diff --git a/crates/runtime/ente-brain/src/dispatch.rs b/crates/runtime/arje-brain/src/dispatch.rs similarity index 96% rename from crates/runtime/ente-brain/src/dispatch.rs rename to crates/runtime/arje-brain/src/dispatch.rs index f864300..55db72e 100644 --- a/crates/runtime/ente-brain/src/dispatch.rs +++ b/crates/runtime/arje-brain/src/dispatch.rs @@ -14,7 +14,7 @@ pub trait ActionSink: Send + Sync { /// Spawn una Card decodificada. Implementación: GraphEvent::SpawnRequest. fn spawn(&self, card_blob: &str); /// Invoke por bus. blob crudo; el sink lo enruta vía bus_mediator. - fn invoke(&self, target_cap: ente_card::Capability, blob: Vec); + fn invoke(&self, target_cap: arje_card::Capability, blob: Vec); /// Notifica a un Ente específico (target_id). Implementación: forward por bus. fn notify(&self, target_id: ulid::Ulid, message: &str); /// Inhibe un comportamiento (placeholder; semántica depende del sink). @@ -28,7 +28,7 @@ impl ActionSink for NullSink { fn spawn(&self, card_blob: &str) { info!(blob_len = card_blob.len(), "NullSink::spawn (no-op)"); } - fn invoke(&self, target_cap: ente_card::Capability, blob: Vec) { + fn invoke(&self, target_cap: arje_card::Capability, blob: Vec) { info!(?target_cap, blob_len = blob.len(), "NullSink::invoke (no-op)"); } fn notify(&self, target_id: ulid::Ulid, message: &str) { diff --git a/crates/runtime/ente-brain/src/engine.rs b/crates/runtime/arje-brain/src/engine.rs similarity index 99% rename from crates/runtime/ente-brain/src/engine.rs rename to crates/runtime/arje-brain/src/engine.rs index e70ca0f..c9363ca 100644 --- a/crates/runtime/ente-brain/src/engine.rs +++ b/crates/runtime/arje-brain/src/engine.rs @@ -7,7 +7,7 @@ use crate::observer::TimedEvent; use crate::rules::{EventKind, EventPattern, Rule, Scope}; -use ente_card::Capability; +use arje_card::Capability; use std::collections::HashMap; use std::sync::Arc; use std::time::Duration; diff --git a/crates/runtime/ente-brain/src/introspect.rs b/crates/runtime/arje-brain/src/introspect.rs similarity index 99% rename from crates/runtime/ente-brain/src/introspect.rs rename to crates/runtime/arje-brain/src/introspect.rs index 77972d0..8e4961e 100644 --- a/crates/runtime/ente-brain/src/introspect.rs +++ b/crates/runtime/arje-brain/src/introspect.rs @@ -396,7 +396,7 @@ impl IntrospectServer { reachable.extend(crate::audit::reachable_from_head(head)); } reachable.extend(extra_roots); - match ente_cas::gc(&reachable) { + match arje_cas::gc(&reachable) { Ok((deleted, freed_bytes)) => IntrospectResponse::GcResult { deleted, freed_bytes }, Err(e) => IntrospectResponse::Error(format!("gc: {e}")), } diff --git a/crates/runtime/ente-brain/src/lib.rs b/crates/runtime/arje-brain/src/lib.rs similarity index 100% rename from crates/runtime/ente-brain/src/lib.rs rename to crates/runtime/arje-brain/src/lib.rs diff --git a/crates/runtime/ente-brain/src/loader.rs b/crates/runtime/arje-brain/src/loader.rs similarity index 99% rename from crates/runtime/ente-brain/src/loader.rs rename to crates/runtime/arje-brain/src/loader.rs index 296ebc1..2ca34ad 100644 --- a/crates/runtime/ente-brain/src/loader.rs +++ b/crates/runtime/arje-brain/src/loader.rs @@ -9,7 +9,7 @@ //! adicionales aquí cuando duela escribir JSON a mano. Hoy: una sola rama. use crate::rules::Rule; -use ente_card::EntityCard; +use arje_card::EntityCard; use std::path::Path; use tracing::info; diff --git a/crates/runtime/ente-brain/src/metrics.rs b/crates/runtime/arje-brain/src/metrics.rs similarity index 99% rename from crates/runtime/ente-brain/src/metrics.rs rename to crates/runtime/arje-brain/src/metrics.rs index ad44be2..06b7c79 100644 --- a/crates/runtime/ente-brain/src/metrics.rs +++ b/crates/runtime/arje-brain/src/metrics.rs @@ -128,7 +128,7 @@ async fn format_metrics(state: &BrainState) -> String { out.push_str("# TYPE ente_brain_audit_head_info gauge\n"); out.push_str(&format!( "ente_brain_audit_head_info{{sha=\"{}\"}} 1\n", - ente_cas::hex(&sha) + arje_cas::hex(&sha) )); } diff --git a/crates/runtime/ente-brain/src/observer.rs b/crates/runtime/arje-brain/src/observer.rs similarity index 100% rename from crates/runtime/ente-brain/src/observer.rs rename to crates/runtime/arje-brain/src/observer.rs diff --git a/crates/runtime/ente-brain/src/rules.rs b/crates/runtime/arje-brain/src/rules.rs similarity index 99% rename from crates/runtime/ente-brain/src/rules.rs rename to crates/runtime/arje-brain/src/rules.rs index 8c17a27..c78fa2e 100644 --- a/crates/runtime/ente-brain/src/rules.rs +++ b/crates/runtime/arje-brain/src/rules.rs @@ -5,7 +5,7 @@ //! acepta Rules construidas a mano sin pasar por validate() — ver //! `engine::insert`. -use ente_card::Capability; +use arje_card::Capability; use serde::{Deserialize, Serialize}; use ulid::Ulid; diff --git a/crates/runtime/ente-bus/Cargo.toml b/crates/runtime/arje-bus/Cargo.toml similarity index 77% rename from crates/runtime/ente-bus/Cargo.toml rename to crates/runtime/arje-bus/Cargo.toml index eac2173..c8a0a5d 100644 --- a/crates/runtime/ente-bus/Cargo.toml +++ b/crates/runtime/arje-bus/Cargo.toml @@ -1,12 +1,12 @@ [package] -name = "ente-bus" +name = "arje-bus" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [dependencies] -ente-card = { path = "../../protocol/ente-card" } +arje-card = { path = "../../protocol/arje-card" } serde = { workspace = true } postcard = { workspace = true } ulid = { workspace = true } @@ -15,7 +15,7 @@ anyhow = { workspace = true } tracing = { workspace = true } [dev-dependencies] -ente-echo = { path = "../ente-echo" } +arje-echo = { path = "../arje-echo" } [[example]] name = "busctl" diff --git a/crates/runtime/ente-bus/examples/busctl.rs b/crates/runtime/arje-bus/examples/busctl.rs similarity index 95% rename from crates/runtime/ente-bus/examples/busctl.rs rename to crates/runtime/arje-bus/examples/busctl.rs index 0d5b36e..c0bec53 100644 --- a/crates/runtime/ente-bus/examples/busctl.rs +++ b/crates/runtime/arje-bus/examples/busctl.rs @@ -7,7 +7,7 @@ //! //! Si `ENTE_BUS_SOCK` no está en el entorno, cae al path dev por defecto. -use ente_bus::{BusClient, BusRequest}; +use arje_bus::{BusClient, BusRequest}; use std::env; #[tokio::main(flavor = "current_thread")] @@ -36,7 +36,7 @@ async fn main() -> anyhow::Result<()> { "invoke-echo" => { let msg = args.get(2).map(|s| s.as_str()).unwrap_or("hola"); BusRequest::Invoke { - cap: ente_echo::echo_capability(), + cap: arje_echo::echo_capability(), blob: msg.as_bytes().to_vec(), } } diff --git a/crates/runtime/ente-bus/src/lib.rs b/crates/runtime/arje-bus/src/lib.rs similarity index 95% rename from crates/runtime/ente-bus/src/lib.rs rename to crates/runtime/arje-bus/src/lib.rs index 586df9c..131bae9 100644 --- a/crates/runtime/ente-bus/src/lib.rs +++ b/crates/runtime/arje-bus/src/lib.rs @@ -6,7 +6,7 @@ //! Identidad: cada Ente hijo recibe `ENTE_BUS_SOCK` y `ENTE_ID` en su entorno. //! El cliente lee ambos vía `BusClient::from_env`. -use ente_card::Capability; +use arje_card::Capability; use serde::{Deserialize, Serialize}; use std::path::Path; use std::str::FromStr; @@ -23,14 +23,14 @@ pub const MAX_FRAME: usize = 1 << 20; // 1 MiB — protección contra OOM /// `Capability::Endpoint { interface: POLKIT_DECISION_IFACE, version: 1 }` /// para arbitrar autorizaciones. Recibe blob: /// `pid_be | uid_be | action_id_utf8` → responde 1 byte: 1=allow, 0=deny. -pub const POLKIT_DECISION_IFACE: ente_card::InterfaceId = - ente_card::InterfaceId([0xb0; 16]); +pub const POLKIT_DECISION_IFACE: arje_card::InterfaceId = + arje_card::InterfaceId([0xb0; 16]); /// Interface UUID auto-anunciado por compat-polkit. Diferente al de /// decisión para evitar recursión (polkit-compat invoca DECISION pero /// no es proveedor de DECISION; se anuncia como SERVICE). -pub const POLKIT_SERVICE_IFACE: ente_card::InterfaceId = - ente_card::InterfaceId([0xa4; 16]); +pub const POLKIT_SERVICE_IFACE: arje_card::InterfaceId = + arje_card::InterfaceId([0xa4; 16]); /// Credenciales del peer extraídas vía SO_PEERCRED al accept del bus. /// Imposibles de falsear desde el cliente — el kernel las inyecta. @@ -132,7 +132,7 @@ pub struct BusClient { /// forwarda. Sync por simplicidad — un handler async se cubre con /// `tokio::task::block_in_place` o un canal hacia un task externo. pub trait InvokeHandler { - fn handle(&mut self, cap: ente_card::Capability, blob: Vec) -> BusResponse; + fn handle(&mut self, cap: arje_card::Capability, blob: Vec) -> BusResponse; } /// Conexión long-lived para Entes que proveen capacidades. A diferencia de @@ -157,7 +157,7 @@ impl BusServer { Ok(Self { stream, self_id }) } - pub async fn announce(&mut self, capabilities: Vec) -> anyhow::Result<()> { + pub async fn announce(&mut self, capabilities: Vec) -> anyhow::Result<()> { let req = BusMessage { from: Some(self.self_id), seq: 1, diff --git a/crates/runtime/ente-cas/Cargo.toml b/crates/runtime/arje-cas/Cargo.toml similarity index 92% rename from crates/runtime/ente-cas/Cargo.toml rename to crates/runtime/arje-cas/Cargo.toml index df0c34c..b310436 100644 --- a/crates/runtime/ente-cas/Cargo.toml +++ b/crates/runtime/arje-cas/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "ente-cas" +name = "arje-cas" version = "0.0.1" edition.workspace = true license.workspace = true diff --git a/crates/runtime/ente-cas/src/lib.rs b/crates/runtime/arje-cas/src/lib.rs similarity index 100% rename from crates/runtime/ente-cas/src/lib.rs rename to crates/runtime/arje-cas/src/lib.rs diff --git a/crates/runtime/ente-echo/Cargo.toml b/crates/runtime/arje-echo/Cargo.toml similarity index 68% rename from crates/runtime/ente-echo/Cargo.toml rename to crates/runtime/arje-echo/Cargo.toml index b3ab6e8..c1ef55d 100644 --- a/crates/runtime/ente-echo/Cargo.toml +++ b/crates/runtime/arje-echo/Cargo.toml @@ -1,21 +1,21 @@ [package] -name = "ente-echo" +name = "arje-echo" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [lib] -name = "ente_echo" +name = "arje_echo" path = "src/lib.rs" [[bin]] -name = "ente-echo" +name = "arje-echo" path = "src/main.rs" [dependencies] -ente-card = { path = "../../protocol/ente-card" } -ente-bus = { path = "../ente-bus" } +arje-card = { path = "../../protocol/arje-card" } +arje-bus = { path = "../arje-bus" } anyhow = { workspace = true } tokio = { workspace = true } tracing = { workspace = true } diff --git a/crates/runtime/ente-echo/src/lib.rs b/crates/runtime/arje-echo/src/lib.rs similarity index 93% rename from crates/runtime/ente-echo/src/lib.rs rename to crates/runtime/arje-echo/src/lib.rs index 8ebcc32..4de09ed 100644 --- a/crates/runtime/ente-echo/src/lib.rs +++ b/crates/runtime/arje-echo/src/lib.rs @@ -1,7 +1,7 @@ //! Constantes públicas del Ente echo. Lib aparte del bin para que `busctl` //! y otros consumidores puedan importar el InterfaceId sin enlazar el binario. -use ente_card::{Capability, InterfaceId}; +use arje_card::{Capability, InterfaceId}; /// UUID estable del interface "echo". Genera nuevo por sed si forkeas. pub const ECHO_IFACE: InterfaceId = InterfaceId([ diff --git a/crates/runtime/ente-echo/src/main.rs b/crates/runtime/arje-echo/src/main.rs similarity index 87% rename from crates/runtime/ente-echo/src/main.rs rename to crates/runtime/arje-echo/src/main.rs index 8ef07ea..e6e66b3 100644 --- a/crates/runtime/ente-echo/src/main.rs +++ b/crates/runtime/arje-echo/src/main.rs @@ -2,9 +2,9 @@ //! responde a invokes echando el blob recibido. Vehículo para validar el //! forwarding bus → proveedor → bus → originator. -use ente_bus::{BusResponse, BusServer, InvokeHandler}; -use ente_card::Capability; -use ente_echo::{echo_capability, ECHO_IFACE, ECHO_VERSION}; +use arje_bus::{BusResponse, BusServer, InvokeHandler}; +use arje_card::Capability; +use arje_echo::{echo_capability, ECHO_IFACE, ECHO_VERSION}; use tracing::{info, warn}; use tracing_subscriber::EnvFilter; @@ -31,7 +31,7 @@ impl InvokeHandler for EchoHandler { #[tokio::main(flavor = "current_thread")] async fn main() -> anyhow::Result<()> { let filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("ente_echo=info")); + .unwrap_or_else(|_| EnvFilter::new("arje_echo=info")); tracing_subscriber::fmt().with_env_filter(filter).with_target(true).init(); info!("ente-echo arrancando"); diff --git a/crates/runtime/ente-wasm/Cargo.toml b/crates/runtime/arje-wasm/Cargo.toml similarity index 79% rename from crates/runtime/ente-wasm/Cargo.toml rename to crates/runtime/arje-wasm/Cargo.toml index 4f28b71..57bb1ca 100644 --- a/crates/runtime/ente-wasm/Cargo.toml +++ b/crates/runtime/arje-wasm/Cargo.toml @@ -1,12 +1,12 @@ [package] -name = "ente-wasm" +name = "arje-wasm" version = "0.0.1" edition.workspace = true license.workspace = true publish.workspace = true [dependencies] -ente-card = { path = "../../protocol/ente-card" } +arje-card = { path = "../../protocol/arje-card" } wasmi = { workspace = true } wat = { workspace = true } ulid = { workspace = true } diff --git a/crates/runtime/ente-wasm/src/lib.rs b/crates/runtime/arje-wasm/src/lib.rs similarity index 99% rename from crates/runtime/ente-wasm/src/lib.rs rename to crates/runtime/arje-wasm/src/lib.rs index 27b5953..4b4461d 100644 --- a/crates/runtime/ente-wasm/src/lib.rs +++ b/crates/runtime/arje-wasm/src/lib.rs @@ -11,7 +11,7 @@ //! //! Más adelante: `ente.bus_call`, `ente.cap_invoke`, etc. -use ente_card::EntityCard; +use arje_card::EntityCard; use std::sync::atomic::{AtomicI32, Ordering}; use std::sync::Arc; use tracing::{error, info, warn}; diff --git a/docs/PLAN_MACRO.md b/docs/PLAN_MACRO.md index a8397e1..5b6ff23 100644 --- a/docs/PLAN_MACRO.md +++ b/docs/PLAN_MACRO.md @@ -59,7 +59,7 @@ | módulo | rol | LOC aprox proyectada | |---|---|---| -| `carmen` | compositor Wayland (smithay + ente-incarnate sandbox + delegación de regiones) | 8,000-12,000 | +| `carmen` | compositor Wayland (smithay + arje-incarnate sandbox + delegación de regiones) | 8,000-12,000 | | `akashi` | notes app con ECS + 4 lentes + gravedad semántica + Susurros | 10,000-15,000 | | `charka` | transpilador COBOL→Rust + runtime determinista + shadow validator | 25,000-50,000 | | `matilda` | administrador servidores + vhosts + Docker (con Ghost remoto) | 6,000-9,000 | @@ -97,8 +97,8 @@ │ init/ │ │ runtime/ │ │ compat/ │ └────┬────┘ └────┬─────┘ └──────────┘ │ │ - │ ente-incarnate │ brain-split: rules, cognitive, audit - │ (+ pivot_root, │ ente-cas, ente-bus, ente-wasm + │ arje-incarnate │ brain-split: rules, cognitive, audit + │ (+ pivot_root, │ arje-cas, arje-bus, arje-wasm │ overlayfs) │ │ │ └──────────┬────────┘ @@ -160,7 +160,7 @@ Pre-requisitos antes de meter código nuevo. La mayoría paralelizable. | #13 | Split brain en brain-rules + brain-cognitive + brain-audit | sandokan, ágora | 3-5 días | | #14 | Unificar loader en brahman-cards | reduce duplicación | 1-2 días | | #16 | Promover lifecycle a sandokan-lifecycle | sandokan, matilda, charka-shadow, carmen | 4-7 días | -| #19 | pivot_root + overlayfs en ente-incarnate | carmen, matilda Ghost, sandokan completo | 4-7 días | +| #19 | pivot_root + overlayfs en arje-incarnate | carmen, matilda Ghost, sandokan completo | 4-7 días | | #20 | transport-ssh-multiplex | sandokan::RemoteEngine, matilda | 3-5 días | Trabajo paralelo posible: 3-4 tracks. Estimación realista: **2 semanas**. @@ -187,8 +187,8 @@ Módulos de dominio que pueden empezar cuando sus deps de Fase B estén estables | #27 | dominium | (mayormente independiente) | 3-6K | 3-4 semanas | | #26 | takiy | dime (instancia ort) | 5-8K | 4-6 semanas | | #23 | akashi | dime (instancia 384d), separabilidad UI | 10-15K | 6-10 semanas | -| #21 | matilda | sandokan-lifecycle, ente-incarnate enhanced, transport-ssh | 6-9K | 5-8 semanas | -| #29 | carmen | ente-incarnate enhanced, sandokan, ente-logind-compat | 8-12K | 8-12 semanas | +| #21 | matilda | sandokan-lifecycle, arje-incarnate enhanced, transport-ssh | 6-9K | 5-8 semanas | +| #29 | carmen | arje-incarnate enhanced, sandokan, arje-logind-compat | 8-12K | 8-12 semanas | | #31 | ágora | CardKind extension, discovery-dht, brain-audit | 6-10K | 5-8 semanas | Paralelizable hasta 4-6 tracks simultáneos. Estimación realista: **10-12 semanas**. @@ -312,7 +312,7 @@ Para considerar cada fase "cerrada": - [ ] `cargo check --workspace` verde tras rename a chasqui - [ ] brain split: 3 crates separados, brain umbrella opcional, loader unificado - [ ] sandokan-lifecycle extraído con tests pasando que cubren shuma's lifecycle existente -- [ ] ente-incarnate con pivot_root + overlayfs + tests (chroot básico) +- [ ] arje-incarnate con pivot_root + overlayfs + tests (chroot básico) - [ ] transport-ssh-multiplex con tests sobre russh **Fase B**: @@ -325,7 +325,7 @@ Para considerar cada fase "cerrada": - [ ] takiy: latencia audio <10ms; persistencia ambos formatos - [ ] akashi: 4 lentes implementadas; Susurros activos; storage sqlite-vss funcional - [ ] matilda: Inspect/Diff/Apply ciclo cerrado; al menos provider Docker funcional -- [ ] carmen: arranca compositor; renderea alacritty; sandbox via ente-incarnate +- [ ] carmen: arranca compositor; renderea alacritty; sandbox via arje-incarnate - [ ] ágora: emite + verifica + revoca attestations; grafo navegable; integrado con CardKind **Fase D**: diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index af3870d..ca98ff0 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -7,7 +7,7 @@ impacto (lo que desbloquea más trabajo). - [x] Split core/ → protocol + init + runtime + compat - [x] Renames: shipote→shuma, nouser→akasha, yahweh→nahual, lapaloma→pineal -- [x] Fraccionamiento: vista-core, barra-core extraídos +- [x] Fraccionamiento: revista-core, barra-core extraídos - [x] SDDs por subdirectorio - [x] CHANGELOG particionado por proyecto - [x] `cargo check --workspace` pasa @@ -44,7 +44,7 @@ montable (editor abriendo paths semánticos). | Crate | TODOs | Trabajo | | ---------------------- | ----- | ----------------------------------------- | -| `ente-brain` | 11 | Rule engine declarativo + observer | +| `arje-brain` | 11 | Rule engine declarativo + observer | | `shuma-core` | 14 | Supervisión avanzada (restart + health) | | `brahman-handshake` | 10 | Trust fase 4 (revocaciones, beyond peer) | | `cosmobiologia-engine` | 12 | Sistema GR + harmonics (tareas #55-#63) | @@ -71,9 +71,9 @@ Memorias del proyecto detallan: | Shim | Métodos pendientes | | --------------------- | ------------------------------------ | -| `ente-logind-compat` | `Inhibit`, `Sleep` hooks | -| `ente-localed-compat` | `SetVariable` | -| `ente-machined-compat`| `MachineImage` operations | +| `arje-logind-compat` | `Inhibit`, `Sleep` hooks | +| `arje-localed-compat` | `SetVariable` | +| `arje-machined-compat`| `MachineImage` operations | Permite correr GNOME/KDE end-to-end sin parches. @@ -94,4 +94,4 @@ solitario; ~3-4 si se paraleliza (hito 1 con hito 6 son disjuntos). - 0 stubs `<50 LOC` que no sean intencionales. - `minga-vfs` montable como `mount.minga`. - Cosmobiología cubriendo: cartas natales, dial GR, harmonics, 3D, rectificación. -- GNOME Shell arrancable sobre `arje` (Init = `ente-zero`) sin parches. +- GNOME Shell arrancable sobre `arje` (Init = `arje-zero`) sin parches. diff --git a/docs/STATUS.md b/docs/STATUS.md index a08e174..1f69ee4 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -5,7 +5,7 @@ y `grep` sobre `src/` en cada crate (sin contar `target/` ni docs). ## Resumen ejecutivo -- **126 crates** activos en el workspace (124 originales + `vista-core` + `barra-core`). +- **126 crates** activos en el workspace (124 originales + `revista-core` + `barra-core`). - **~78.000 LOC** de Rust en `crates/`. - **Build pasa** (`cargo check --workspace`) tras el reorg del 2026-05-19. - **2 warnings** no bloqueantes (variant unused + eternal-validation). @@ -33,8 +33,8 @@ Bootea bare metal + QEMU + initramfs. Pendiente: cobertura tests sobre |---|---|---|---| | 3,418 | parcial | ~14 | ★★★☆☆ | -`ente-brain` concentra 11 TODOs (rule engine declarativo + observer -estadístico). `ente-bus`/`ente-cas`/`ente-wasm` estables. +`arje-brain` concentra 11 TODOs (rule engine declarativo + observer +estadístico). `arje-bus`/`arje-cas`/`arje-wasm` estables. ### `compat/` — Cobertura mínima viable | LOC | Tests | TODOs | Madurez | @@ -100,19 +100,19 @@ avanzada (restart policies + health checks). Landing WASM operativa. 4 crates agnósticos + cdylib + scripts de build. -### `modules/pluma/` — Funcional, pequeño +### `modules/fana/` — Funcional, pequeño | LOC | Tests | TODOs | Madurez | |---|---|---|---| | 178 | no | 0 | ★★★☆☆ | Parser + reader web. Pendiente: AST con inline elements (links, emphasis). -### `modules/vista/` — Refactorizado (2026-05-19) +### `modules/revista/` — Refactorizado (2026-05-19) | LOC | Tests | TODOs | Madurez | |---|---|---|---| | ~530 (177 core + ~350 web) | core: 5/5 verdes | 0 | ★★★★☆ | -`vista-core` agnóstico nuevo + `vista-web` ahora thin DOM binding. +`revista-core` agnóstico nuevo + `revista-web` ahora thin DOM binding. ### `modules/barra/` — Refactorizado (2026-05-19) | LOC | Tests | TODOs | Madurez | diff --git a/docs/arje-boot.md b/docs/arje-boot.md index 3a9edb8..7b19906 100644 --- a/docs/arje-boot.md +++ b/docs/arje-boot.md @@ -1,9 +1,9 @@ # Booteando arje — initramfs, QEMU y bare metal -`arje` es el init absorbido por brahman: `ente-zero` corre como PID 1, lee +`arje` es el init absorbido por brahman: `arje-zero` corre como PID 1, lee la **Tarjeta Semilla** (`/ente/seed.card.json`), monta `/proc /sys /dev /sys/fs/cgroup`, y encarna recursivamente cada Card declarada en -`genesis` vía `ente-incarnate::Incarnator` (`clone(2)` + namespaces + cgroup v2). +`genesis` vía `arje-incarnate::Incarnator` (`clone(2)` + namespaces + cgroup v2). Este documento describe el ciclo completo: @@ -21,11 +21,11 @@ Este documento describe el ciclo completo: El initrd es un **CPIO + gzip** (formato `newc`, estándar Linux). Su raíz: ``` -/init wrapper sh, ejecuta /sbin/ente-zero -/sbin/ente-zero PID 1 (musl-static por default) -/usr/sbin/ente-echo -/usr/sbin/ente-policy-provider -/usr/sbin/ente-*-compat 13 shims D-Bus (logind, hostnamed, …) +/init wrapper sh, ejecuta /sbin/arje-zero +/sbin/arje-zero PID 1 (musl-static por default) +/usr/sbin/arje-echo +/usr/sbin/arje-policy-provider +/usr/sbin/arje-*-compat 13 shims D-Bus (logind, hostnamed, …) /usr/bin/brahman-status CLI: snapshot del broker (sesiones + matches) /usr/bin/busctl CLI: bus interno (list-entes, announce, …) /usr/bin/brainctl CLI: cerebro (rules, entropy, crystals) @@ -36,14 +36,14 @@ El initrd es un **CPIO + gzip** (formato `newc`, estándar Linux). Su raíz: ``` Path canónico de la semilla en **prod**: `/ente/seed.card.json` (ver -`crates/core/ente-zero/src/seed.rs`). En **dev** (no PID 1): +`crates/core/arje-zero/src/seed.rs`). En **dev** (no PID 1): `./seed.card.json` en el cwd, o se sintetiza una mínima. ## 2. Build del initrd ### 2a. Por qué musl-static -`ente-zero` corre como **PID 1**: si tiene cualquier dependencia dinámica +`arje-zero` corre como **PID 1**: si tiene cualquier dependencia dinámica (`libgcc_s.so.1`, `libc.so.6`, `ld-linux-x86-64.so.2`) que no está presente en el initramfs, el kernel paniquea con `error while loading shared libraries: libgcc_s.so.1`. @@ -96,7 +96,7 @@ ARJE_TARGET=x86_64-unknown-linux-gnu scripts/build-arje-initrd.sh 1. Verifica que el target musl esté instalado; si no, da el comando exacto para instalarlo. 2. `cargo build --release --target x86_64-unknown-linux-musl` para - `ente-zero` + los 14 shims compat. + `arje-zero` + los 14 shims compat. 3. Sanity-check con `file`: aborta si algún binario quedó dinámico. 4. Valida la seed con `seeds/validate.sh` (parse + `Card::validate`). 5. Verifica que `busybox` sea estático (también aborta si es dinámico). @@ -164,9 +164,9 @@ wget -O /tmp/vmlinuz \ | `loglevel=7` | log del kernel hasta debug | | `quiet` | silencia banner kernel | | `RUST_LOG=trace` | (no se interpreta; usar env en `/init`) | -| `init=/sbin/ente-zero` | salta `/init`, ejecuta directo (no recomendado) | +| `init=/sbin/arje-zero` | salta `/init`, ejecuta directo (no recomendado) | -`ente-zero` lee `RUST_LOG` y `BRAHMAN_*` del env. Para setearlas, editar +`arje-zero` lee `RUST_LOG` y `BRAHMAN_*` del env. Para setearlas, editar `/init` antes de empaquetar, o agregar `-fw_cfg name=opt/foo,...` a qemu. ### 3d. Smoke test esperado @@ -174,9 +174,9 @@ wget -O /tmp/vmlinuz \ Con `seeds/arje-prod.card.json`: ``` -ente-zero despierta como PID 1 +arje-zero despierta como PID 1 Tarjeta Semilla cargada y validada path=/ente/seed.card.json -bus interno escuchando path=/run/ente-bus.sock +bus interno escuchando path=/run/arje-bus.sock brahman handshake escuchando (Unix) socket=/run/brahman-init.sock brahman admin escuchando socket=/run/brahman-admin.sock instanciando genesis seed=arje.seed.prod count=16 @@ -242,8 +242,8 @@ de implementar como `Capability::SwitchRoot`. seeds/validate.sh seeds/arje-prod.card.json ``` -El script carga la Card vía `ente_brain::load_card_file()` (que llama a -`brahman_card::Card::validate()`) y verifica que `ente-zero` la encarne +El script carga la Card vía `arje_brain::load_card_file()` (que llama a +`brahman_card::Card::validate()`) y verifica que `arje-zero` la encarne hasta `instanciando genesis`. ### 5c. Customizar @@ -294,7 +294,7 @@ Validación clave (`brahman_card::Card::validate`): ### 6a. Tracing -`ente-zero` usa `tracing-subscriber`. Default: `ente_zero=debug,info`. +`arje-zero` usa `tracing-subscriber`. Default: `arje_zero=debug,info`. Override con `RUST_LOG`: ```bash @@ -309,10 +309,10 @@ los sockets caen al fallback `/tmp/`: | socket | env override | servicio | | ---------------------------- | ----------------------- | ----------------------------------------- | -| `/tmp/ente-bus-*.sock` | `ENTE_BUS_SOCK` | bus interno (Announce/Invoke/ListEntes) | +| `/tmp/arje-bus-*.sock` | `ENTE_BUS_SOCK` | bus interno (Announce/Invoke/ListEntes) | | `/tmp/brahman-init.sock` | `BRAHMAN_INIT_SOCKET` | handshake brahman | | `/tmp/brahman-admin.sock` | `BRAHMAN_ADMIN_SOCKET` | snapshots de sesiones + matches | -| `/tmp/ente-brain.sock` | `ENTE_BRAIN_SOCK` | introspección del cerebro (rules, observer) | +| `/tmp/arje-brain.sock` | `ENTE_BRAIN_SOCK` | introspección del cerebro (rules, observer) | El initrd trae 3 CLI clients precompilados en `/usr/bin/`: @@ -351,7 +351,7 @@ arje# busctl list-entes arje# brainctl top 5 spawn 14 -ente_died 0 +arje_died 0 … ``` @@ -365,8 +365,8 @@ arje# socat - UNIX-CONNECT:/tmp/brahman-admin.sock | jq . ### 6c. Snapshot / restore ``` -ente-zero --checkpoint /ente/checkpoint.json # escribe al cerrar -ente-zero --restore /ente/checkpoint.json # reconstruye al boot +arje-zero --checkpoint /ente/checkpoint.json # escribe al cerrar +arje-zero --restore /ente/checkpoint.json # reconstruye al boot ``` Snapshot adjunto del cerebro: `/ente/checkpoint.brain.json`. @@ -374,7 +374,7 @@ Snapshot adjunto del cerebro: `/ente/checkpoint.brain.json`. ### 6d. Metrics ``` -ente-zero --metrics-addr 127.0.0.1:9911 +arje-zero --metrics-addr 127.0.0.1:9911 ``` Endpoint Prometheus desde dentro de la VM. Para exponerlo al host bajo @@ -382,20 +382,20 @@ QEMU, agregar `-netdev user,hostfwd=tcp::9911-:9911 -device virtio-net,netdev= ### 6e. Modo DEV en host (sin PID 1) -`ente-zero` detecta si su PID != 1 y entra en **DEV MODE**: no monta +`arje-zero` detecta si su PID != 1 y entra en **DEV MODE**: no monta kernel surface, no se vuelve subreaper, sale tras 4 s. Útil para iterar Cards en el host: ```bash mkdir /tmp/arje-test && cp seeds/arje-minimal.card.json /tmp/arje-test/seed.card.json -cd /tmp/arje-test && target/release/ente-zero +cd /tmp/arje-test && target/release/arje-zero ``` ## 7. Troubleshooting ### 7a. `error while loading shared libraries: libgcc_s.so.1` al boot -**Causa**: el `/sbin/ente-zero` del initrd se compiló contra glibc +**Causa**: el `/sbin/arje-zero` del initrd se compiló contra glibc (`x86_64-unknown-linux-gnu`) y depende dinámicamente de `libgcc_s.so.1`, `libc.so.6`, `ld-linux-x86-64.so.2`. Esas libs no están en el initramfs, el kernel mata PID 1 → panic. @@ -411,7 +411,7 @@ scripts/build-arje-initrd.sh # ya usa musl por default Verificar manualmente que el binario quedó estático: ```bash -file target/x86_64-unknown-linux-musl/release/ente-zero +file target/x86_64-unknown-linux-musl/release/arje-zero # → "ELF 64-bit LSB executable, ..., statically linked, ..." ``` @@ -422,7 +422,7 @@ recomendado. ### 7b. Kernel panic: `Kernel panic - not syncing: Attempted to kill init!` -**Causa**: `ente-zero` salió con error antes de bind del bus, o `/init` +**Causa**: `arje-zero` salió con error antes de bind del bus, o `/init` crashed antes de exec. PID 1 muriendo = panic kernel. **Fix**: agregar `panic=10` al cmdline (ya está en el script) para @@ -464,9 +464,9 @@ target-feature=+crt-static"` o aislando el feature problemático. - [ ] `rustup target add x86_64-unknown-linux-musl` instalado en el host build. - [ ] `musl-tools` (Debian/Ubuntu) o equivalente disponible. - [ ] `busybox-static` disponible para vendorear userspace. -- [ ] `cargo build --release --target x86_64-unknown-linux-musl -p ente-zero` +- [ ] `cargo build --release --target x86_64-unknown-linux-musl -p arje-zero` compila sin warnings. -- [ ] `file target/x86_64-unknown-linux-musl/release/ente-zero` reporta +- [ ] `file target/x86_64-unknown-linux-musl/release/arje-zero` reporta "statically linked". - [ ] `seeds/validate.sh seeds/arje-prod.card.json` → OK. - [ ] `scripts/build-arje-initrd.sh` produce `out/arje.initrd.cpio.gz`. diff --git a/docs/arje-replace-systemd.md b/docs/arje-replace-systemd.md index 0fa22c1..e0b454d 100644 --- a/docs/arje-replace-systemd.md +++ b/docs/arje-replace-systemd.md @@ -11,14 +11,14 @@ | `/sbin/init` | NO se toca (sigue siendo systemd). | | `/lib/systemd/*` | NO se toca. | | `kernel + initramfs` | reusamos los del host (firmware, módulos, root FS). | -| `init=` en GRUB | nueva entrada apunta a `/sbin/ente-zero`. | +| `init=` en GRUB | nueva entrada apunta a `/sbin/arje-zero`. | | `GRUB_DEFAULT` | NO se cambia. Sigue arrancando systemd por default. | | `/ente/seed.card.json`| nueva — define qué arranca arje. | -| `/usr/sbin/ente-*` | binarios musl-static del fractal. | +| `/usr/sbin/arje-*` | binarios musl-static del fractal. | Booteo del kernel → initramfs nativo hace su trabajo (mountea root, carga módulos) → cuando llega el `switch_root`, en lugar de exec -`/lib/systemd/systemd`, exec `/sbin/ente-zero`. Esto deja firmware y +`/lib/systemd/systemd`, exec `/sbin/arje-zero`. Esto deja firmware y udev fuera del scope de arje (todavía). ## 2. Instalación @@ -31,7 +31,7 @@ $EDITOR seeds/arje-host.card.json sudo scripts/install-arje-as-init.sh # 3. (opcional) bootear arje SÓLO en el próximo reboot (no cambia default) -sudo grub-reboot "arje (init=/sbin/ente-zero) — kernel $(uname -r)" +sudo grub-reboot "arje (init=/sbin/arje-zero) — kernel $(uname -r)" sudo reboot ``` @@ -76,16 +76,16 @@ ninguno a tu seed** salvo que sepas que lo usás: | `gdm.service`, `lightdm.service` | DM gráfico — agregalo SÓLO si querés GUI.| | `NetworkManager-wait-online.service` | espera red. arje no necesita "esperar". | | `systemd-timesyncd.service` | reemplaza con cron-like + ntpd one-shot. | -| `systemd-machined.service` | reemplazado por `ente-machined-compat`. | -| `systemd-logind.service` | reemplazado por `ente-logind-compat`. | -| `systemd-resolved.service` | reemplazado por `ente-resolved-compat`. | -| `systemd-hostnamed.service` | reemplazado por `ente-hostnamed-compat`. | -| `systemd-timedated.service` | reemplazado por `ente-timedated-compat`. | -| `systemd-localed.service` | reemplazado por `ente-localed-compat`. | -| `systemd-journald.service` | reemplazado por `ente-journald-compat`. | -| `systemd-tmpfiles-*.service` | reemplazado por `ente-tmpfiles-compat`. | -| `systemd-binfmt.service` | reemplazado por `ente-binfmt-compat`. | -| `polkitd.service` | reemplazado por `ente-polkit-compat`. | +| `systemd-machined.service` | reemplazado por `arje-machined-compat`. | +| `systemd-logind.service` | reemplazado por `arje-logind-compat`. | +| `systemd-resolved.service` | reemplazado por `arje-resolved-compat`. | +| `systemd-hostnamed.service` | reemplazado por `arje-hostnamed-compat`. | +| `systemd-timedated.service` | reemplazado por `arje-timedated-compat`. | +| `systemd-localed.service` | reemplazado por `arje-localed-compat`. | +| `systemd-journald.service` | reemplazado por `arje-journald-compat`. | +| `systemd-tmpfiles-*.service` | reemplazado por `arje-tmpfiles-compat`. | +| `systemd-binfmt.service` | reemplazado por `arje-binfmt-compat`. | +| `polkitd.service` | reemplazado por `arje-polkit-compat`. | Las últimas 12 ya están como Cards en `seeds/arje-host.card.json`. Las de la mitad de arriba **no** — no las agregues. @@ -94,11 +94,11 @@ de la mitad de arriba **no** — no las agregues. | Card label | reemplaza | binario | | ------------------ | -------------------------- | -------------------------------------------- | -| `tmpfiles-boot` | `systemd-tmpfiles-setup` | `/usr/sbin/ente-tmpfiles-compat --boot` | +| `tmpfiles-boot` | `systemd-tmpfiles-setup` | `/usr/sbin/arje-tmpfiles-compat --boot` | | `mount-fstab` | `local-fs.target` | `/bin/mount -a` (one-shot) | | `swap-on` | `swap.target` | `/sbin/swapon -a` (one-shot) | | `dbus-system` | `dbus.service` | `/usr/bin/dbus-daemon --system --nofork` | -| `compat-*` (×11) | shims D-Bus de systemd | `/usr/sbin/ente-*-compat` | +| `compat-*` (×11) | shims D-Bus de systemd | `/usr/sbin/arje-*-compat` | | `network-dhcpcd` | `NetworkManager` / `networkd` | `/usr/sbin/dhcpcd -B` | | `sshd` | `ssh.service` | `/usr/sbin/sshd -D` | | `getty-tty1` | `getty@tty1.service` | `/sbin/agetty --noclear tty1 linux` | @@ -150,7 +150,7 @@ de la mitad de arriba **no** — no las agregues. | acción | systemd | arje | | ---------------------------- | ------------------------------------ | ------------------------------------------------------- | | Ver servicios activos | `systemctl list-units --state=running` | `brahman-status` + `busctl list-entes` | -| Ver logs | `journalctl -u foo` | `ente-journalctl` (TODO en CLI; por ahora `dmesg`) | +| Ver logs | `journalctl -u foo` | `arje-journalctl` (TODO en CLI; por ahora `dmesg`) | | Restart un servicio | `systemctl restart foo` | matar el PID (`brain` lo reanuda por `Supervision`) | | Habilitar/Deshabilitar | `systemctl enable/disable` | editar `/ente/seed.card.json` + reboot | | Ver dependencias | `systemctl list-dependencies foo` | `brahman-status` muestra references y flow matches | @@ -163,7 +163,7 @@ de la mitad de arriba **no** — no las agregues. - **udev / hotplug**: arje captura uevents (vía `spawn_uevent_stream`), pero no hay reglas declarativas todavía. Para boot inicial, el initramfs nativo ya hizo el cold-plug, así que no es bloqueante. -- **Timers** (cron-like): `ente-timer-compat` existe pero no está en la +- **Timers** (cron-like): `arje-timer-compat` existe pero no está en la seed host por default. Agregalo si querés `*.timer` units migradas. - **Service generators**: no hay equivalente a `systemd-fstab-generator` ni `systemd-getty-generator`. Tu seed los declara explícitamente. @@ -198,7 +198,7 @@ default: sudo grep -E "^\s*menuentry " /boot/grub/grub.cfg | nl # Ponerlo como default (usa el índice del menú o el title exacto) -sudo grub-set-default "arje (init=/sbin/ente-zero) — kernel $(uname -r)" +sudo grub-set-default "arje (init=/sbin/arje-zero) — kernel $(uname -r)" ``` Mantené la entrada systemd como rescue. Si querés acortar la lista de @@ -211,7 +211,7 @@ Si arje no levanta el primer boot: 1. Volver a GRUB → entrada systemd → bootea normal. 2. `journalctl --boot=-1` (logs del intento previo). -3. Buscar `ente-zero` o `Tarjeta Semilla`. Si nada → el ejecutable no +3. Buscar `arje-zero` o `Tarjeta Semilla`. Si nada → el ejecutable no se lanzó (kernel panic temprano, falta `init=` correcto, etc.). 4. Si arrancó pero falló alguna Card: la próxima vez, antes de reboot: ```bash diff --git a/docs/changelog/akasha.md b/docs/changelog/chasqui.md similarity index 99% rename from docs/changelog/akasha.md rename to docs/changelog/chasqui.md index 7a613a2..6b87e87 100644 --- a/docs/changelog/akasha.md +++ b/docs/changelog/chasqui.md @@ -1,6 +1,6 @@ -# Changelog — akasha +# Changelog — chasqui -Explorador semántico de Mónadas. Renombrado de `nouser` el 2026-05-19. +Explorador semántico de Mónadas. Renombrado de `nouser` → `akasha` → el 2026-05-19. ### feat(nouser-explorer): integración al stack yahweh themed Iter 10. `nouser-explorer` (la app paralela a `nakui-explorer` diff --git a/scripts/rename-chasqui.py b/scripts/rename-chasqui.py new file mode 100644 index 0000000..8a58255 --- /dev/null +++ b/scripts/rename-chasqui.py @@ -0,0 +1,194 @@ +#!/usr/bin/env python3 +""" +Rename akasha → chasqui (2026-05-19, segunda iteración del día). + +El rename de la mañana (nouser → akasha) se revierte parcialmente: el +explorador de nómadas pasa a chasqui (Inca: mensajero corredor) para +liberar el nombre `akasha` que queda reservado para el módulo de notas +`akashi` (planeado, sin código aún). + +Reusa el patrón de scripts/reorg.py: + 1. git mv directorios + 2. package names en Cargo.toml + 3. paths relativos en Cargo.toml + 4. imports `use akasha_::` en .rs + 5. workspace root Cargo.toml + +Uso: + python3 scripts/rename-chasqui.py --dry-run + python3 scripts/rename-chasqui.py +""" + +import os, re, subprocess, sys +from pathlib import Path + +ROOT = Path("/home/sergio/brahman") +DRY = "--dry-run" in sys.argv + +MOVES: dict[str, str] = { + "crates/modules/akasha": "crates/modules/chasqui", + "crates/apps/akasha-explorer": "crates/apps/chasqui-explorer", +} + +# Sub-crates dentro de modules/akasha/ no se renombran (mantienen card/core/nous/...); +# solo cambia el directorio padre y los nombres de paquete. + +PKG_RENAMES: dict[str, str] = { + "akasha-card": "chasqui-card", + "akasha-core": "chasqui-core", + "akasha-nous": "chasqui-nous", + "akasha-nous-mock": "chasqui-nous-mock", + "akasha-nous-real": "chasqui-nous-real", + "akasha-explorer": "chasqui-explorer", + # Binario umbrella (bin name = "akasha" en akasha-core/Cargo.toml) + "akasha": "chasqui", +} + +def sh(cmd, check=True): + if DRY: + print(f" DRY: {' '.join(cmd)}") + return None + return subprocess.run(cmd, check=check, cwd=str(ROOT)) + +def git_mv(src: str, dst: str): + src_p = ROOT / src + dst_p = ROOT / dst + if not src_p.exists(): + print(f" SKIP {src} (no existe)") + return + if dst_p.exists(): + print(f" WARN {dst} ya existe — saltando") + return + dst_p.parent.mkdir(parents=True, exist_ok=True) + sh(["git", "mv", src, dst]) + +def all_cargo_tomls() -> list[Path]: + return [p for p in (ROOT / "crates").rglob("Cargo.toml") if "target" not in p.parts] + +def all_rs() -> list[Path]: + return [p for p in (ROOT / "crates").rglob("*.rs") if "target" not in p.parts] + +CURRENT_TO_OLD = {new: old for old, new in MOVES.items()} + +def owner_old_for(toml: Path) -> str: + cur = str(toml.parent.relative_to(ROOT)) + # Match cualquier prefix mapeado + for new, old in CURRENT_TO_OLD.items(): + if cur == new or cur.startswith(new + "/"): + return cur.replace(new, old, 1) + return cur + +def resolve_canon(base_dir: str, rel: str) -> str | None: + try: + return str((ROOT / base_dir / rel).resolve().relative_to(ROOT)) + except ValueError: + return None + +def rewrite_paths_in_toml(toml: Path): + text = toml.read_text() + owner_old = owner_old_for(toml) + owner_new = str(toml.parent.relative_to(ROOT)) + + def map_target(old_tgt: str) -> str: + for old_prefix, new_prefix in MOVES.items(): + if old_tgt == old_prefix or old_tgt.startswith(old_prefix + "/"): + return old_tgt.replace(old_prefix, new_prefix, 1) + return old_tgt + + def repl(m: re.Match) -> str: + rel_in_file = m.group(1) + for base in (owner_old, owner_new): + tgt = resolve_canon(base, rel_in_file) + if tgt is None: + continue + new_tgt = map_target(tgt) + if (ROOT / new_tgt).exists() or new_tgt != tgt: + new_rel = os.path.relpath(str(ROOT / new_tgt), str(ROOT / owner_new)) + return f'path = "{new_rel}"' + return m.group(0) + + new_text = re.sub(r'path\s*=\s*"([^"]+)"', repl, text) + if new_text != text: + if DRY: + print(f" DRY paths: {toml.relative_to(ROOT)}") + else: + toml.write_text(new_text) + +def rewrite_pkg_names_in_toml(toml: Path): + text = toml.read_text() + orig = text + for old, new in sorted(PKG_RENAMES.items(), key=lambda kv: -len(kv[0])): + text = re.sub(rf'(\bname\s*=\s*)"{re.escape(old)}"', rf'\1"{new}"', text) + text = re.sub(rf'(\bpackage\s*=\s*)"{re.escape(old)}"', rf'\1"{new}"', text) + text = re.sub(rf'^([ \t]*){re.escape(old)}(\s*=)', rf'\1{new}\2', + text, flags=re.MULTILINE) + text = re.sub(rf'"dep:{re.escape(old)}"', f'"dep:{new}"', text) + text = re.sub(rf'"{re.escape(old)}/', f'"{new}/', text) + text = re.sub(rf'"{re.escape(old)}"', f'"{new}"', text) + if text != orig: + if DRY: + print(f" DRY names: {toml.relative_to(ROOT)}") + else: + toml.write_text(text) + +USE_RENAMES = {k.replace("-", "_"): v.replace("-", "_") for k, v in PKG_RENAMES.items()} + +def rewrite_imports_in_rs(rs: Path): + text = rs.read_text() + orig = text + for old, new in USE_RENAMES.items(): + text = re.sub(rf'(? str: + cur = str(toml.parent.relative_to(ROOT)) + return CURRENT_TO_OLD.get(cur, cur) + +def resolve_canon(base_dir: str, rel: str): + try: + return str((ROOT / base_dir / rel).resolve().relative_to(ROOT)) + except ValueError: + return None + +def map_target(old_tgt: str) -> str: + return MOVES.get(old_tgt, old_tgt) + +def rewrite_paths_in_toml(toml: Path): + text = toml.read_text() + owner_old = owner_old_for(toml) + owner_new = str(toml.parent.relative_to(ROOT)) + + def repl(m): + rel_in_file = m.group(1) + for base in (owner_old, owner_new): + tgt = resolve_canon(base, rel_in_file) + if tgt is None: + continue + new_tgt = map_target(tgt) + if (ROOT / new_tgt).exists() or new_tgt != tgt: + new_rel = os.path.relpath(str(ROOT / new_tgt), str(ROOT / owner_new)) + return f'path = "{new_rel}"' + return m.group(0) + + new_text = re.sub(r'path\s*=\s*"([^"]+)"', repl, text) + if new_text != text: + if DRY: print(f" DRY paths: {toml.relative_to(ROOT)}") + else: toml.write_text(new_text) + +def rewrite_pkg_names_in_toml(toml: Path): + text = toml.read_text() + orig = text + for old, new in sorted(PKG_RENAMES.items(), key=lambda kv: -len(kv[0])): + old_us, new_us = old.replace("-", "_"), new.replace("-", "_") + # name = "old" / "old_us" (package, lib, bin) + text = re.sub(rf'(\bname\s*=\s*)"{re.escape(old)}"', rf'\1"{new}"', text) + text = re.sub(rf'(\bname\s*=\s*)"{re.escape(old_us)}"', rf'\1"{new_us}"', text) + text = re.sub(rf'(\bpackage\s*=\s*)"{re.escape(old)}"', rf'\1"{new}"', text) + # dep key al inicio de línea + text = re.sub(rf'^([ \t]*){re.escape(old)}(\s*=)', rf'\1{new}\2', + text, flags=re.MULTILINE) + # features / strings + text = re.sub(rf'"dep:{re.escape(old)}"', f'"dep:{new}"', text) + text = re.sub(rf'"{re.escape(old)}/', f'"{new}/', text) + text = re.sub(rf'"{re.escape(old)}"', f'"{new}"', text) + if text != orig: + if DRY: print(f" DRY names: {toml.relative_to(ROOT)}") + else: toml.write_text(text) + +USE_RENAMES = {k.replace("-", "_"): v.replace("-", "_") for k, v in PKG_RENAMES.items()} + +def rewrite_imports_in_rs(rs: Path): + text = rs.read_text() + orig = text + for old, new in sorted(USE_RENAMES.items(), key=lambda kv: -len(kv[0])): + text = re.sub(rf'(? + click delegate + centers │ + └────────────┴─────┴───────┴─────────────────────────────────────────────┘ + + Hecho hoy. Modelo Task + render HTML puro extraído a core. barra-web mantiene + mount/click/lookups DOM intrínsecos. + + --- + 15 · modules/cosmobiologia/ — 21,502 LOC · ★★★☆☆ + + Crate más grande del monorepo. 11 sub-crates. + + ┌──────────────────────────────────┬────────┬─────────┬───────┐ + │ crate │ LOC │ tests │ TODOs │ + ├──────────────────────────────────┼────────┼─────────┼───────┤ + │ cosmobiologia-canvas │ 2,850 │ no │ — │ + ├──────────────────────────────────┼────────┼─────────┼───────┤ + │ cosmobiologia-engine │ 2,687 │ sí │ 12 │ + ├──────────────────────────────────┼────────┼─────────┼───────┤ + │ cosmobiologia-tree │ 2,295 │ no │ — │ + ├──────────────────────────────────┼────────┼─────────┼───────┤ + │ cosmobiologia-render │ 1,474 │ sí │ — │ + ├──────────────────────────────────┼────────┼─────────┼───────┤ + │ cosmobiologia-panel │ 1,037 │ sí │ — │ + ├──────────────────────────────────┼────────┼─────────┼───────┤ + │ cosmobiologia-modules │ 955 │ — │ — │ + ├──────────────────────────────────┼────────┼─────────┼───────┤ + │ cosmobiologia-store │ 760 │ sí │ — │ + ├──────────────────────────────────┼────────┼─────────┼───────┤ + │ (resto: model, theme, card, web) │ ~1,000 │ parcial │ — │ + └──────────────────────────────────┴────────┴─────────┴───────┘ + + Hecho. Render agnóstico (DrawCommand + compose_wheel) con dos backends: GPUI + nativo + WASM SVG. App standalone funcional. Server HTTP single-user con CRUD. + Cliente web demo SSR. Crate WASM con fallback inteligente. Compose wheel rico + (palette + dial 3D + spread + coord labels). + + Pendiente (roadmap del proyecto): + + ┌───────┬──────────────────────────────────┬─────────────────────────┐ + │ # │ área │ crates afectados │ + ├───────┼──────────────────────────────────┼─────────────────────────┤ + │ 55-62 │ Sistema GR (8 tareas) │ engine + canvas + panel │ + ├───────┼──────────────────────────────────┼─────────────────────────┤ + │ 63 │ FFT armónico │ engine + modules │ + ├───────┼──────────────────────────────────┼─────────────────────────┤ + │ 64-65 │ Research bank (corpus + queries) │ store + engine │ + ├───────┼──────────────────────────────────┼─────────────────────────┤ + │ 66 │ 3D celestial sphere │ render + canvas │ + ├───────┼──────────────────────────────────┼─────────────────────────┤ + │ 67 │ Rectificador automático │ engine + modules │ + └───────┴──────────────────────────────────┴─────────────────────────┘ + + --- + 16 · apps/ — 23 binarios + + ┌───────────────┬────────────────────────────────────────────────────────────┐ + │ categoría │ apps │ + ├───────────────┼────────────────────────────────────────────────────────────┤ + │ Protocol │ brahman-broker-explorer, brahman-demo │ + ├───────────────┼────────────────────────────────────────────────────────────┤ + │ │ nahual-shell, nahual-file-explorer, │ + │ Nahual suite │ nahual-database-explorer, nahual-text-viewer, │ + │ │ nahual-image-viewer │ + ├───────────────┼────────────────────────────────────────────────────────────┤ + │ Akasha │ akasha-explorer │ + ├───────────────┼────────────────────────────────────────────────────────────┤ + │ Nakui │ nakui-ui, nakui-explorer │ + ├───────────────┼────────────────────────────────────────────────────────────┤ + │ Minga │ minga-explorer │ + ├───────────────┼────────────────────────────────────────────────────────────┤ + │ Shuma │ shuma-daemon, shuma-cli, shuma-gateway, shuma-shell │ + ├───────────────┼────────────────────────────────────────────────────────────┤ + │ Pineal demos │ pineal-demo, pineal-stream-demo, pineal-phosphor-demo, │ + │ │ pineal-financial-demo │ + ├───────────────┼────────────────────────────────────────────────────────────┤ + │ Web │ gioser-web (cdylib) │ + ├───────────────┼────────────────────────────────────────────────────────────┤ + │ Cosmobiología │ cosmobiologia (GPUI), cosmobiologia-cli, │ + │ │ cosmobiologia-server │ + └───────────────┴────────────────────────────────────────────────────────────┘ + + --- + 17 · Tooling y artefactos cross-cutting + + scripts/ + ├── reorg.py ← migración monorepo (hoy) + ├── split-changelog.py ← partición CHANGELOG (hoy) + ├── bootstrap-demo.sh ← escenario reproducible + ├── build-arje-initrd.sh ← initramfs CPIO+gzip musl-static + ├── build-gioser-web.sh ← WASM + wasm-bindgen + ├── install-arje-as-init.sh, uninstall-arje.sh + └── run-arje-qemu.sh + + seeds/ + ├── arje-minimal.card.json ← shell bare + ├── arje-host.card.json ← full host (13 sub-cards) + └── arje-prod.card.json ← 15 sub-cards prod (tmpfiles, binfmt, daemons, + getty) + + docs/ + ├── STATUS.md, ROADMAP.md ← global (hoy) + ├── arje-boot.md ← initrd + QEMU + bare metal + ├── arje-replace-systemd.md + └── changelog/ ← 7 buckets por proyecto (hoy) + + --- + 18 · Métricas agregadas + + ┌───────────────────────┬────────────────────────────────────────────────────┐ + │ dimensión │ valor │ + ├───────────────────────┼────────────────────────────────────────────────────┤ + │ Total crates │ 126 │ + ├───────────────────────┼────────────────────────────────────────────────────┤ + │ Binarios [[bin]] │ 35 │ + ├───────────────────────┼────────────────────────────────────────────────────┤ + │ Librerías │ 89 │ + ├───────────────────────┼────────────────────────────────────────────────────┤ + │ cdylib (WASM) │ 2 (gioser-web, cosmobiologia-web) │ + ├───────────────────────┼────────────────────────────────────────────────────┤ + │ LOC totales │ ~78,000 │ + ├───────────────────────┼────────────────────────────────────────────────────┤ + │ Crates con tests │ 65 / 126 (52%) — esperable, compat shims sin tests │ + ├───────────────────────┼────────────────────────────────────────────────────┤ + │ TODOs/FIXMEs/todo!() │ 155 total · 78% concentrado en 4 crates │ + ├───────────────────────┼────────────────────────────────────────────────────┤ + │ Cobertura cargo check │ 100% (workspace verde) │ + └───────────────────────┴────────────────────────────────────────────────────┘ + + Concentración de deuda técnica: + - cosmobiologia-engine: 12 TODOs (sistema GR, harmonics) + - ente-brain: 11 TODOs (rule engine) + - brahman-handshake: 10 TODOs (trust fase 4) + - shuma-core: 14 TODOs (supervisión avanzada) + - Otros 65 crates: 108 TODOs distribuidos + + --- + 19 · Plan global a finalización + + Orden topológico (bottom-up del stack), con dependencias declaradas. + + Hito 1 · Cobertura crítica (semana 1-2) + + Cierra los gaps donde el código existe pero no hay tests, antes de añadir + features sobre código no validado. + + ┌───────────────────────────────────────────┬───────────────┬───────────────┐ + │ tarea │ crate │ desbloquea │ + ├───────────────────────────────────────────┼───────────────┼───────────────┤ + │ Tests E2E sobre cosmobiologia-canvas │ cosmo-canvas │ confianza UI │ + ├───────────────────────────────────────────┼───────────────┼───────────────┤ + │ Tests E2E sobre cosmobiologia-tree │ cosmo-tree │ confianza UI │ + ├───────────────────────────────────────────┼───────────────┼───────────────┤ + │ Tests sobre akasha-core::cluster │ akasha-core │ drift │ + │ (k-means) │ │ handling │ + ├───────────────────────────────────────────┼───────────────┼───────────────┤ + │ Tests FractalSnapshot restore con stale │ ente-snapshot │ resiliencia │ + │ fds │ │ │ + ├───────────────────────────────────────────┼───────────────┼───────────────┤ + │ Tests sobre brahman-admin (único protocol │ brahman-admin │ cierre suite │ + │ sin tests) │ │ │ + └───────────────────────────────────────────┴───────────────┴───────────────┘ + + Salida: ≥1 test por crate sin cobertura actual + matriz de panics. + + Hito 2 · Cerrar stubs bloqueantes (semana 2-3) + + ┌────────────────┬───────────────────┬───────────────────────────────┐ + │ stub │ LOC actual → meta │ impacto │ + ├────────────────┼───────────────────┼───────────────────────────────┤ + │ minga-vfs │ 2 → ~600 │ Mount FUSE de mónadas remotas │ + ├────────────────┼───────────────────┼───────────────────────────────┤ + │ pineal-polar │ <50 → ~300 │ Coord polar funcional │ + ├────────────────┼───────────────────┼───────────────────────────────┤ + │ pineal-heatmap │ <50 → ~250 │ Grid 2D color-mapped │ + ├────────────────┼───────────────────┼───────────────────────────────┤ + │ pineal-treemap │ <50 → ~300 │ Rectangular treemap │ + ├────────────────┼───────────────────┼───────────────────────────────┤ + │ pineal-flow │ <50 → ~400 │ Sankey diagrams │ + ├────────────────┼───────────────────┼───────────────────────────────┤ + │ pineal-mesh │ <50 → ~250 │ Triangle mesh + barycentric │ + └────────────────┴───────────────────┴───────────────────────────────┘ + + Bloqueante de minga-vfs: estabilizar tras Hito 1 (sin tests es prematuro). + + Hito 3 · Cerrar TODOs concentrados (semana 3-5, paralelo) + + Tres tracks independientes, paralelizables: + + Track A — Brain rule engine (ente-brain, 11 TODOs) + - Evaluador completo de policies declarativas + - Observer estadístico cross-ente (Bayesian update) + - Reglas como Cards (recursión: policies son módulos) + + Track B — Shuma supervisión (shuma-core, 14 TODOs) + - Auth gateway (token via env / mTLS) + - Rotación audit.log con N backups + - WIT contracts reales sobre flow types + - Métricas exportables (Prometheus endpoint) + - shipote-shell click handler + + Track C — Handshake fase 4 (brahman-handshake, 10 TODOs) + - Capabilities revocables + - Trust beyond peer (delegación) + - Métricas + audit chain hacia brain + + Hito 4 · Cosmobiología innovaciones (semana 4-7) + + Roadmap del proyecto, 5 áreas: + + 1. Sistema GR (#55-#62) — dual-ring directas+conversas, scrubbing live, HUD + triggers, modo rectificación. Requiere expansión de cosmobiologia-engine + + cosmobiologia-panel. + 2. FFT armónico (#63) — detección automática de ciclos en órbitas. Sobre + cosmobiologia-modules. + 3. Research bank (#64-#65) — corpus de cartas + queries. Sobre + cosmobiologia-store + cosmobiologia-engine. + 4. 3D celestial sphere (#66) — renderer esférico vs el 2D actual. Sobre + cosmobiologia-render + cosmobiologia-canvas. + 5. Rectificador automático (#67) — ajuste de hora natal vía eventos confirmados. + Sobre cosmobiologia-engine + cosmobiologia-modules. + + Hito 5 · Compat avanzado systemd (semana 5-7, paralelo a Hitos 3-4) + + ┌──────────────────────┬──────────────────────┬────────────────────┐ + │ shim │ método pendiente │ desbloquea │ + ├──────────────────────┼──────────────────────┼────────────────────┤ + │ ente-logind-compat │ Inhibit, Sleep hooks │ GNOME power mgmt │ + ├──────────────────────┼──────────────────────┼────────────────────┤ + │ ente-localed-compat │ SetVariable │ apps con locale UI │ + ├──────────────────────┼──────────────────────┼────────────────────┤ + │ ente-machined-compat │ MachineImage ops │ nspawn workflows │ + └──────────────────────┴──────────────────────┴────────────────────┘ + + Meta: GNOME Shell arrancable sobre ente-zero sin parches. + + Hito 6 · Polish + DX + onboarding (semana 7-8) + + - scripts/check.sh que corra fmt + clippy + test --workspace + - Aliases legacy de binario: shipote → shuma, yahweh → nahual + - README raíz que apunte a los 16 SDDs y al ROADMAP + - Actualizar seeds/arje-*.card.json con nombres nuevos + - Pluma AST con inline elements completos + + --- + 20 · Diagrama de dependencias del stack + + ┌──────────────┐ + │ apps/ (23) │ + └──────┬───────┘ + ↓ + ┌──────────────────────────────┐ + │ modules/ (62) │ + │ │ + │ cosmobiologia ←──────┐ │ + │ ↓ │ │ + │ nahual + pineal │ │ + │ ↓ │ │ + │ shuma akasha nakui │ │ + │ minga │ │ + │ gioser pluma vista │ │ + │ barra │ │ + └──────────────┬────────────┬──┘ + ↓ │ + ┌─────────────┐ │ + │ runtime/ │←────┘ + │ bus·cas· │ + │ wasm·brain │ + └──────┬──────┘ + ↓ + ┌─────────────┐ + │ init/ │ + │ ente-zero, │ + │ kernel, │ + │ incarnate │ + └──────┬──────┘ + ↓ + ┌─────────────────┐ + │ protocol/ │ + │ card·handshake· │ + │ broker·sidecar │ ← TODOS dependen de esto + │ net │ + └─────────────────┘ + + [compat/ corre en paralelo, consume bus/card] + + --- + 21 · Cronograma global + + sem 1 sem 2 sem 3 sem 4 sem 5 sem 6 sem 7 sem 8 + ├─Hito1──► + ├─Hito2──► + ├─Hito3 Track A (brain)──────────────► + ├─Hito3 Track B (shuma)──────────────► + ├─Hito3 Track C (handshake)──────────► + ├─Hito4 (cosmo innov)─────────────────► + ├─Hito5 (compat avanzado)──► + ├─Hito6 (polish)─► + + Solo persona: ~7-8 semanas continuas. Paralelizado (3 tracks Hito 3 + Hito 4 + + Hito 5 disjuntos): ~3-4 semanas. + + --- + 22 · Bloqueantes críticos (vigilar) + + 1. minga-vfs stub → sin él el sistema de archivos de mónadas no existe → bloquea + akasha como fuente de datos integrada. + 2. ente-brain rule engine parcial → sin él, la observabilidad fractal es opaca → + bloquea decisiones políticas autónomas del Init. + 3. Cosmobiología canvas/tree sin tests → 5,145 LOC de UI sin red de seguridad → + cualquier refactor en GPUI es riesgoso. + 4. Compat shims básicos → Inhibit/SetVariable/MachineImage faltan → GNOME no es + estable sobre arje. + + --- + 23 · Resumen de un vistazo + + ┌───────────────┬─────────┬────────┬───────┬─────────────────────────────────┐ + │ capa/módulo │ madurez │ LOC │ tests │ acción siguiente │ + ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤ + │ protocol │ ★★★★☆ │ 6,260 │ sí │ fase 4 trust (Hito 3C) │ + ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤ + │ init │ ★★★★☆ │ 3,600 │ parc. │ snapshot restore tests (H1) │ + ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤ + │ runtime │ ★★★☆☆ │ 3,400 │ parc. │ brain rule engine (H3A) │ + ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤ + │ compat │ ★★★☆☆ │ 5,000 │ no │ métodos avanzados (H5) │ + ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤ + │ minga │ ★★★★☆ │ 5,091 │ sí │ vfs (H2) ◄ BLOQUEANTE │ + ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤ + │ nahual │ ★★★★★ │ 15,968 │ E2E │ mantenimiento │ + ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤ + │ pineal │ ★★★☆☆ │ 3,900 │ sí │ 5 stubs (H2) │ + ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤ + │ nakui │ ★★★★☆ │ 7,063 │ sí │ docs morfismos (H6) │ + ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤ + │ akasha │ ★★★☆☆ │ 4,395 │ parc. │ cluster tests (H1) │ + ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤ + │ shuma │ ★★★★☆ │ 6,907 │ sí │ auth gateway (H3B) │ + ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤ + │ gioser │ ★★★★★ │ 2,535 │ sí │ estable │ + ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤ + │ pluma │ ★★★☆☆ │ 178 │ no │ AST inline (H6) │ + ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤ + │ vista (HOY) │ ★★★★☆ │ 530 │ 5/5 │ estable │ + ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤ + │ barra (HOY) │ ★★★★☆ │ 280 │ 5/5 │ estable │ + ├───────────────┼─────────┼────────┼───────┼─────────────────────────────────┤ + │ cosmobiologia │ ★★★☆☆ │ 21,502 │ parc. │ tests canvas/tree (H1) + innov │ + │ │ │ │ │ (H4) │ + └───────────────┴─────────┴────────┴───────┴─────────────────────────────────┘ + + Trazo desde aquí: Hito 1 desbloquea Hito 2, que desbloquea Hito 3 en paralelo + con Hito 4 y Hito 5, cerrando con Hito 6 polish. Estimación realista a v1.0 + estable: 6-8 semanas continuas o 3-4 semanas con paralelización agresiva. + + + temas de dudas (sí te dije que esa ia estaba loca en ese texto): + 1. no es hypervisor, pero sí ejecuta procesos con capacidad de aislamiento. lo que hablamos antes, acláralo si no lo hablamos antes. pero vamos a estar conectados con brahman, posiblemente ejecutando procesos en dht. + 2. usa tu criterio, pero la idea es que este como compositor es el pintor del lienzo, pero va a tener la capacidad de delegar a través de brahman trozos de su superficie a otras aplicaciones/módulos, y estos a su vez pueden disponer de subtrozos para otras aplicaciones/modulos. así que vamos a hacer, tanto pintar en wayland, como orquestar las aplicaciones que tendremos dentro. para aplicaciones agnósticas, que va a ser lo "normal", va a comportarse digamos como un compositor normal. + 3. no, usa protocolo logind. eso del criu déjalo para un futuro. lo del aislamiento va a seguir la misma política de las cards. + + del navegador: + tienes razón. bueno, sigue las mejores reglas para repartir la responsabilidad. es el compositor el que define los layers, no? y la pintada. y se las da a las aplicaciones que se lo piden que puede ejecutar el shell/launcher, ayudame en eso, que hoy no dormí bien. modularidad horizontal. + + decisiones: + 1. carmen. + 2. minga es el git, no la red. la red dht debería ser un core invisible para todo el ecosistema brahman. o sea, c. + 3. criu. déjalo para otro día pero no lo olvides. + 4. c. + 5. declarado. + 6. si es forzado, no. pero cuando sea grande lo voy a querer. + + + + + + + + + + + + --- + Nuevo PLAN_MACRO con subtareas multi-nivel + + FASE A · Foundations cleanup + renames batch (sem 1-2) + ├─ A1 · Rename batch en código + │ ├─ A1.1 Modificar scripts/rename-fase-a.py (add MOVES + PKG_RENAMES) + │ ├─ A1.2 Dry-run verificación + │ ├─ A1.3 Ejecutar: git mv + sed Cargo.toml + sed .rs + workspace toml + │ ├─ A1.4 cargo check --workspace verde + │ ├─ A1.5 Actualizar SDDs (init, runtime, compat → arje; revista; fana) + │ ├─ A1.6 Actualizar docs/STATUS.md, ROADMAP.md, PLAN_MACRO.md + │ ├─ A1.7 Mover + docs/changelog/{init,runtime,compat,minga,nahual,nakui,protocol}.md (referencias + internas a arje-) + │ └─ A1.8 Commit + push + │ + ├─ A2 · Split arje-brain en 3 sub-crates + │ ├─ A2.1 arje-brain-rules (engine + rules + dispatch — 678 LOC) + │ ├─ A2.2 arje-brain-cognitive (observer + crystallize + autopromote — 799 + LOC) + │ ├─ A2.3 arje-brain-audit (audit + introspect + metrics — 1,201 LOC) + │ ├─ A2.4 arje-brain umbrella opcional (features-based) o eliminar + │ ├─ A2.5 Migrar consumidores (arje-zero, chasqui-core) + │ └─ A2.6 cargo check + commit + │ + ├─ A3 · Unificar loader duplicado + │ ├─ A3.1 Mover arje-brain/loader.rs → brahman-cards + │ ├─ A3.2 brahman-cards gana load_card_file + load_rules_file + + extract_*_from_json + │ ├─ A3.3 arje-brain depende de brahman-cards + │ └─ A3.4 cargo check + commit + │ + ├─ A4 · Extraer sandokan-lifecycle de shuma-core + │ ├─ A4.1 Crear crate runtime/sandokan-lifecycle + │ ├─ A4.2 Mover primitivas: TTL + restart backoff + quota enforce + drain + + snapshot + │ ├─ A4.3 shuma-core depende de sandokan-lifecycle como cliente + │ ├─ A4.4 Tests existentes siguen pasando + │ └─ A4.5 cargo check + commit + │ + ├─ A5 · Ampliar arje-incarnate con pivot_root + OverlayFS + │ ├─ A5.1 Agregar pivot_root al builder de Incarnator + │ ├─ A5.2 Agregar capa OverlayFS declarativa (rootfs RO + session RW) + │ ├─ A5.3 Tests: chroot básico funciona + overlay funciona + │ └─ A5.4 cargo check + commit + │ + └─ A6 · Crear brahman-ssh-multiplex + ├─ A6.1 Wrapper sobre russh + ├─ A6.2 Canales paralelos + TCP_NODELAY + KeepAlive 15s + ├─ A6.3 Reconexión silenciosa + ├─ A6.4 Tests con servidor SSH local + └─ A6.5 cargo check + commit + + FASE B · Core libraries (sem 2-5) + ├─ B1 · sandokan (orquestador library) + │ ├─ B1.1 Trait Engine { run/track/telemetry } + │ ├─ B1.2 LocalEngine (in-process: arje-incarnate + arje-brain-rules + + broker) + │ ├─ B1.3 DaemonEngine (postcard sobre Unix socket) + │ ├─ B1.4 RemoteEngine (sobre brahman-ssh-multiplex + DaemonEngine remoto) + │ ├─ B1.5 Engine::auto() detecta socket y elige + │ └─ B1.6 Tests + integración con arje-zero como daemon host + │ + ├─ B2 · verbo (embeddings multi-backend) + │ ├─ B2.1 verbo-core (trait Provider, ModelId, EmbeddingVector) + │ ├─ B2.2 verbo-cohere (HTTP API remoto) + │ ├─ B2.3 verbo-bge-local (bge-code-large vía ort) + │ ├─ B2.4 verbo-mini-local (MiniLM-L6-v2 384d vía ort, para badu) + │ ├─ B2.5 verbo-fastembed (fallback) + │ ├─ B2.6 verbo-daemon (binario --backend X, multi-instancia) + │ ├─ B2.7 verbo-client (cliente IPC) + │ └─ B2.8 Migrar chasqui-nous-real de fastembed inline → verbo-client + │ + ├─ B3 · brahman-dht (library DHT agnóstica) + │ ├─ B3.1 Sobre brahman-net libp2p (kad + provider records) + │ ├─ B3.2 Trait DhtBackend con kind: Code | Card | Persona | ... + │ ├─ B3.3 Publish + lookup + announce + │ └─ B3.4 Consumido por minga-p2p (kind=Code), brahman-card-discovery + (kind=Card), agorapura (kind=Persona) + │ + └─ B4 · brahman-card-discovery + ├─ B4.1 Trait CardSearch + impls local (CAS + filesystem) + dht (vía + brahman-dht) + ├─ B4.2 Filtros por kind, flow type, capabilities + └─ B4.3 Widget nahual/widgets/card-browser consume CardSearch + + FASE C · Apps standalone (sem 4-12, paralelizables) + ├─ C1 · fana (prioridad alta — absorbe pluma + nuevo writer's DAG editor) + │ ├─ C1.1 fana-core (NarrativeAtom + NarrativeGraph + CoherenceState) + │ ├─ C1.2 fana-md (absorbe pluma-md como parser markdown) + │ ├─ C1.5 fana-store (sled o RocksDB + bincode/rkyv zero-copy) + │ ├─ C1.6 fana-llm (cliente HTTP a LLMs remotos vía reqwest) + │ ├─ C1.7 fana-render-plan (DrawCommands agnósticos: editor + sidepane + + ghost trace) + │ ├─ C1.8 fana-editor-gpui (WorkspaceEditor View custom + + OscilloscopeSidepane + GhostTrace) + │ ├─ C1.9 fana-md-reader-web (absorbe pluma-reader-web, sigue siendo dep de + gioser-web) + │ ├─ C1.10 fana-editor-web (futuro WASM editor) + │ ├─ C1.11 apps/fana (binario GPUI) + │ └─ C1.12 apps/fana-web (futuro cdylib) + │ + ├─ C2 · badu (note-taking, ex-akashi) + ├─ C3 · dominium (simulador psicológico) + ├─ C4 · takiy (composición musical) + ├─ C5 · matilda (server admin) + ├─ C6 · mirada (compositor Wayland, ex-carmen) + └─ C7 · agorapura (identidad humana federada) + + FASE D · charka (paralelo multi-mes) + FASE E · yachay (integrador, sem 12-18) + FASE F · Cobertura tests + cerrar stubs cosmo/pineal (continuo) + FASE G · Backlog (rimay, yuyay, apu, tinkuy, nutu, ...)