stasis-rs 0.2.0

Durable AI orchestration framework with runtime jobs, lineage, and memory integration
Documentation
use serde_json::{Value, json};

use crate::application::runtime::in_memory_runtime::JobExecutionOutcome;

pub fn policy_violation_failure(provider: &str, message: String) -> JobExecutionOutcome {
    let diagnostics = json!({
        "provider": provider,
        "status": "failure",
        "guardrail_code": "POLICY_VIOLATION",
        "policy_reason": &message,
    })
    .to_string();

    JobExecutionOutcome::FatalFailure {
        message,
        execution_id: None,
        diagnostics: Some(diagnostics),
    }
}

pub fn operation_failure(provider: &str, error: String) -> JobExecutionOutcome {
    let diagnostics = json!({
        "provider": provider,
        "status": "failure",
        "error": &error,
    })
    .to_string();

    JobExecutionOutcome::FatalFailure {
        message: error,
        execution_id: None,
        diagnostics: Some(diagnostics),
    }
}

pub fn operation_success(
    provider: &str,
    sttp_kind: &str,
    job_id: &str,
    details: Value,
) -> JobExecutionOutcome {
    let mut diagnostics = json!({
        "provider": provider,
        "status": "success",
    });

    if let (Value::Object(base), Value::Object(extra)) = (&mut diagnostics, details) {
        base.extend(extra);
    }

    JobExecutionOutcome::Success {
        sttp_output_node_id: format!("sttp:{sttp_kind}:{job_id}"),
        execution_id: None,
        diagnostics: Some(diagnostics.to_string()),
    }
}