stasis-rs 0.1.0

Durable AI orchestration framework with runtime jobs, lineage, and memory integration
Documentation
use chrono::{DateTime, Duration, Utc};

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ClusterNodeRole {
    Coordinator,
    Scheduler,
    Worker,
}

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum QueueOwnershipMode {
    MultiOwner,
    SingleOwner,
}

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ClusterNodeHealth {
    Healthy,
    Degraded,
    Offline,
}

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ClusterNode {
    pub node_id: String,
    pub role: ClusterNodeRole,
    pub region: String,
    pub queue_ownership: Vec<String>,
    pub capability_tags: Vec<String>,
    pub heartbeat_at: DateTime<Utc>,
    pub lease_expires_at: DateTime<Utc>,
    pub metadata: Option<String>,
    pub created_at: DateTime<Utc>,
    pub updated_at: DateTime<Utc>,
}

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct NewClusterNode {
    pub node_id: String,
    pub role: ClusterNodeRole,
    pub region: String,
    pub queue_ownership: Vec<String>,
    pub capability_tags: Vec<String>,
    pub heartbeat_at: DateTime<Utc>,
    pub lease_ttl_seconds: i64,
    pub metadata: Option<String>,
}

impl NewClusterNode {
    pub fn into_record(self) -> ClusterNode {
        let now = self.heartbeat_at;
        let lease_ttl_seconds = self.lease_ttl_seconds.max(1);
        ClusterNode {
            node_id: self.node_id,
            role: self.role,
            region: self.region,
            queue_ownership: self.queue_ownership,
            capability_tags: self.capability_tags,
            heartbeat_at: now,
            lease_expires_at: now + Duration::seconds(lease_ttl_seconds),
            metadata: self.metadata,
            created_at: now,
            updated_at: now,
        }
    }
}

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ClusterNodeHeartbeat {
    pub node_id: String,
    pub heartbeat_at: DateTime<Utc>,
    pub lease_ttl_seconds: i64,
    pub queue_ownership: Option<Vec<String>>,
    pub capability_tags: Option<Vec<String>>,
    pub metadata: Option<String>,
}

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ClusterNodeHealthSnapshot {
    pub node: ClusterNode,
    pub health: ClusterNodeHealth,
}

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ClusterForwardCommand {
    pub target_region: String,
    pub command_name: String,
    pub payload: String,
    pub correlation_id: Option<String>,
    pub issued_at: DateTime<Utc>,
}

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ClusterForwardOutcome {
    pub target_region: String,
    pub command_name: String,
    pub correlation_id: Option<String>,
    pub accepted: bool,
    pub attempts: u32,
    pub error: Option<String>,
    pub completed_at: DateTime<Utc>,
}

#[derive(Clone, Debug, Eq, PartialEq)]
pub enum ClusterControlEvent {
    ExpiredNodesPruned {
        pruned_count: u64,
        occurred_at: DateTime<Utc>,
    },
}