Skip to main content

agent_sessions/
meta.rs

1use crate::{Located, MetaUpdate, Origin};
2use chrono::{DateTime, Utc};
3
4#[derive(Debug, Clone, Default)]
5pub struct SessionMeta {
6    pub session_id: Option<String>,
7    pub cwd: Option<String>,
8    pub git_branch: Option<String>,
9    pub model: Option<String>,
10    pub agent_version: Option<String>,
11    pub origin: Origin,
12    pub started_at: Option<DateTime<Utc>>,
13}
14impl SessionMeta {
15    /// Applies explicit updates; origin uses Subagent > Exec > Ide > Interactive.
16    /// Raw conflicting provenance remains available in the input event stream.
17    pub fn apply(&mut self, update: &Located<MetaUpdate>) {
18        let u = &update.value;
19        if u.session_id.is_some() && self.session_id.is_some() && u.session_id != self.session_id {
20            *self = Self::default();
21        }
22        if u.session_id.is_some() {
23            self.session_id.clone_from(&u.session_id);
24        }
25        if u.cwd.is_some() {
26            self.cwd.clone_from(&u.cwd);
27        }
28        if u.git_branch.is_some() {
29            self.git_branch.clone_from(&u.git_branch);
30        }
31        if u.model.is_some() {
32            self.model.clone_from(&u.model);
33        }
34        if u.agent_version.is_some() {
35            self.agent_version.clone_from(&u.agent_version);
36        }
37        if let Some(origin) = u.origin
38            && origin.priority() > self.origin.priority()
39        {
40            self.origin = origin;
41        }
42        if self.started_at.is_none() {
43            self.started_at = update.at;
44        }
45    }
46}