use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct TrajectoryStepDto {
pub action: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tool_used: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub input: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub output: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub success: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub timestamp: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub file_content: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agent_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agent_name: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct JudgeConfigDto {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_safety_score: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tnorm_strategy: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ViolationDto {
pub layer: String,
pub category: String,
pub message: String,
pub severity: f64,
#[serde(default)]
pub context: BTreeMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct FixSuggestionDto {
pub description: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub patch: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct LayerResultDto {
pub layer_name: String,
#[serde(default)]
pub violations: Vec<ViolationDto>,
#[serde(default)]
pub fix_suggestions: Vec<FixSuggestionDto>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ProofTraceDto {
#[serde(default)]
pub steps: Vec<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub conclusion: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct AttestationDto {
pub kind: String,
pub statement: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub signature: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct CertificateDto {
pub proof_trace: ProofTraceDto,
#[serde(default)]
pub attestations: Vec<AttestationDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FormalJudgeRequest {
pub user_intent: String,
pub trajectory: Vec<TrajectoryStepDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub final_output: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub execution_log: Option<String>,
#[serde(default)]
pub risk_categories: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub config: Option<JudgeConfigDto>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct FormalJudgeResponse {
pub verdict: bool,
pub safety_score: f64,
#[serde(default)]
pub layers: Vec<LayerResultDto>,
pub certificate: CertificateDto,
pub elapsed_ms: u64,
}
pub type FormalJudgeRefinementResponse = serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateOversightSessionRequest {
pub tenant_id: String,
pub user_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub config: Option<JudgeConfigDto>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct CreateOversightSessionResponse {
pub session_id: String,
pub created_at: String,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IngestStepRequest {
pub session_id: String,
pub step: TrajectoryStepDto,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct StepVerificationResponse {
pub step_verified: bool,
pub safety_score: f64,
#[serde(default)]
pub violations: Vec<ViolationDto>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct OversightSessionStatusResponse {
pub session_id: String,
pub status: String,
pub created_at: String,
pub updated_at: String,
pub steps_ingested: u64,
pub overall_safety_score: f64,
#[serde(default)]
pub violations: Vec<ViolationDto>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct FinalizeOversightSessionRequest {
pub session_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub summary: Option<String>,
}
pub type FinalizeOversightSessionResponse = serde_json::Value;