1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use uuid::Uuid;
4
5use crate::agent::AgentId;
6use crate::budget::Budget;
7use crate::evidence::Evidence;
8use crate::mission::MissionId;
9use crate::model::RiskLevel;
10
11#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
12pub struct TaskId(pub Uuid);
13
14#[derive(Debug, Clone, Serialize, Deserialize)]
15pub struct Task {
16 pub id: TaskId,
17 pub mission_id: MissionId,
18 pub parent_task_id: Option<TaskId>,
19 pub owner_id: AgentId,
20 pub objective: String,
21 pub dependencies: Vec<TaskId>,
22 pub risk: RiskLevel,
23 pub budget: Budget,
24 pub deadline: Option<DateTime<Utc>>,
25 pub input: serde_json::Value,
26 pub output_contract: serde_json::Value,
27 pub evidence_contract: Vec<String>,
28 pub retry_policy: RetryPolicy,
29 pub idempotency_key: Option<String>,
30 pub lifecycle_mode: String,
31 pub state: TaskState,
32 pub evidence: Vec<Evidence>,
33 pub created_at: DateTime<Utc>,
34 pub updated_at: DateTime<Utc>,
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
38pub enum TaskState {
39 Created,
40 Ready,
41 Claimed,
42 PolicyCheck,
43 Denied,
44 AwaitingApproval,
45 Running,
46 Waiting,
47 EvidenceSubmitted,
48 Verifying,
49 RevisionRequired,
50 Accepted,
51 Closed,
52 Failed,
53 Retrying,
54 Escalated,
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize)]
58pub struct RetryPolicy {
59 pub max_retries: u32,
60 pub backoff_seconds: u64,
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize)]
64pub struct TaskDependency {
65 pub task_id: TaskId,
66 pub depends_on: TaskId,
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize)]
70pub struct TaskLease {
71 pub task_id: TaskId,
72 pub agent_id: AgentId,
73 pub acquired_at: DateTime<Utc>,
74 pub expires_at: DateTime<Utc>,
75}