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 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}