use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum TodoStatus {
Pending,
Clarifying,
InProgress,
WaitingFeedback,
Completed,
Cancelled,
Blocked(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
pub enum TodoPriority {
Low = 0,
Medium = 1,
High = 2,
Urgent = 3,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TodoItem {
pub id: String,
pub raw_idea: String,
pub clarified_requirement: Option<ProjectRequirement>,
pub status: TodoStatus,
pub priority: TodoPriority,
pub created_at: u64,
pub updated_at: u64,
pub assigned_agents: Vec<String>,
pub execution_result: Option<ExecutionResult>,
pub metadata: HashMap<String, String>,
}
impl TodoItem {
pub fn new(id: &str, raw_idea: &str, priority: TodoPriority) -> Self {
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_default()
.as_secs();
Self {
id: id.to_string(),
raw_idea: raw_idea.to_string(),
clarified_requirement: None,
status: TodoStatus::Pending,
priority,
created_at: now,
updated_at: now,
assigned_agents: Vec::new(),
execution_result: None,
metadata: HashMap::new(),
}
}
pub fn update_status(&mut self, status: TodoStatus) {
self.status = status;
self.updated_at = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_default()
.as_secs();
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProjectRequirement {
pub title: String,
pub description: String,
pub acceptance_criteria: Vec<String>,
pub subtasks: Vec<Subtask>,
pub dependencies: Vec<String>,
pub estimated_effort: Option<String>,
pub resources: Vec<Resource>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Subtask {
pub id: String,
pub description: String,
pub required_capabilities: Vec<String>,
pub order: u32,
pub depends_on: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Resource {
pub name: String,
pub resource_type: String,
pub path: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExecutionResult {
pub success: bool,
pub summary: String,
pub details: HashMap<String, String>,
pub artifacts: Vec<Artifact>,
pub execution_time_ms: u64,
pub error: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Artifact {
pub name: String,
pub artifact_type: String,
pub content: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CriticalDecision {
pub id: String,
pub todo_id: String,
pub decision_type: DecisionType,
pub description: String,
pub options: Vec<DecisionOption>,
pub recommended_option: Option<usize>,
pub deadline: Option<u64>,
pub created_at: u64,
pub human_response: Option<HumanResponse>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DecisionType {
RequirementClarification,
TechnicalChoice,
PriorityAdjustment,
ExceptionHandling,
ResourceRequest,
Other(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DecisionOption {
pub label: String,
pub description: String,
pub impact: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HumanResponse {
pub selected_option: usize,
pub comment: Option<String>,
pub responded_at: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Report {
pub id: String,
pub report_type: ReportType,
pub todo_ids: Vec<String>,
pub content: String,
pub statistics: HashMap<String, serde_json::Value>,
pub created_at: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum ReportType {
TaskCompletion,
Progress,
Exception,
DailySummary,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SecretaryMessage {
AssignTask {
task_id: String,
subtask: Subtask,
context: HashMap<String, String>,
},
QueryTaskStatus { task_id: String },
CancelTask { task_id: String, reason: String },
TaskStatusReport {
task_id: String,
status: TaskExecutionStatus,
progress: u32,
message: Option<String>,
},
TaskCompleteReport {
task_id: String,
result: ExecutionResult,
},
RequestDecision {
task_id: String,
decision: CriticalDecision,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TaskExecutionStatus {
Received,
Preparing,
Executing,
WaitingExternal,
Completed,
Failed(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DefaultInput {
Idea {
content: String,
priority: Option<TodoPriority>,
metadata: Option<HashMap<String, String>>,
},
Decision {
decision_id: String,
selected_option: usize,
comment: Option<String>,
},
Query(QueryType),
Command(SecretaryCommand),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum QueryType {
ListTodos { filter: Option<TodoStatus> },
GetTodo { todo_id: String },
Statistics,
PendingDecisions,
Reports { report_type: Option<ReportType> },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SecretaryCommand {
Clarify { todo_id: String },
Dispatch { todo_id: String },
Cancel { todo_id: String, reason: String },
GenerateReport { report_type: ReportType },
Pause,
Resume,
Shutdown,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DefaultOutput {
Acknowledgment { message: String },
DecisionRequired { decision: CriticalDecision },
Report { report: Report },
StatusUpdate { todo_id: String, status: TodoStatus },
TaskCompleted {
todo_id: String,
result: ExecutionResult,
},
Error { message: String },
Message { content: String },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum WorkPhase {
ReceivingIdea,
ClarifyingRequirement,
DispatchingTask,
MonitoringExecution,
ReportingCompletion,
}