mod default;
pub mod in_memory;
#[cfg(all(
feature = "task-store-sqlite",
not(all(target_os = "wasi", target_env = "p1"))
))]
pub mod sqlite;
pub use default::DefaultTaskManager;
pub use in_memory::InMemoryTaskStore;
#[cfg(all(
feature = "task-store-sqlite",
not(all(target_os = "wasi", target_env = "p1"))
))]
pub use sqlite::SqliteTaskStore;
pub type InMemoryTaskManager = DefaultTaskManager;
use crate::compat::{MaybeSend, MaybeSync};
use crate::errors::AgentResult;
use crate::runtime::context::AuthContext;
use a2a_types::{Artifact, Message, TaskArtifactUpdateEvent, TaskStatus, TaskStatusUpdateEvent};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Task {
pub id: String,
pub context_id: String,
pub status: TaskStatus,
pub artifacts: Vec<Artifact>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub enum TaskEvent {
StatusUpdate(TaskStatusUpdateEvent),
ArtifactUpdate(TaskArtifactUpdateEvent),
Message(Message),
}
#[derive(Debug, Default)]
pub struct ListTasksFilter<'a> {
pub context_id: Option<&'a str>,
pub page_size: Option<u32>,
pub page_token: Option<&'a str>,
}
#[derive(Debug)]
pub struct PaginatedResult<T> {
pub items: Vec<T>,
pub next_page_token: Option<String>,
}
pub(crate) const NEGOTIATION_PREFIX: &str = "_negotiation:";
#[cfg_attr(all(target_os = "wasi", target_env = "p1"), async_trait::async_trait(?Send))]
#[cfg_attr(
not(all(target_os = "wasi", target_env = "p1")),
async_trait::async_trait
)]
pub trait TaskStore: MaybeSend + MaybeSync {
async fn get_task(&self, auth_ctx: &AuthContext, task_id: &str) -> AgentResult<Option<Task>>;
async fn list_tasks(&self, auth_ctx: &AuthContext) -> AgentResult<Vec<Task>>;
async fn save_task(&self, auth_ctx: &AuthContext, task: &Task) -> AgentResult<()>;
async fn append_event(
&self,
auth_ctx: &AuthContext,
task_key: &str,
event: &TaskEvent,
) -> AgentResult<()>;
async fn get_events(
&self,
auth_ctx: &AuthContext,
task_key: &str,
) -> AgentResult<Vec<TaskEvent>>;
async fn list_event_task_keys(&self, auth_ctx: &AuthContext) -> AgentResult<Vec<String>>;
async fn list_task_ids(&self, auth_ctx: &AuthContext) -> AgentResult<Vec<String>>;
async fn list_context_ids(&self, auth_ctx: &AuthContext) -> AgentResult<Vec<String>>;
async fn save_task_state(
&self,
auth_ctx: &AuthContext,
task_id: &str,
state: &crate::runtime::context::TaskState,
) -> AgentResult<()>;
async fn load_task_state(
&self,
auth_ctx: &AuthContext,
task_id: &str,
) -> AgentResult<Option<crate::runtime::context::TaskState>>;
async fn set_task_skill(
&self,
auth_ctx: &AuthContext,
task_id: &str,
skill_id: &str,
) -> AgentResult<()>;
async fn get_task_skill(
&self,
auth_ctx: &AuthContext,
task_id: &str,
) -> AgentResult<Option<String>>;
async fn save_session_state(
&self,
auth_ctx: &AuthContext,
context_id: &str,
state: &crate::runtime::context::SessionState,
) -> AgentResult<()>;
async fn load_session_state(
&self,
auth_ctx: &AuthContext,
context_id: &str,
) -> AgentResult<Option<crate::runtime::context::SessionState>>;
}
#[cfg_attr(all(target_os = "wasi", target_env = "p1"), async_trait::async_trait(?Send))]
#[cfg_attr(
not(all(target_os = "wasi", target_env = "p1")),
async_trait::async_trait
)]
pub trait TaskManager: MaybeSend + MaybeSync {
async fn get_task(&self, auth_ctx: &AuthContext, task_id: &str) -> AgentResult<Option<Task>>;
async fn list_tasks(
&self,
auth_ctx: &AuthContext,
filter: &ListTasksFilter<'_>,
) -> AgentResult<PaginatedResult<Task>>;
async fn save_task(&self, auth_ctx: &AuthContext, task: &Task) -> AgentResult<()>;
async fn add_task_event(&self, auth_ctx: &AuthContext, event: &TaskEvent) -> AgentResult<()>;
async fn get_task_events(
&self,
auth_ctx: &AuthContext,
task_id: &str,
) -> AgentResult<Vec<TaskEvent>>;
async fn get_negotiating_messages(
&self,
auth_ctx: &AuthContext,
context_id: &str,
) -> AgentResult<Vec<Message>>;
async fn list_task_ids(
&self,
auth_ctx: &AuthContext,
context_id: Option<&str>,
) -> AgentResult<Vec<String>>;
async fn list_context_ids(&self, auth_ctx: &AuthContext) -> AgentResult<Vec<String>>;
async fn save_task_state(
&self,
auth_ctx: &AuthContext,
task_id: &str,
state: &crate::runtime::context::TaskState,
) -> AgentResult<()>;
async fn load_task_state(
&self,
auth_ctx: &AuthContext,
task_id: &str,
) -> AgentResult<Option<crate::runtime::context::TaskState>>;
async fn set_task_skill(
&self,
auth_ctx: &AuthContext,
task_id: &str,
skill_id: &str,
) -> AgentResult<()>;
async fn get_task_skill(
&self,
auth_ctx: &AuthContext,
task_id: &str,
) -> AgentResult<Option<String>>;
async fn save_session_state(
&self,
auth_ctx: &AuthContext,
context_id: &str,
state: &crate::runtime::context::SessionState,
) -> AgentResult<()>;
async fn load_session_state(
&self,
auth_ctx: &AuthContext,
context_id: &str,
) -> AgentResult<Option<crate::runtime::context::SessionState>>;
}