Skip to main content

adk_server/a2a/
metadata.rs

1use serde_json::Value;
2use std::collections::HashMap;
3
4pub const META_PREFIX: &str = "adk_";
5
6#[derive(Clone)]
7pub struct InvocationMeta {
8    pub user_id: String,
9    pub session_id: String,
10    pub event_meta: HashMap<String, Value>,
11}
12
13// Intentionally omit Debug to avoid cleartext logging of user_id/session_id
14impl std::fmt::Debug for InvocationMeta {
15    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16        f.debug_struct("InvocationMeta")
17            .field("user_id", &"[REDACTED]")
18            .field("session_id", &self.session_id)
19            .field("event_meta_keys", &self.event_meta.keys().collect::<Vec<_>>())
20            .finish()
21    }
22}
23
24pub fn to_a2a_meta_key(key: &str) -> String {
25    format!("{}{}", META_PREFIX, key)
26}
27
28pub fn to_invocation_meta(
29    app_name: &str,
30    context_id: &str,
31    user_id: Option<&str>,
32) -> InvocationMeta {
33    let user_id =
34        user_id.map(|s| s.to_string()).unwrap_or_else(|| format!("A2A_USER_{}", context_id));
35    let session_id = context_id.to_string();
36
37    let mut event_meta = HashMap::new();
38    event_meta.insert(to_a2a_meta_key("app_name"), Value::String(app_name.to_string()));
39    event_meta.insert(to_a2a_meta_key("user_id"), Value::String(user_id.clone()));
40    event_meta.insert(to_a2a_meta_key("session_id"), Value::String(session_id.clone()));
41
42    InvocationMeta { user_id, session_id, event_meta }
43}
44
45pub fn to_event_meta(meta: &InvocationMeta, event: &adk_core::Event) -> HashMap<String, Value> {
46    let mut result = meta.event_meta.clone();
47
48    result.insert(to_a2a_meta_key("invocation_id"), Value::String(event.invocation_id.clone()));
49    result.insert(to_a2a_meta_key("author"), Value::String(event.author.clone()));
50    if !event.branch.is_empty() {
51        result.insert(to_a2a_meta_key("branch"), Value::String(event.branch.clone()));
52    }
53
54    result
55}
56
57pub fn set_actions_meta(
58    mut meta: HashMap<String, Value>,
59    actions: &adk_core::EventActions,
60) -> HashMap<String, Value> {
61    if actions.escalate {
62        meta.insert(to_a2a_meta_key("escalate"), Value::Bool(true));
63    }
64    if let Some(agent) = &actions.transfer_to_agent {
65        meta.insert(to_a2a_meta_key("transfer_to_agent"), Value::String(agent.clone()));
66    }
67    meta
68}