stasis-rs 0.2.3

Durable AI orchestration framework with runtime jobs, lineage, and memory integration
Documentation
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_json::Value;

#[derive(Clone, Debug, Default, Serialize, Deserialize, Eq, PartialEq)]
pub enum IdentityEntityType {
    PersonaEntity,
    UserEntity,
    ChannelProfileEntity,
    PolicyProfileEntity,
    #[default]
    RelationshipEntity,
}

#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, Eq, PartialEq, Hash)]
pub enum UpdateTier {
    #[default]
    AutoCommit,
    ConfirmRequired,
    ApprovalRequired,
}

#[derive(Clone, Copy, Debug, Serialize, Deserialize, Eq, PartialEq)]
pub enum ProposalState {
    Proposed,
    Committed,
    Rejected,
    Expired,
}

#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, Eq, PartialEq)]
pub enum UpdateSource {
    UserDirect,
    #[default]
    ModelInferred,
    SystemEvent,
}

#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, Eq, PartialEq)]
pub enum RelationshipStatus {
    #[default]
    Proposed,
    Active,
    Suspended,
    Deprecated,
    Revoked,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize, Eq, PartialEq)]
pub struct EntityRef {
    pub entity_type: String,
    pub entity_id: String,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize, Eq, PartialEq)]
pub struct EscalationPolicy {
    pub mode: Option<String>,
    pub fallback: Option<String>,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)]
pub struct InterruptionPolicy {
    pub quiet_hours: Option<String>,
    pub allow_urgent_only: Option<bool>,
    pub urgent_threshold: Option<f32>,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize, Eq, PartialEq)]
pub struct AutonomyScope {
    pub allow: Vec<String>,
    pub deny: Vec<String>,
    pub approval_required: Vec<String>,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct PersonaEntity {
    pub persona_id: String,
    pub display_name: String,
    pub status: String,
    pub version: i32,
    pub updated_at: DateTime<Utc>,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct UserEntity {
    pub user_id: String,
    pub timezone: String,
    pub language_variant: Option<String>,
    pub status: String,
    pub version: i32,
    pub updated_at: DateTime<Utc>,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct ChannelProfileEntity {
    pub channel_id: String,
    pub channel_type: String,
    pub proactive_allowed: bool,
    pub status: String,
    pub version: i32,
    pub updated_at: DateTime<Utc>,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct PolicyProfileEntity {
    pub policy_profile_id: String,
    pub graph_max_depth: usize,
    pub trust_delta_max_per_window: f32,
    pub status: String,
    pub version: i32,
    pub updated_at: DateTime<Utc>,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct RelationshipEntity {
    pub relationship_id: String,
    pub source_entity_ref: EntityRef,
    pub target_entity_ref: EntityRef,
    pub relationship_kind: String,
    pub status: RelationshipStatus,
    pub trust_level: f32,
    pub confidence: f32,
    pub strength_score: f32,
    pub recency_score: f32,
    pub autonomy_scope: AutonomyScope,
    pub approval_profile_id: Option<String>,
    pub interruption_policy: InterruptionPolicy,
    pub escalation_policy: EscalationPolicy,
    pub policy_tags: Vec<String>,
    pub provenance: UpdateSource,
    pub parent_relationship_id: Option<String>,
    pub governing_relationship_ids: Vec<String>,
    pub derived_from_relationship_id: Option<String>,
    pub last_transition_reason: Option<String>,
    pub transition_receipt_id: Option<String>,
    pub version: i32,
    pub created_at: DateTime<Utc>,
    pub updated_at: DateTime<Utc>,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct FlattenedPolicyClaim {
    pub claim_id: String,
    pub source_relationship_ids: Vec<String>,
    pub summary: String,
    pub confidence: f32,
    pub timestamp: DateTime<Utc>,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct GetIdentityContextRequest {
    pub user_id: String,
    pub persona_id: String,
    pub channel_id: String,
    pub relationship_limit: usize,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct GetIdentityContextResponse {
    pub persona: Option<PersonaEntity>,
    pub user: Option<UserEntity>,
    pub channel: Option<ChannelProfileEntity>,
    pub relationships: Vec<RelationshipEntity>,
    pub policy_profiles: Vec<PolicyProfileEntity>,
    pub graph_depth_used: usize,
    pub flattened_claims: Vec<FlattenedPolicyClaim>,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct ProposeEntityUpdateRequest {
    pub entity_type: IdentityEntityType,
    pub entity_id: String,
    pub patch: Value,
    pub source: UpdateSource,
    pub confidence: f32,
    pub reason: String,
    pub actor: String,
    pub receipt_id: Option<String>,
    pub expires_at: Option<DateTime<Utc>>,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct ProposeEntityUpdateResponse {
    pub proposal_ids: Vec<String>,
    pub tiers: Vec<UpdateTier>,
    pub requires_approval: bool,
    pub split_patch: bool,
    pub policy_notes: Vec<String>,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EntityUpdateProposalRecord {
    pub proposal_id: String,
    pub entity_type: IdentityEntityType,
    pub entity_id: String,
    pub patch: Value,
    pub tier: UpdateTier,
    pub source: UpdateSource,
    pub confidence: f32,
    pub reason: String,
    pub state: ProposalState,
    pub approver: Option<String>,
    pub actor: String,
    pub receipt_id: Option<String>,
    pub expires_at: Option<DateTime<Utc>>,
    pub created_at: DateTime<Utc>,
    pub updated_at: DateTime<Utc>,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct CommitEntityUpdateRequest {
    pub proposal_id: String,
    pub expected_version: i32,
    pub approver: Option<String>,
}

#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
pub enum CommitOutcomeCode {
    Ok,
    StaleState,
    ApprovalRequired,
    PolicyDenied,
    InvalidPatch,
    ExpiredProposal,
    NotFound,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct CommitEntityUpdateResponse {
    pub committed: bool,
    pub code: Option<CommitOutcomeCode>,
    pub entity_type: Option<IdentityEntityType>,
    pub entity_id: Option<String>,
    pub new_version: Option<i32>,
    pub receipt_id: Option<String>,
    pub transition_event_id: Option<String>,
    pub sttp_bridge_node: Option<String>,
    pub sttp_bridge_reason: Option<String>,
    pub rationale: Option<String>,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct RelationshipTransitionEvent {
    pub event_id: String,
    pub relationship_id: String,
    pub from_status: Option<RelationshipStatus>,
    pub to_status: RelationshipStatus,
    pub reason: String,
    pub actor: String,
    pub receipt_id: Option<String>,
    pub occurred_at: DateTime<Utc>,
    pub metadata: Option<Value>,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct ListEntityHistoryRequest {
    pub entity_type: IdentityEntityType,
    pub entity_id: String,
    pub limit: usize,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct ListEntityHistoryResponse {
    pub proposals: Vec<EntityUpdateProposalRecord>,
    pub transitions: Vec<RelationshipTransitionEvent>,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct RollbackEntityVersionRequest {
    pub entity_type: IdentityEntityType,
    pub entity_id: String,
    pub target_version: i32,
    pub reason: String,
    pub approver: String,
}

#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct RollbackEntityVersionResponse {
    pub rolled_back: bool,
    pub new_version: Option<i32>,
    pub rollback_receipt_id: Option<String>,
    pub rationale: Option<String>,
}