hotl-types 0.1.3

Core config, observation model, and surface trait for hotl.
Documentation
use crate::agent::{Agent, Status};

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Source {
    Tmux,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum LocationHandle {
    Tmux { pane_id: String, session: String, window_index: u32 },
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Location {
    pub group: String,
    pub sub_group: Option<String>,
    pub handle: LocationHandle,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AgentObservation {
    pub agent: Agent,
    pub cwd: String,
    pub status: Status,
    pub status_line: Option<String>,
    pub location: Location,
    pub source: Source,
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::agent::Agent;

    fn obs() -> AgentObservation {
        AgentObservation {
            agent: Agent { name: "claude".into(), pid: 1, argv: "claude".into() },
            cwd: "/tmp/proj".into(),
            status: Status::Idle,
            status_line: None,
            location: Location {
                group: "base-0".into(),
                sub_group: Some("zsh (0)".into()),
                handle: LocationHandle::Tmux {
                    pane_id: "%1".into(),
                    session: "base-0".into(),
                    window_index: 0,
                },
            },
            source: Source::Tmux,
        }
    }

    #[test]
    fn observation_round_trips_fields() {
        let o = obs();
        assert_eq!(o.agent.name, "claude");
        assert_eq!(o.status, Status::Idle);
        assert_eq!(o.status_line, None);
        assert_eq!(o.location.group, "base-0");
        assert_eq!(o.source, Source::Tmux);
        match o.location.handle {
            LocationHandle::Tmux { pane_id, .. } => assert_eq!(pane_id, "%1"),
        }
    }
}