Skip to main content

types/
observation.rs

1use crate::agent::{Agent, Status};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4pub enum Source {
5    Tmux,
6}
7
8#[derive(Debug, Clone, PartialEq, Eq)]
9pub enum LocationHandle {
10    Tmux { pane_id: String, session: String, window_index: u32 },
11}
12
13#[derive(Debug, Clone, PartialEq, Eq)]
14pub struct Location {
15    pub group: String,
16    pub sub_group: Option<String>,
17    pub handle: LocationHandle,
18}
19
20#[derive(Debug, Clone, PartialEq, Eq)]
21pub struct AgentObservation {
22    pub agent: Agent,
23    pub cwd: String,
24    pub status: Status,
25    pub status_line: Option<String>,
26    pub location: Location,
27    pub source: Source,
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33    use crate::agent::Agent;
34
35    fn obs() -> AgentObservation {
36        AgentObservation {
37            agent: Agent { name: "claude".into(), pid: 1, argv: "claude".into() },
38            cwd: "/tmp/proj".into(),
39            status: Status::Idle,
40            status_line: None,
41            location: Location {
42                group: "base-0".into(),
43                sub_group: Some("zsh (0)".into()),
44                handle: LocationHandle::Tmux {
45                    pane_id: "%1".into(),
46                    session: "base-0".into(),
47                    window_index: 0,
48                },
49            },
50            source: Source::Tmux,
51        }
52    }
53
54    #[test]
55    fn observation_round_trips_fields() {
56        let o = obs();
57        assert_eq!(o.agent.name, "claude");
58        assert_eq!(o.status, Status::Idle);
59        assert_eq!(o.status_line, None);
60        assert_eq!(o.location.group, "base-0");
61        assert_eq!(o.source, Source::Tmux);
62        match o.location.handle {
63            LocationHandle::Tmux { pane_id, .. } => assert_eq!(pane_id, "%1"),
64        }
65    }
66}