component-dwbase 0.1.4

DWBase: agent-first immutable atom store, components, and tools.
Documentation
use component_dwbase::exports::dwbase::core::engine::{
    self, AtomFilter, AtomKind, NewAtom, Question,
};

fn main() {
    let input = std::env::args()
        .nth(1)
        .unwrap_or_else(|| "Hello! My name is Alice and I like tea.".into());

    let tenant = std::env::var("DWBASE_TENANT_ID").unwrap_or_else(|_| "default".into());
    let facts_world = format!("tenant:{tenant}/facts");
    let summaries_world = format!("tenant:{tenant}/summaries");

    let fact_id = <component_dwbase::Component as engine::Guest>::remember(NewAtom {
        world_key: facts_world.clone(),
        worker: "llm".into(),
        kind: AtomKind::Observation,
        timestamp: "".into(),
        importance: 0.6,
        payload_json: format!(r#"{{"text":{}}}"#, serde_json::to_string(&input).unwrap()),
        vector: None,
        flags_list: vec![],
        labels: vec![],
        links: vec![],
    });

    if fact_id.is_empty() {
        eprintln!("remember denied (check tenant namespace + safety env vars)");
        std::process::exit(2);
    }

    let ans = <component_dwbase::Component as engine::Guest>::ask(Question {
        world_key: facts_world.clone(),
        text: "Recall any relevant facts you have about the user and context.".into(),
        filter: Some(AtomFilter {
            world_key: Some(facts_world.clone()),
            kinds: vec![],
            labels: vec![],
            flag_filter: vec![],
            since: None,
            until: None,
            limit: Some(10),
        }),
    });

    println!("=== memory answer (world={}) ===", facts_world);
    println!("{}", ans.text);
    println!("supporting atoms: {}", ans.supporting_atoms.len());
    for (i, a) in ans.supporting_atoms.iter().enumerate() {
        println!(
            "  [{i}] id={} ts={} payload={}",
            a.id, a.timestamp, a.payload_json
        );
    }

    let _summary_id = <component_dwbase::Component as engine::Guest>::remember(NewAtom {
        world_key: summaries_world.clone(),
        worker: "llm".into(),
        kind: AtomKind::Reflection,
        timestamp: "".into(),
        importance: 0.3,
        payload_json: format!(
            r#"{{"summary":{},"supporting_count":{}}}"#,
            serde_json::to_string(&ans.text).unwrap(),
            ans.supporting_atoms.len()
        ),
        vector: None,
        flags_list: vec![],
        labels: vec![],
        links: vec![],
    });
}