use std::ops::Range;
use salamander::agent::{EventBody, Role};
use salamander::{AgentDb, BranchId, DiffRequest};
fn main() -> salamander::Result<()> {
let dir = fresh_dir("diff");
let mut db = AgentDb::open(&dir)?;
db.append("chat", turn(Role::User, "the checkout page 500s on submit"))?;
db.append(
"chat",
turn(
Role::Assistant,
"root cause: deploy #4213 dropped a null check",
),
)?;
let decision_point = db.head();
db.append("chat", turn(Role::Assistant, "rolling back deploy #4213"))?;
db.commit()?;
let fork = db.fork("chat", decision_point)?;
db.append_on_branch(
fork.id,
"chat",
turn(Role::Assistant, "forward-fixing with PR #991 instead"),
)?;
db.commit()?;
let diff = db.diff(DiffRequest::new(BranchId::ZERO, fork.id))?;
println!(
"timelines \"{}\" and \"{}\" share history up to offset {}",
diff.left.branch.name.as_str(),
diff.right.branch.name.as_str(),
diff.divergence
);
println!("\nshared prefix:");
print_turns(&db, diff.common_ancestor.id, 0..diff.divergence)?;
println!("\n{} since the split:", diff.left.branch.name.as_str());
print_turns(&db, diff.left.branch.id, diff.divergence..diff.left.until)?;
println!("\n{} since the split:", diff.right.branch.name.as_str());
print_turns(&db, diff.right.branch.id, diff.divergence..diff.right.until)?;
Ok(())
}
fn print_turns(db: &AgentDb, branch: BranchId, range: Range<u64>) -> salamander::Result<()> {
db.replay_branch(branch, "chat", range, |event| {
if let EventBody::ModelTurn { role, content, .. } = &event.body {
println!(" {role:?}: {content}");
}
})
}
fn turn(role: Role, content: &str) -> EventBody {
EventBody::ModelTurn {
role,
content: content.into(),
model: "demo".into(),
}
}
fn fresh_dir(name: &str) -> std::path::PathBuf {
let dir = std::env::temp_dir().join(format!("salamander-example-{name}"));
let _ = std::fs::remove_dir_all(&dir);
dir
}