use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClarificationQuestionDto {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub choices: Option<Vec<serde_json::Value>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub default: Option<String>,
pub field: String,
pub id: String,
pub question: String,
#[serde(rename = "type")]
pub question_type: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct CycleOutcomeSummaryDto {
pub actions_executed: u64,
pub goals_achieved: u64,
pub goals_failed: u64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct MaterializationSummaryDto {
pub beliefs_created: u64,
pub constraints_created: u64,
pub curriculum_stages_created: u64,
pub goal_created: bool,
pub groundings_created: u64,
pub guard_constraints_created: u64,
pub rules_created: u64,
#[serde(default)]
pub sort_names: Vec<String>,
pub sorts_created: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ScenarioSummaryDto {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agent_id: Option<String>,
pub beliefs_created: u64,
pub created_at: u64,
pub prompt: String,
pub rules_created: u64,
pub scenario_id: String,
pub sorts_created: u64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct CreateScenarioRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agent_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub answers: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub create_agent: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enable_curriculum: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enable_grounding: Option<bool>,
pub prompt: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub run_initial_cycle: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub session_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "status", rename_all = "snake_case")]
pub enum CreateScenarioResponse {
NeedsClarification {
questions: Vec<ClarificationQuestionDto>,
session_id: String,
understood: serde_json::Value,
},
Complete {
#[serde(default, skip_serializing_if = "Option::is_none")]
agent_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
cycle_outcome: Option<CycleOutcomeSummaryDto>,
groundings_applied: u64,
materialization: MaterializationSummaryDto,
scenario: serde_json::Value,
scenario_id: String,
total_time_ms: u64,
},
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ListScenariosResponse {
#[serde(default)]
pub scenarios: Vec<ScenarioSummaryDto>,
pub total: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetScenarioResponse {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agent_id: Option<String>,
pub beliefs_created: u64,
pub constraints_created: u64,
pub created_at: u64,
pub guard_constraints_created: u64,
pub prompt: String,
pub rules_created: u64,
pub scenario: serde_json::Value,
pub scenario_id: String,
pub sorts_created: u64,
pub temporal_constraints_created: u64,
pub webhook_actions_created: u64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct UpdateScenarioRequest {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub add_beliefs: Vec<serde_json::Value>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub add_constraints: Vec<serde_json::Value>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub add_guard_constraints: Vec<serde_json::Value>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub add_rules: Vec<serde_json::Value>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub add_sorts: Vec<serde_json::Value>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub add_temporal_constraints: Vec<serde_json::Value>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub add_webhook_actions: Vec<serde_json::Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct UpdateScenarioResponse {
pub beliefs_added: u64,
pub constraints_added: u64,
pub guard_constraints_added: u64,
pub rules_added: u64,
pub scenario_id: String,
pub sorts_added: u64,
pub temporal_constraints_added: u64,
pub total_beliefs: u64,
pub total_constraints: u64,
pub total_guard_constraints: u64,
pub total_rules: u64,
pub total_sorts: u64,
pub total_temporal_constraints: u64,
pub total_webhook_actions: u64,
pub webhook_actions_added: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VerificationStepDto {
pub description: String,
pub name: String,
pub passed: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LayerResultSummaryDto {
pub facts_checked: u64,
pub facts_satisfied: u64,
pub layer: String,
pub score: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FormalVerdictDto {
pub confidence: f64,
pub deterministic_facts: u64,
#[serde(default)]
pub layer_results: Vec<LayerResultSummaryDto>,
pub overall_verdict: String,
pub semantic_facts: u64,
pub total_llm_calls: u64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VerifyScenarioRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub config: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VerifyScenarioResponse {
pub confidence: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub formal_verdict: Option<FormalVerdictDto>,
pub scenario_id: String,
#[serde(default)]
pub steps: Vec<VerificationStepDto>,
pub summary: String,
pub verdict: String,
}