remem-ai 0.6.78

Local-first coding agent memory for Claude Code and OpenAI Codex
Documentation
use super::*;

#[test]
fn since_bound_skips_older_files() {
    let conn = setup_conn();
    let root = TempRoot::new("since");
    let cwd = root.path.to_string_lossy().to_string();
    root.write(
        "proj-a/session-1.jsonl",
        &format!("{}\n", claude_line(&cwd, "user", "recent message")),
    );
    let roots = [root.scan_root("local")];

    let future = chrono::Utc::now().timestamp() + 3600;
    let summary = run_ingest_sessions(
        &conn,
        &roots,
        &IngestOptions {
            since_epoch: Some(future),
        },
    )
    .unwrap();
    assert_eq!(summary.scanned, 1);
    assert_eq!(summary.skipped, 1);
    assert_eq!(summary.ingested_messages, 0);
    assert_eq!(
        conn.query_row("SELECT COUNT(*) FROM raw_session_identities", [], |row| {
            row.get::<_, i64>(0)
        })
        .unwrap(),
        1,
        "Phase A must claim files that Phase B skips by --since"
    );
    assert_eq!(
        conn.query_row(
            "SELECT COUNT(*) FROM raw_session_identity_claims",
            [],
            |row| row.get::<_, i64>(0)
        )
        .unwrap(),
        1
    );
}

#[test]
fn since_bound_reports_new_identity_conflict_as_failure() {
    let conn = setup_conn();
    let root = TempRoot::new("since-conflict");
    let cwd = root.path.to_string_lossy().to_string();
    let transcript = root.write(
        "proj-a/session-1.jsonl",
        &format!(
            "{}\n",
            serde_json::json!({
                "type": "user",
                "sessionId": "canonical-a",
                "cwd": cwd,
                "message": {"content": "first claim"}
            })
        ),
    );
    let roots = [root.scan_root("local")];
    let first = run(&conn, &roots);
    assert_eq!(first.failed_files, 0);

    std::fs::write(
        transcript,
        format!(
            "{}\n",
            serde_json::json!({
                "type": "user",
                "sessionId": "canonical-b",
                "cwd": cwd,
                "message": {"content": "conflicting claim"}
            })
        ),
    )
    .unwrap();
    let future = chrono::Utc::now().timestamp() + 3600;
    let summary = run_ingest_sessions(
        &conn,
        &roots,
        &IngestOptions {
            since_epoch: Some(future),
        },
    )
    .unwrap();

    assert_eq!(summary.skipped, 0);
    assert_eq!(summary.failed_files, 1);
    assert_eq!(summary.exit_code(), 1);
    assert_eq!(
        conn.query_row(
            "SELECT status || ':' || conflict_reason
             FROM raw_session_identities",
            [],
            |row| row.get::<_, String>(0)
        )
        .unwrap(),
        "conflict:conflicting_metadata_claims"
    );
}