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}