diff --git a/poc-memory/src/bin/test-conversation.rs b/poc-memory/src/bin/test-conversation.rs new file mode 100644 index 0000000..f20db9b --- /dev/null +++ b/poc-memory/src/bin/test-conversation.rs @@ -0,0 +1,65 @@ +// Test tool for the conversation resolver. +// Usage: POC_SESSION_ID= cargo run --bin test-conversation +// or: cargo run --bin test-conversation -- + +use std::time::Instant; + +fn main() { + let path = std::env::args().nth(1).unwrap_or_else(|| { + let session_id = std::env::var("POC_SESSION_ID") + .expect("pass a transcript path or set POC_SESSION_ID"); + let projects = poc_memory::config::get().projects_dir.clone(); + eprintln!("session: {}", session_id); + eprintln!("projects dir: {}", projects.display()); + + let mut found = None; + if let Ok(dirs) = std::fs::read_dir(&projects) { + for dir in dirs.filter_map(|e| e.ok()) { + let path = dir.path().join(format!("{}.jsonl", session_id)); + eprintln!(" checking: {}", path.display()); + if path.exists() { + found = Some(path); + break; + } + } + } + let path = found.expect("transcript not found"); + path.to_string_lossy().to_string() + }); + + let meta = std::fs::metadata(&path).expect("can't stat file"); + eprintln!("transcript: {} ({} bytes)", path, meta.len()); + + let t0 = Instant::now(); + let iter = poc_memory::transcript::TailMessages::open(&path) + .expect("can't open transcript"); + + let mut count = 0; + let mut total_bytes = 0; + let mut last_report = Instant::now(); + + for (role, content, ts) in iter { + count += 1; + total_bytes += content.len(); + + if last_report.elapsed().as_secs() >= 2 { + eprintln!(" ... {} messages, {}KB so far ({:.1}s)", + count, total_bytes / 1024, t0.elapsed().as_secs_f64()); + last_report = Instant::now(); + } + + if count <= 5 { + let preview: String = content.chars().take(80).collect(); + eprintln!(" [{}] {} {}: {}...", + count, &ts[..ts.len().min(19)], role, preview); + } + + if total_bytes >= 200_000 { + eprintln!(" hit 200KB budget at {} messages", count); + break; + } + } + + let elapsed = t0.elapsed(); + eprintln!("done: {} messages, {}KB in {:.3}s", count, total_bytes / 1024, elapsed.as_secs_f64()); +}