use a2a::*;
use futures::stream::BoxStream;
use serde_json::Value;
use std::collections::HashMap;
use crate::middleware::{ServiceParams, User};
pub struct ExecutorContext {
pub message: Option<Message>,
pub task_id: TaskId,
pub stored_task: Option<Task>,
pub context_id: String,
pub metadata: Option<HashMap<String, Value>>,
pub user: Option<User>,
pub service_params: ServiceParams,
pub tenant: Option<String>,
}
impl ExecutorContext {
pub fn task_info(&self) -> (TaskId, String) {
(self.task_id.clone(), self.context_id.clone())
}
}
#[async_trait::async_trait]
pub trait AgentExecutor: Send + Sync + 'static {
fn execute(&self, ctx: ExecutorContext)
-> BoxStream<'static, Result<StreamResponse, A2AError>>;
fn cancel(&self, ctx: ExecutorContext) -> BoxStream<'static, Result<StreamResponse, A2AError>>;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_executor_context_task_info() {
let ctx = ExecutorContext {
message: None,
task_id: "t1".into(),
stored_task: None,
context_id: "c1".into(),
metadata: None,
user: None,
service_params: HashMap::new(),
tenant: None,
};
let (tid, cid) = ctx.task_info();
assert_eq!(tid, "t1");
assert_eq!(cid, "c1");
}
}