vios_app 0.1.1

Small JSON vaults: Argon2id + AES-GCM, with optional AAD binding.
Documentation
use crate::naorix::naorix_memory::{MemoryTrace, MemoryBank};
use std::collections::HashMap;
use std::path::Path;

/// Computes a simple “drift score” between two strings
fn drift_score(a: &str, b: &str) -> usize {
    a.chars().zip(b.chars()).filter(|(x, y)| x != y).count() + a.len().abs_diff(b.len())
}

/// Compute and print drift between all memories
pub fn analyze_drift(vault_dir: &str) {
    let mut all_memories: Vec<MemoryTrace> = Vec::new();

    let dir = Path::new(vault_dir);
    if !dir.exists() {
        eprintln!("❌ Vault directory not found: {}", vault_dir);
        return;
    }

    for entry in std::fs::read_dir(dir).unwrap() {
        if let Ok(entry) = entry {
            let path = entry.path();
            if path.extension().map(|ext| ext == "vault").unwrap_or(false) {
                if let Ok(contents) = std::fs::read_to_string(&path) {
                    if let Ok(memtrace) = serde_json::from_str::<MemoryTrace>(&contents) {
                        all_memories.push(memtrace);
                    }
                }
            }
        }
    }

    println!("\n📊 Emotional Drift Report:");
    for pair in all_memories.windows(2) {
        let a = &pair[0];
        let b = &pair[1];

        let tone_drift = drift_score(a.tone(), b.tone());
        let intent_drift = drift_score(a.intent(), b.intent());
        let reem_drift = drift_score(a.reem_code(), b.reem_code());

        println!(
            "🔁 {}{}\n  Tone Drift: {}\n  Intent Drift: {}\n  REEM Drift: {}\n",
            a.id(),
            b.id(),
            tone_drift,
            intent_drift,
            reem_drift
        );
    }
}