Skip to main content

brainwires_a2a/
task.rs

1//! Task lifecycle types: Task, TaskStatus, TaskState.
2
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6use crate::types::{Artifact, Message};
7
8/// Possible lifecycle states of a Task.
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
10pub enum TaskState {
11    /// Unspecified or indeterminate state.
12    #[serde(rename = "TASK_STATE_UNSPECIFIED")]
13    Unspecified,
14    /// Task has been submitted and acknowledged.
15    #[serde(rename = "TASK_STATE_SUBMITTED")]
16    Submitted,
17    /// Task is actively being processed.
18    #[serde(rename = "TASK_STATE_WORKING")]
19    Working,
20    /// Task finished successfully (terminal).
21    #[serde(rename = "TASK_STATE_COMPLETED")]
22    Completed,
23    /// Task finished with an error (terminal).
24    #[serde(rename = "TASK_STATE_FAILED")]
25    Failed,
26    /// Task was canceled (terminal).
27    #[serde(rename = "TASK_STATE_CANCELED")]
28    Canceled,
29    /// Task was rejected by the agent (terminal).
30    #[serde(rename = "TASK_STATE_REJECTED")]
31    Rejected,
32    /// Agent requires additional user input (interrupted).
33    #[serde(rename = "TASK_STATE_INPUT_REQUIRED")]
34    InputRequired,
35    /// Authentication is required to proceed (interrupted).
36    #[serde(rename = "TASK_STATE_AUTH_REQUIRED")]
37    AuthRequired,
38}
39
40/// Current status of a task.
41#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
42pub struct TaskStatus {
43    /// Current state.
44    pub state: TaskState,
45    /// Optional message associated with the status.
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub message: Option<Message>,
48    /// ISO 8601 timestamp when the status was recorded.
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub timestamp: Option<String>,
51}
52
53/// The core unit of action in A2A.
54#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
55pub struct Task {
56    /// Unique task identifier (UUID).
57    pub id: String,
58    /// Context identifier for the conversation/session.
59    #[serde(rename = "contextId", skip_serializing_if = "Option::is_none")]
60    pub context_id: Option<String>,
61    /// Current task status.
62    pub status: TaskStatus,
63    /// Output artifacts.
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub artifacts: Option<Vec<Artifact>>,
66    /// History of interactions.
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub history: Option<Vec<Message>>,
69    /// Custom metadata.
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub metadata: Option<HashMap<String, serde_json::Value>>,
72}