Skip to main content

mur_common/
a2a.rs

1//! A2A v0.3 protocol envelope types.
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct Message {
6    pub role: String, // "user" | "agent" | "system"
7    pub parts: Vec<MessagePart>,
8}
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
11#[serde(tag = "kind", rename_all = "lowercase")]
12pub enum MessagePart {
13    Text {
14        text: String,
15    },
16    Data {
17        #[serde(rename = "mimeType")]
18        mime_type: String,
19        data: serde_json::Value,
20    },
21}
22
23#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
24#[serde(rename_all = "lowercase")]
25pub enum TaskState {
26    Submitted,
27    Working,
28    Completed,
29    Failed,
30    Cancelled,
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize)]
34pub struct Task {
35    pub id: String,
36    pub state: TaskState,
37    pub messages: Vec<Message>,
38    #[serde(rename = "createdAt")]
39    pub created_at: String,
40    #[serde(rename = "completedAt", skip_serializing_if = "Option::is_none")]
41    pub completed_at: Option<String>,
42    #[serde(default, skip_serializing_if = "Option::is_none")]
43    pub error: Option<TaskError>,
44    #[serde(default, skip_serializing_if = "Option::is_none")]
45    pub usage: Option<serde_json::Value>,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
49pub struct TaskError {
50    pub code: String,
51    pub message: String,
52    pub recoverable: bool,
53    #[serde(default, skip_serializing_if = "Option::is_none")]
54    pub details: Option<serde_json::Value>,
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize)]
58pub struct JsonRpcRequest {
59    pub jsonrpc: String, // always "2.0"
60    #[serde(default, skip_serializing_if = "Option::is_none")]
61    pub id: Option<serde_json::Value>, // None = notification
62    pub method: String,
63    #[serde(default, skip_serializing_if = "Option::is_none")]
64    pub params: Option<serde_json::Value>,
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize)]
68pub struct JsonRpcResponse {
69    pub jsonrpc: String, // "2.0"
70    pub id: serde_json::Value,
71    #[serde(skip_serializing_if = "Option::is_none")]
72    pub result: Option<serde_json::Value>,
73    #[serde(skip_serializing_if = "Option::is_none")]
74    pub error: Option<JsonRpcError>,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize)]
78pub struct JsonRpcError {
79    pub code: i32,
80    pub message: String,
81    #[serde(default, skip_serializing_if = "Option::is_none")]
82    pub data: Option<serde_json::Value>,
83}