asobi 0.6.1

A persistent, project-local knowledge graph CLI for AI agents.
Documentation
use anyhow::Result;
use rusqlite::{Connection, params};
use tempfile::tempdir;

fn main() -> Result<()> {
    let dir = tempdir()?;
    let path = dir.path().join("plans.db");
    let _store = asobi::storage::SqliteStore::open_at(&path)?;
    let conn = Connection::open(path)?;
    explain(
        &conn,
        "observation FTS",
        "EXPLAIN QUERY PLAN SELECT o.entity_name FROM asobi_obs_fts JOIN asobi_observations o ON asobi_obs_fts.rowid=o.rowid WHERE asobi_obs_fts MATCH ? ORDER BY bm25(asobi_obs_fts) LIMIT ?",
        params!["commonterm", 10_i64],
    )?;
    explain(
        &conn,
        "truth lookup",
        "EXPLAIN QUERY PLAN SELECT entity_name FROM asobi_truths WHERE key=? AND value=?",
        params!["status", "READY"],
    )?;
    explain(
        &conn,
        "relation lookup",
        "EXPLAIN QUERY PLAN SELECT from_entity,to_entity FROM asobi_relations WHERE from_entity=? OR to_entity=?",
        params!["entity-1", "entity-1"],
    )?;
    Ok(())
}

fn explain(conn: &Connection, label: &str, sql: &str, values: impl rusqlite::Params) -> Result<()> {
    println!("\n[{label}]");
    let mut stmt = conn.prepare(sql)?;
    for row in stmt.query_map(values, |r| r.get::<_, String>(3))? {
        println!("{}", row?);
    }
    Ok(())
}