rho-coding-agent 1.17.0

A lightweight agent harness inspired by Pi
Documentation
use pretty_assertions::assert_eq;

use super::*;

#[test]
fn running_lines_are_minimal() {
    assert_eq!(
        running_display_lines(),
        vec!["compact".to_string(), "shrinking context…".to_string()]
    );
}

#[test]
fn completed_lines_prefer_tokens_then_messages() {
    let lines = completed_display_lines(CompactionDisplayFacts {
        previous_messages: 48,
        current_messages: 4,
        previous_tokens: 12_400,
        current_tokens: 3_100,
        cost_usd_micros: None,
    });
    assert_eq!(
        lines,
        vec![
            "compact".to_string(),
            "12.4K → 3.1K tokens  (−9.3K · 75%)".to_string(),
            "48 → 4 messages  (−44)".to_string(),
        ]
    );
}

#[test]
fn completed_lines_include_cost_when_present() {
    let lines = completed_display_lines(CompactionDisplayFacts {
        previous_messages: 10,
        current_messages: 3,
        previous_tokens: 2_000,
        current_tokens: 500,
        cost_usd_micros: Some(4_200),
    });
    assert_eq!(lines.last().map(String::as_str), Some("cost $0.004"));
}

#[test]
fn completed_lines_message_only_when_tokens_missing() {
    let lines = completed_display_lines(CompactionDisplayFacts {
        previous_messages: 12,
        current_messages: 4,
        previous_tokens: 0,
        current_tokens: 0,
        cost_usd_micros: None,
    });
    assert_eq!(
        lines,
        vec!["compact".to_string(), "12 → 4 messages  (−8)".to_string(),]
    );
}

#[test]
fn completed_lines_mark_no_token_change() {
    let lines = completed_display_lines(CompactionDisplayFacts {
        previous_messages: 5,
        current_messages: 5,
        previous_tokens: 1_000,
        current_tokens: 1_000,
        cost_usd_micros: None,
    });
    assert!(lines.iter().any(|line| line.contains("(no change)")));
}

#[test]
fn failed_unchanged_and_cancelled_lines() {
    assert_eq!(
        failed_display_lines("provider unavailable"),
        vec![
            "compact".to_string(),
            "failed".to_string(),
            "provider unavailable".to_string(),
        ]
    );
    assert_eq!(
        unchanged_display_lines("not enough conversation history to compact"),
        vec![
            "compact".to_string(),
            "not enough conversation history to compact".to_string(),
        ]
    );
    assert_eq!(
        cancelled_display_lines(),
        vec!["compact".to_string(), "cancelled".to_string()]
    );
    assert!(CompactionUiOutcome::Unchanged {
        detail: "noop".into()
    }
    .ok());
    assert!(!CompactionUiOutcome::Failed {
        detail: "boom".into()
    }
    .ok());
    assert!(CompactionUiOutcome::Cancelled.ok());
}