asobi 0.6.1

A persistent, project-local knowledge graph CLI for AI agents.
Documentation
use asobi::api::{GraphStore, MaintenanceStore, OpenNodes, SearchQuery, SearchStore};
use asobi::storage::Storage;
use std::env;
use std::hint::black_box;
use std::time::Instant;
use tempfile::tempdir;

fn main() {
    let count = env::var("ASOBI_BENCH_SIZE")
        .ok()
        .and_then(|v| v.parse().ok())
        .unwrap_or(1_000);
    let dir = tempdir().expect("tempdir");
    let store = Storage::open_at(&dir.path().join("graph.db")).expect("open storage");
    seed(&store, count);
    let start = Instant::now();
    for _ in 0..50 {
        black_box(
            store
                .search_nodes(SearchQuery {
                    query: "commonterm".into(),
                    limit: 10,
                    filters: vec![],
                })
                .unwrap(),
        );
    }
    println!("search: {:?}", start.elapsed() / 50);
    let start = Instant::now();
    for _ in 0..100 {
        black_box(
            store
                .open_nodes(OpenNodes {
                    names: vec!["entity-10".into()],
                    ..Default::default()
                })
                .unwrap(),
        );
    }
    println!("open: {:?}", start.elapsed() / 100);
    println!("stats: {:?}", store.stats().expect("stats"));
}

fn seed(store: &impl GraphStore, count: usize) {
    store
        .create_entities(
            (0..count)
                .map(|i| asobi::model::EntityInput {
                    name: format!("entity-{i}"),
                    entity_type: "bench".into(),
                    observations: vec![format!("commonterm observation {i}")],
                })
                .collect(),
        )
        .expect("seed");
}