use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::ag_ui::{Message, Metadata, PROTOCOL_VERSION};
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RunAgentInput {
pub thread_id: String,
pub run_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub protocol_version: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub parent_run_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub state: Option<Value>,
pub messages: Vec<Message>,
#[serde(default)]
pub tools: Vec<Tool>,
#[serde(default)]
pub context: Vec<Context>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub forwarded_props: Option<Value>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub resume: Vec<ResumeEntry>,
}
impl RunAgentInput {
pub fn with_protocol_version(mut self) -> Self {
self.protocol_version = Some(PROTOCOL_VERSION.to_owned());
self
}
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct Tool {
pub name: String,
pub description: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub parameters: Option<Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct Context {
pub description: String,
pub value: String,
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Interrupt {
pub id: String,
pub reason: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tool_call_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub response_schema: Option<serde_json::Map<String, Value>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expires_at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub subagent_run_id: Option<String>,
}
impl Interrupt {
pub fn new(id: impl Into<String>, reason: impl Into<String>) -> Self {
Self {
id: id.into(),
reason: reason.into(),
..Self::default()
}
}
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ResumeEntry {
pub interrupt_id: String,
pub status: ResumeStatus,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub payload: Option<Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ResumeStatus {
Resolved,
Cancelled,
}