use std::fmt;
use std::sync::Arc;
use crate::models::dispute::InitiatorRole;
use crate::models::mediation::{ClassificationLabel, Flag, TranscriptParty};
use crate::prompts::PromptBundle;
#[derive(Debug, Clone)]
pub struct TranscriptEntry {
pub party: TranscriptParty,
pub inner_event_created_at: i64,
pub content: String,
}
#[derive(Debug, Clone)]
pub struct ReasoningContext {
pub round_count: u32,
pub last_classification: Option<ClassificationLabel>,
pub last_confidence: Option<f64>,
}
#[derive(Debug, Clone)]
pub struct ClassificationRequest {
pub session_id: String,
pub dispute_id: String,
pub initiator_role: InitiatorRole,
pub prompt_bundle: Arc<PromptBundle>,
pub transcript: Vec<TranscriptEntry>,
pub context: ReasoningContext,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum SuggestedAction {
AskClarification {
buyer_text: String,
seller_text: String,
},
Summarize,
Escalate(EscalationReason),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EscalationReason(pub String);
#[derive(Clone)]
pub struct RationaleText(pub String);
impl fmt::Debug for RationaleText {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "RationaleText(<{} bytes redacted>)", self.0.len())
}
}
#[derive(Debug, Clone)]
pub struct ClassificationResponse {
pub classification: ClassificationLabel,
pub confidence: f64,
pub suggested_action: SuggestedAction,
pub rationale: RationaleText,
pub flags: Vec<Flag>,
}
#[derive(Debug, Clone)]
pub struct SummaryRequest {
pub session_id: String,
pub dispute_id: String,
pub prompt_bundle: Arc<PromptBundle>,
pub transcript: Vec<TranscriptEntry>,
pub classification: ClassificationLabel,
pub confidence: f64,
}
#[derive(Debug, Clone)]
pub struct SummaryResponse {
pub summary_text: String,
pub suggested_next_step: String,
pub rationale: RationaleText,
}
#[derive(Debug, thiserror::Error)]
pub enum ReasoningError {
#[error("reasoning provider unreachable: {0}")]
Unreachable(String),
#[error("reasoning provider timed out")]
Timeout,
#[error("reasoning provider returned malformed output: {0}")]
MalformedResponse(String),
#[error("reasoning output would cross authority boundary: {0}")]
AuthorityBoundaryViolation(String),
#[error(transparent)]
Other(#[from] anyhow::Error),
}