fluxvm 0.1.1

FLUX bytecode runtime — Fluid Language Universal eXecution: a zero-dependency register-based VM with assembler, disassembler, A2A agent protocol, and vocabulary system
Documentation
use std::fmt;

#[derive(Debug, Clone, Copy, PartialEq)]
pub enum MessageType {
    Tell = 1,
    Ask = 2,
    Delegate = 3,
    Broadcast = 4,
}

#[derive(Debug, Clone)]
pub struct A2AMessage {
    pub sender: [u8; 16],
    pub receiver: [u8; 16],
    pub conversation_id: [u8; 16],
    pub message_type: MessageType,
    pub payload: Vec<u8>,
    pub trust_score: f32,
}

impl A2AMessage {
    pub fn new(sender: [u8; 16], receiver: [u8; 16], msg_type: MessageType, payload: Vec<u8>) -> Self {
        Self {
            sender,
            receiver,
            conversation_id: [0u8; 16],
            message_type: msg_type,
            payload,
            trust_score: 0.5,
        }
    }

    pub fn to_bytes(&self) -> Vec<u8> {
        let mut buf = Vec::new();
        buf.extend_from_slice(&self.sender);
        buf.extend_from_slice(&self.receiver);
        buf.extend_from_slice(&self.conversation_id);
        buf.push(self.message_type as u8);
        buf.extend_from_slice(&(self.payload.len() as u16).to_le_bytes());
        buf.extend_from_slice(&self.payload);
        buf.extend_from_slice(&self.trust_score.to_le_bytes());
        buf
    }

    pub fn from_bytes(data: &[u8]) -> Option<Self> {
        if data.len() < 51 { return None; }
        let mut sender = [0u8; 16]; sender.copy_from_slice(&data[0..16]);
        let mut receiver = [0u8; 16]; receiver.copy_from_slice(&data[16..32]);
        let mut conv_id = [0u8; 16]; conv_id.copy_from_slice(&data[32..48]);
        let msg_type = match data[48] {
            1 => MessageType::Tell,
            2 => MessageType::Ask,
            3 => MessageType::Delegate,
            4 => MessageType::Broadcast,
            _ => return None,
        };
        let payload_len = u16::from_le_bytes([data[49], data[50]]) as usize;
        if data.len() < 51 + payload_len + 4 { return None; }
        let payload = data[51..51+payload_len].to_vec();
        let trust_score = f32::from_le_bytes([data[51+payload_len], data[52+payload_len], data[53+payload_len], data[54+payload_len]]);

        Some(Self { sender, receiver, conversation_id: conv_id, message_type: msg_type, payload, trust_score })
    }
}

impl fmt::Display for A2AMessage {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "A2A::{:?}(trust={:.2}, {} bytes)", self.message_type, self.trust_score, self.payload.len())
    }
}