malvin 0.2.5

Non-interactive research and coding agent
#[must_use]
pub fn herdr_live_name(session_id: &str) -> String {
    let short = session_id.rsplit('_').next().unwrap_or(session_id);
    let body: String = short
        .chars()
        .filter(|c| c.is_ascii_alphanumeric() || matches!(c, '-' | '_'))
        .map(|c| c.to_ascii_lowercase())
        .collect();
    let mut name = format!("m{body}");
    if name.len() > 32 {
        name.truncate(32);
    }
    if name.len() < 2 {
        name = format!("m{}", std::process::id());
        name.truncate(32);
    }
    name
}

#[must_use]
pub fn display_title() -> Option<String> {
    let slot = crate::acp_spawn_lock::active_acp_lock_slot();
    if is_pid_fallback_slot(&slot) {
        None
    } else {
        Some(slot)
    }
}

fn is_pid_fallback_slot(slot: &str) -> bool {
    slot.strip_prefix("pid")
        .is_some_and(|rest| !rest.is_empty() && rest.chars().all(|c| c.is_ascii_digit()))
}

#[cfg(test)]
mod tests {
    use super::{display_title, herdr_live_name, is_pid_fallback_slot};

    #[test]
    fn herdr_live_name_prefixes_short_suffix() {
        let n = herdr_live_name("20260804_140533_4gk60f1m");
        assert_eq!(n, "m4gk60f1m");
        assert!(n.chars().next().is_some_and(|c| c.is_ascii_lowercase()));
        assert!(n.len() <= 32);
    }

    #[test]
    fn pid_fallback_slot_detection() {
        assert!(is_pid_fallback_slot("pid12345"));
        assert!(!is_pid_fallback_slot("probe"));
        assert!(!is_pid_fallback_slot("pid"));
        let _ = display_title();
    }
}