use anyhow::Result;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExecutionPlan {
pub title: String,
pub tasks: Vec<PlanTask>,
pub current_task_index: usize,
pub created_at: DateTime<Utc>,
pub status: PlanStatus,
#[serde(default)]
pub phase_compressions: Vec<super::compression::PhaseCompression>,
#[serde(default)]
pub project_compression: Option<super::compression::ProjectCompression>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageRange {
pub start_index: usize, pub end_index: usize, }
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PhaseCompression {
pub phase_name: String,
pub task_range: (usize, usize),
pub summary: String,
pub compressed_at: DateTime<Utc>,
pub message_range: MessageRange,
pub metrics: super::compression::CompressionMetrics,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProjectCompression {
pub summary: String,
pub compressed_at: DateTime<Utc>,
pub message_range: MessageRange,
pub metrics: super::compression::CompressionMetrics,
pub total_tasks: usize,
pub total_phases: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PlanTask {
pub title: String,
pub description: String, pub details: String, pub summary: Option<String>, pub status: TaskStatus,
pub completed_at: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub message_range: Option<MessageRange>, #[serde(default, skip_serializing_if = "Option::is_none")]
pub phase: Option<String>, }
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum PlanStatus {
Active,
Completed,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TaskStatus {
InProgress,
Completed,
}
#[derive(Debug, Clone)]
pub struct TaskData {
pub title: String,
pub description: String,
pub phase: Option<String>,
}
impl TaskData {
pub fn new(title: String, description: String, phase: Option<String>) -> Self {
Self {
title,
description,
phase,
}
}
}
pub trait PlanStorage {
fn create_plan(&mut self, title: String, tasks: Vec<TaskData>) -> Result<()>;
fn add_step_details(&mut self, content: String) -> Result<()>;
fn get_current_step_details(&self) -> Result<String>;
fn complete_current_task(&mut self, summary: String) -> Result<()>;
fn has_more_tasks(&self) -> Result<bool>;
fn get_task_list(&self) -> Result<Vec<(String, String, TaskStatus)>>;
fn get_current_task_info(&self) -> Result<(usize, usize, String, String)>;
fn complete_plan(&mut self, summary: String) -> Result<()>;
fn clear_plan(&mut self) -> Result<()>;
fn has_active_plan(&self) -> Result<bool>;
fn get_plan_title(&self) -> Result<String>;
fn set_current_task_message_range(
&mut self,
start_index: usize,
end_index: usize,
) -> Result<()>;
fn get_last_completed_task(&self) -> Result<Option<PlanTask>>;
fn get_completed_task_count(&self) -> Result<usize>;
fn get_current_task_index(&self) -> Result<usize>;
fn get_total_task_count(&self) -> Result<usize>;
fn get_phase_count(&self) -> Result<usize>;
fn get_plan(&self) -> Result<&ExecutionPlan>;
}