refactor(naming): A1 — ente→arje, vista→revista, pluma→fana
1//! Eventos internos del bucle primordial. Todo cambio de estado del fractal
2//! pasa por aquí — la única vía de mutación del grafo desde tasks externas.
3//!
4//! Este módulo es **vocabulario**: declara el universo completo de eventos
5//! del fractal. Algunas variantes/campos están reservados para flujos
6//! aún no implementados (capabilities, signal-driven shutdown). Silenciar
7//! `dead_code` evita ruido sin perder la declaración del contrato.
8
9#![allow(dead_code)]
10
11use arje_bus::{BusMessage, BusRequest, BusResponse, PeerCreds};
12use arje_card::{Capability, EntityCard};
13use nix::sys::signal::Signal;
14use tokio::sync::{mpsc, oneshot};
15use ulid::Ulid;
16
17#[derive(Debug)]
18pub enum GraphEvent {
19 EnteDied { id: Ulid, status: ExitStatus },
20 CapabilityRequested {
21 from: Ulid,
22 cap: Capability,
23 reply: oneshot::Sender<CapabilityGrant>,
24 },
25 SpawnRequest { card: EntityCard, requester: Ulid },
26 /// Request del bus interno. `peer` es no-falsificable (kernel-injected
27 /// via SO_PEERCRED). `from` es la identidad reclamada por el cliente —
28 /// el grafo la verifica contra `peer.pid`.
29 BusRequest {
30 peer: PeerCreds,
31 from: Option<Ulid>,
32 request: BusRequest,
33 outbound: mpsc::Sender<BusMessage>,
34 reply: oneshot::Sender<BusResponse>,
35 },
36 /// Response a un Invoke forwardeado por el grafo a un proveedor.
37 /// `seq` debe coincidir con una entry en pending_invokes.
38 BusResponse { seq: u64, response: BusResponse },
39 /// Cliente del bus cerró su conexión. Si había anunciado identidad,
40 /// el grafo retira esa conexión del registry.
41 BusConnClosed { ente_id: Option<Ulid> },
42 Shutdown { reason: ShutdownReason },
43}
44
45#[derive(Debug, Clone)]
46pub enum ExitStatus {
47 Exit(i32),
48 Killed(Signal),
49}
50
51#[derive(Debug, Clone)]
52pub enum ShutdownReason {
53 SeedRequested,
54 Signal(Signal),
55}
56
57#[derive(Debug)]
58pub enum CapabilityGrant {
59 Granted { token: u64 },
60 NoProvider,
61 Denied { reason: &'static str },
62 /// El holder ya tiene el máximo de tokens activos para esta cap.
63 /// Debe esperar a que alguno expire o renovar uno existente.
64 QuotaExceeded { active: u32, limit: u32 },
65}