rho-coding-agent 0.24.1

A lightweight agent harness inspired by Pi
Documentation
#[test]
fn provider_ids_have_unique_descriptors_and_lookup_round_trips() {
    let providers = super::providers();

    for (index, descriptor) in providers.iter().enumerate() {
        assert_eq!(
            super::provider_descriptor(descriptor.name),
            Some(descriptor)
        );
        assert_eq!(super::provider_descriptor_by_id(descriptor.id), descriptor);
        assert!(providers[..index]
            .iter()
            .all(|other| { other.id != descriptor.id && other.name != descriptor.name }));
    }
}

#[test]
fn provider_auth_metadata_exposes_stable_storage_and_environment_keys() {
    use super::{ProviderAuthKind, ProviderId};

    let openai = super::provider_descriptor_by_id(ProviderId::OpenAi);
    assert_eq!(openai.auth_kind.env_var(), "OPENAI_API_KEY");
    assert_eq!(openai.auth_kind.account(), super::OPENAI_API_KEY_ACCOUNT);
    assert!(matches!(
        openai.auth_kind,
        ProviderAuthKind::ApiKey {
            account: super::OPENAI_API_KEY_ACCOUNT,
            ..
        }
    ));

    let codex = super::provider_descriptor_by_id(ProviderId::OpenAiCodex);
    assert_eq!(codex.auth_kind.env_var(), "CODEX_ACCESS_TOKEN");
    assert_eq!(codex.auth_kind.account(), super::CODEX_TOKENS_ACCOUNT);
    assert!(matches!(
        codex.auth_kind,
        ProviderAuthKind::CodexOAuth {
            account: super::CODEX_TOKENS_ACCOUNT,
            ..
        }
    ));
}