use serde::{Serialize, Deserialize};
use epoekie::AID;
use gtiot::ActuatorState;
use zcmk::TokenPicotoken;
use rttp::IqaSeal;
pub const VERSION: &str = "1.2.1-Alpha";
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TrajectorySeal {
pub aid: AID,
pub waypoints: Vec<[f32; 3]>,
pub kinetic_signature: Vec<u8>,
pub expiration: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KineticRequest {
pub bid: TokenPicotoken,
pub path: TrajectorySeal,
pub required_torque: f32,
}
pub trait SovereignKinematics {
fn negotiate_path(&self, request: KineticRequest) -> Result<TrajectorySeal, MobilityError>;
fn sync_actuation(&self, state: &ActuatorState) -> bool;
fn validate_sovereignty(&self, seal: &TrajectorySeal, auth: &IqaSeal) -> bool;
}
pub struct MobilityEngine {
pub vessel_aid: AID,
pub safety_margin: f32,
}
impl MobilityEngine {
pub fn new(vessel_aid: AID) -> Self {
Self { vessel_aid, safety_margin: 0.15 }
}
pub fn check_clearance(&self) -> bool { true }
}
#[derive(Debug, thiserror::Error)]
pub enum MobilityError {
#[error("Kinetic Conflict: Path occupied by higher-priority sovereign")]
KineticConflict,
#[error("Clearing Denied: Insufficient Picotoken bid")]
ClearingDenied,
#[error("Trajectory Violation: Physical actuation out of sync")]
TrajectoryViolation,
}