codetether-agent 4.5.7

A2A-native AI coding agent for the CodeTether ecosystem
Documentation
use super::parse::parse_codex_session_from_path;
use super::persist::persist_imported_session;
use super::test_support::write_codex_fixture;
use super::{discover::discover_codex_sessions_in, info::PersistOutcome};
use crate::provider::{ContentPart, Role};
use tempfile::tempdir;

#[test]
fn parses_codex_session_into_native_session() {
    let temp = tempdir().expect("tempdir");
    let workspace = temp.path().join("workspace");
    std::fs::create_dir_all(&workspace).expect("workspace");
    let path = write_codex_fixture(temp.path(), &workspace);
    let session = parse_codex_session_from_path(&path, Some("Imported from Codex")).expect("parse");
    assert_eq!(session.id, "019d2acd-8b3f-70e0-b019-854d52272660");
    assert_eq!(session.metadata.model.as_deref(), Some("gpt-5.4"));
    assert_eq!(session.usage.total_tokens, 15);
    assert_eq!(session.messages.len(), 5);
    assert!(matches!(session.messages[0].role, Role::User));
    assert!(matches!(
        session.messages[1].content[0],
        ContentPart::Thinking { .. }
    ));
    assert!(matches!(
        session.messages[2].content[0],
        ContentPart::ToolCall { .. }
    ));
}

#[test]
fn discovers_codex_sessions_for_matching_workspace() {
    let temp = tempdir().expect("tempdir");
    let workspace = temp.path().join("workspace");
    std::fs::create_dir_all(&workspace).expect("workspace");
    write_codex_fixture(temp.path(), &workspace);
    let codex_home = temp.path().join(".codex");
    let sessions = discover_codex_sessions_in(Some(&codex_home), &workspace).expect("discover");
    assert_eq!(sessions.len(), 1);
    assert_eq!(sessions[0].message_count, 5);
}

#[tokio::test]
async fn persists_imported_session_only_when_newer() {
    let temp = tempdir().expect("tempdir");
    let workspace = temp.path().join("workspace");
    std::fs::create_dir_all(&workspace).expect("workspace");
    let path = write_codex_fixture(temp.path(), &workspace);
    let session = parse_codex_session_from_path(&path, Some("Imported from Codex")).expect("parse");
    let data_dir = temp.path().join("data/sessions");
    let first = persist_imported_session(session.clone(), &data_dir)
        .await
        .expect("persist");
    let second = persist_imported_session(session, &data_dir)
        .await
        .expect("persist");
    assert!(matches!(first, PersistOutcome::Saved));
    assert!(matches!(second, PersistOutcome::Unchanged));
}