From 49a436da7fc0531f7e4877692df72efe55885db5 Mon Sep 17 00:00:00 2001 From: Alex Emmet <111742636+Alex-Emmet@users.noreply.github.com> Date: Thu, 21 May 2026 13:55:49 +0200 Subject: [PATCH] Planning --- src/enums.rs | 3 +++ src/task.rs | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/todo.rs | 8 +++++- 3 files changed, 80 insertions(+), 1 deletion(-) diff --git a/src/enums.rs b/src/enums.rs index 3a51af5..25bcd40 100644 --- a/src/enums.rs +++ b/src/enums.rs @@ -7,6 +7,7 @@ pub enum ToDoStatus { InProgress, Completed, Blocked, + ReadyForAgent, } impl Default for ToDoStatus { @@ -22,6 +23,7 @@ impl fmt::Display for ToDoStatus { ToDoStatus::InProgress => write!(f, "in_progress"), ToDoStatus::Completed => write!(f, "completed"), ToDoStatus::Blocked => write!(f, "blocked"), + ToDoStatus::ReadyForAgent => write!(f, "ready_for_agent"), } } } @@ -34,6 +36,7 @@ impl std::str::FromStr for ToDoStatus { "in_progress" => Ok(ToDoStatus::InProgress), "completed" => Ok(ToDoStatus::Completed), "blocked" => Ok(ToDoStatus::Blocked), + "ready_for_agent" => Ok(ToDoStatus::ReadyForAgent), _ => Err(format!("unknown status: {}", s)), } } diff --git a/src/task.rs b/src/task.rs index 03e1082..7fbd37c 100644 --- a/src/task.rs +++ b/src/task.rs @@ -17,6 +17,7 @@ pub struct Task { pub logs: Vec, pub started_at: Option>, pub completed_at: Option>, + pub payload: Option, } impl Default for Task { @@ -32,6 +33,7 @@ impl Default for Task { logs: Vec::new(), started_at: None, completed_at: None, + payload: None, } } } @@ -49,9 +51,15 @@ impl Task { logs: Vec::new(), started_at: None, completed_at: None, + payload: None, } } + pub fn with_payload(mut self, payload: &T) -> Self { + self.payload = serde_json::to_value(payload).ok(); + self + } + pub fn start(&mut self) -> Result<(), String> { match self.status { TaskStatus::Pending => { @@ -133,6 +141,68 @@ impl TaskResult { } } +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TestCase { + pub name: String, + pub command: String, + pub expected_output: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ResourceLimits { + pub cpu_cores: f32, + pub memory_mb: u64, + pub gpu_memory_mb: Option, + pub timeout_seconds: u64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct FileRange { + pub path: String, + pub line_start: u32, + pub line_end: u32, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AgentTaskSpec { + pub task_id: Uuid, + pub title: String, + pub description: String, + pub board_snapshot: serde_json::Value, + pub assembled_context_id: Uuid, + pub selected_files: Vec, + pub entry_points: Vec, + pub tests: Option>, + pub success_criteria: Option, + pub token_budget: usize, + pub resource_limits: ResourceLimits, + pub parent_task_id: Option, +} + +impl AgentTaskSpec { + pub fn new(task_id: Uuid, title: String, assembled_context_id: Uuid) -> Self { + Self { + task_id, + title, + description: String::new(), + board_snapshot: serde_json::json!({}), + assembled_context_id, + selected_files: Vec::new(), + entry_points: Vec::new(), + tests: None, + success_criteria: None, + token_budget: 1000000, // Default 1M tokens + resource_limits: ResourceLimits { + cpu_cores: 1.0, + memory_mb: 2048, + gpu_memory_mb: None, + timeout_seconds: 3600, // 1 hour + }, + parent_task_id: None, + } + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/todo.rs b/src/todo.rs index 724a778..c693a51 100644 --- a/src/todo.rs +++ b/src/todo.rs @@ -101,12 +101,18 @@ impl ToDo { let valid_transition = match (&self.status, &status) { (ToDoStatus::Pending, ToDoStatus::InProgress) => true, (ToDoStatus::Pending, ToDoStatus::Blocked) => true, + (ToDoStatus::Pending, ToDoStatus::ReadyForAgent) => true, (ToDoStatus::InProgress, ToDoStatus::Completed) => true, (ToDoStatus::InProgress, ToDoStatus::Blocked) => true, + (ToDoStatus::InProgress, ToDoStatus::ReadyForAgent) => true, (ToDoStatus::Blocked, ToDoStatus::InProgress) => true, (ToDoStatus::Blocked, ToDoStatus::Pending) => true, + (ToDoStatus::Blocked, ToDoStatus::ReadyForAgent) => true, (ToDoStatus::Completed, ToDoStatus::InProgress) => true, - _ => false, + (ToDoStatus::ReadyForAgent, ToDoStatus::InProgress) => true, + (ToDoStatus::ReadyForAgent, ToDoStatus::Pending) => true, + (ToDoStatus::ReadyForAgent, ToDoStatus::Blocked) => true, + _ => self.status == status, }; if !valid_transition {