use agentstategraph::{CommitOptions, RepoError, Repository};
use agentstategraph_core::{IntentCategory, Namespace, Object};
use agentstategraph_storage::SqliteStorage;
fn main() {
let repo = Repository::new(Box::new(
SqliteStorage::in_memory().expect("in-memory sqlite"),
));
repo.init().unwrap();
repo.create_namespace("acme").unwrap();
repo.create_namespace("globex").unwrap();
println!("✓ Namespaces: {:?}\n", repo.list_namespaces().unwrap());
let acme = repo.fork_namespace(Namespace::new("acme").unwrap());
let globex = repo.fork_namespace(Namespace::new("globex").unwrap());
acme.init().unwrap();
globex.init().unwrap();
acme.set(
"main",
"/billing/plan",
&Object::string("enterprise"),
CommitOptions::new("agent/acme", IntentCategory::Checkpoint, "Acme plan"),
)
.unwrap();
globex
.set(
"main",
"/billing/plan",
&Object::string("starter"),
CommitOptions::new("agent/globex", IntentCategory::Checkpoint, "Globex plan"),
)
.unwrap();
let acme_plan = acme.get_json("main", "/billing/plan").unwrap();
let globex_plan = globex.get_json("main", "/billing/plan").unwrap();
println!(" acme main:/billing/plan = {}", acme_plan);
println!(" globex main:/billing/plan = {}", globex_plan);
assert_ne!(acme_plan, globex_plan);
println!(" ✓ Same branch name, fully isolated\n");
let result = globex.cross_namespace_merge(
"acme",
"main",
"main",
CommitOptions::new("agent/globex", IntentCategory::Merge, "Pull Acme's main"),
);
match result {
Err(RepoError::CrossNamespaceAccessDenied) => {
println!(" ✓ Cross-namespace merge denied (no PolicyStore + grant)");
}
other => panic!("expected deny-by-default, got {:?}", other),
}
println!("\n=== Namespaces example complete! ===");
}