Skip to main content

cell_model/
protocol.rs

1// SPDX-License-Identifier: MIT
2// Copyright (c) 2025 Leif Rydenfalk – https://github.com/Leif-Rydenfalk/cell
3
4use crate::config::CellInitConfig;
5use alloc::boxed::Box;
6use alloc::string::String;
7use alloc::vec::Vec;
8use serde::{Deserialize, Serialize};
9use std::collections::HashMap;
10
11pub const GENOME_REQUEST: &[u8] = b"__CELL_GENOME_REQUEST__";
12pub const SHM_UPGRADE_REQUEST: &[u8] = b"__SHM_UPGRADE_REQUEST__";
13pub const SHM_UPGRADE_ACK: &[u8] = b"__SHM_UPGRADE_ACK__";
14
15pub const GAP_JUNCTION_FD: i32 = 3;
16
17#[derive(Serialize, Deserialize, Debug, Clone)]
18pub struct CellGenome {
19    pub name: String,
20    pub fingerprint: u64,
21    pub methods: Vec<MethodSchema>,
22    pub types: Vec<TypeSchema>,
23    pub macros: Vec<MacroSchema>,
24}
25#[derive(Serialize, Deserialize, Debug, Clone)]
26pub struct MethodSchema {
27    pub name: String,
28    pub inputs: Vec<(String, TypeRef)>,
29    pub output: TypeRef,
30}
31#[derive(Serialize, Deserialize, Debug, Clone)]
32pub struct TypeSchema {
33    pub name: String,
34    pub kind: TypeKind,
35}
36#[derive(Serialize, Deserialize, Debug, Clone)]
37pub enum TypeKind {
38    Struct { fields: Vec<(String, TypeRef)> },
39    Enum { variants: Vec<(String, Vec<TypeRef>)> },
40}
41#[derive(Serialize, Deserialize, Debug, Clone)]
42pub struct MacroSchema {
43    pub name: String,
44    pub kind: MacroKind,
45    pub source: String,
46    pub dependencies: Vec<String>,
47}
48#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
49pub enum MacroKind { Declarative, Attribute, Derive, Function }
50#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
51pub enum TypeRef { Named(String), Primitive(Primitive), Vec(Box<TypeRef>), Option(Box<TypeRef>), Result(Box<TypeRef>, Box<TypeRef>), Unit, Unknown }
52#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq)]
53pub enum Primitive { String, U8, U16, U32, U64, I8, I16, I32, I64, F32, F64, Bool }
54
55#[derive(Serialize, Deserialize, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, Debug)]
56#[archive(check_bytes)]
57pub enum MitosisRequest {
58    Spawn { cell_name: String, config: Option<CellInitConfig> },
59    Test { target_cell: String, filter: Option<String> },
60}
61
62#[derive(Serialize, Deserialize, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, Debug)]
63#[archive(check_bytes)]
64pub enum MitosisResponse {
65    Ok { socket_path: String },
66    Denied { reason: String },
67}
68
69// --- MESH PROTOCOL ---
70
71#[derive(Serialize, Deserialize, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, Debug)]
72#[archive(check_bytes)]
73pub enum MeshRequest {
74    ResolveDependencies { cell_name: String, dependencies: Vec<String> },
75    ReportHealth { cell_name: String, healthy: bool },
76    // NEW: Request the full graph to perform GC analysis
77    GetFullGraph,
78}
79
80#[derive(Serialize, Deserialize, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, Debug)]
81#[archive(check_bytes)]
82pub enum MeshResponse {
83    DependencyMapping { cell_name: String, socket_paths: HashMap<String, String> },
84    Ack,
85    // NEW: Return the graph (Consumer -> [Providers])
86    FullGraph(HashMap<String, Vec<String>>),
87    Error { message: String },
88}
89
90// --- NUCLEUS PROTOCOL EXTENSION (Handled via generic RPC usually, but defining here for clarity) ---
91// Note: Nucleus usually uses the `handler!` macro which generates specific enums. 
92// We will update main.rs in Nucleus to include the Vacuum method.
93
94#[derive(Serialize, Deserialize, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, Debug)]
95#[archive(check_bytes)]
96pub enum TestEvent {
97    Log(String),
98    CaseStarted(String),
99    CaseFinished { name: String, success: bool, duration_ms: u64 },
100    SuiteFinished { total: u32, passed: u32, failed: u32 },
101    Error(String),
102}
103
104#[derive(Serialize, Deserialize, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, Debug)]
105#[archive(check_bytes)]
106pub enum MitosisSignal {
107    Prophase,
108    RequestIdentity,
109    Prometaphase { socket_path: String },
110    Cytokinesis,
111    Apoptosis { reason: String },
112    Necrosis,
113}
114
115#[derive(Serialize, Deserialize, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, Debug)]
116#[archive(check_bytes)]
117pub enum MitosisControl {
118    InjectIdentity(CellInitConfig),
119    Terminate,
120}