use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct WorkerOutput {
#[serde(alias = "work_summary")]
pub work_summary: String,
#[serde(default, alias = "signals")]
pub signals: Vec<StructuredSignal>,
#[serde(default, alias = "findings")]
pub findings: Vec<StructuredFinding>,
#[serde(default, alias = "files_modified")]
pub files_modified: Vec<String>,
#[serde(default, alias = "criterion_overrides")]
pub criterion_overrides: Vec<StructuredOverride>,
#[serde(default, alias = "confidence")]
pub confidence: ConfidenceLevel,
#[serde(
skip_serializing_if = "Option::is_none",
alias = "next_action_suggestion"
)]
pub next_action_suggestion: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", alias = "progress_estimate")]
pub progress_estimate: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none", alias = "notes")]
pub notes: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct StructuredSignal {
#[serde(alias = "signal_type")]
pub signal_type: String,
#[serde(skip_serializing_if = "Option::is_none", alias = "message")]
pub message: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct StructuredFinding {
#[serde(alias = "category")]
pub category: String,
#[serde(alias = "severity")]
pub severity: String,
#[serde(alias = "title")]
pub title: String,
#[serde(default, alias = "description")]
pub description: String,
#[serde(default, alias = "needs_input")]
pub needs_input: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct StructuredOverride {
#[serde(alias = "criterion")]
pub criterion: String,
#[serde(alias = "status")]
pub status: String,
#[serde(alias = "justification")]
pub justification: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "lowercase")]
pub enum ConfidenceLevel {
High,
#[default]
Medium,
Low,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum AgenticStatus {
Success,
PartialSuccess,
Failed,
Unfixable,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct FileChange {
#[serde(alias = "path")]
pub path: String,
#[serde(alias = "action")]
pub action: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct FindingOutput {
#[serde(alias = "category")]
pub category: String,
#[serde(alias = "severity")]
pub severity: String,
#[serde(alias = "title")]
pub title: String,
#[serde(default, alias = "description")]
pub description: String,
#[serde(default, alias = "needs_input")]
pub needs_input: bool,
#[serde(default, alias = "resolved")]
pub resolved: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ReflectionFixOutput {
#[serde(alias = "error_id")]
pub error_id: String,
#[serde(alias = "description")]
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct AgenticPhaseOutput {
#[serde(alias = "status")]
pub status: AgenticStatus,
#[serde(alias = "summary")]
pub summary: String,
#[serde(default, alias = "confidence")]
pub confidence: Option<f64>,
#[serde(default, alias = "unfixable")]
pub unfixable: bool,
#[serde(default, alias = "unfixable_reason")]
pub unfixable_reason: Option<String>,
#[serde(default, alias = "files_modified")]
pub files_modified: Vec<FileChange>,
#[serde(default, alias = "injected_steps")]
pub injected_steps: Vec<Value>,
#[serde(default, alias = "reflection_fixes")]
pub reflection_fixes: Vec<ReflectionFixOutput>,
#[serde(default, alias = "findings")]
pub findings: Vec<FindingOutput>,
}