//! Create a test memory file for development //! //! This example creates a real .memory file demonstrating the format. //! Run with: cargo run --example create_memory use sd_core::domain::memory::{DocumentType, FactType, MemoryFile, MemoryScope}; use std::path::PathBuf; #[tokio::main] async fn main() -> Result<(), Box> { // Initialize logging tracing_subscriber::fmt() .with_env_filter("info") .init(); println!("\n🧠 Creating Spacedrive Memory File\n"); // Output path let output_path = PathBuf::from( "/Users/jamespine/Projects/spacedrive/workbench/test-memories/memory-file-system.memory", ); // Ensure directory exists if let Some(parent) = output_path.parent() { std::fs::create_dir_all(parent)?; } // Create memory file let mut memory = MemoryFile::create( "memory-file-system".to_string(), MemoryScope::Directory { path: "/Users/jamespine/Projects/spacedrive/core/src/domain/memory".to_string(), }, &output_path, ) .await?; println!("āœ… Created memory archive\n"); // Add design documents println!("šŸ“„ Adding documents..."); let design_doc = memory .add_document( None, "MEMORY_FILE_FORMAT_DESIGN.md".to_string(), Some( "Complete specification for .memory file format with custom archive".to_string(), ), DocumentType::Design, ) .await?; let impl_doc = memory .add_document( None, "MEMORY_FILE_IMPLEMENTATION_STATUS.md".to_string(), Some("Implementation status with custom archive format".to_string()), DocumentType::Documentation, ) .await?; let agent_doc = memory .add_document( None, "AGENT_MEMORY_ARCHITECTURE_V1.md".to_string(), Some("Three-type agent memory architecture".to_string()), DocumentType::Design, ) .await?; println!(" āœ… {} documents added\n", memory.get_documents().len()); // Add learned facts println!("🧩 Adding facts..."); memory .add_fact( "Memory files use custom archive format with magic bytes SDMEMORY".to_string(), FactType::Principle, 1.0, Some(design_doc), ) .await?; memory .add_fact( "Archive is append-only with index at end for efficient updates".to_string(), FactType::Pattern, 1.0, Some(impl_doc), ) .await?; memory .add_fact( "Vector store embedded using MessagePack serialization".to_string(), FactType::Decision, 0.9, Some(impl_doc), ) .await?; memory .add_fact( "Agent memory types: temporal (events), associative (knowledge), working (current)".to_string(), FactType::Pattern, 1.0, Some(agent_doc), ) .await?; memory .add_fact( "Memory files solve context-gathering problem for AI agents".to_string(), FactType::Principle, 1.0, Some(design_doc), ) .await?; println!(" āœ… {} facts added\n", memory.get_facts().len()); // Add embeddings println!("šŸ”¢ Adding embeddings..."); // 4D mock vectors (real would be 384D from AI model) let design_vector = vec![0.9, 0.2, 0.7, 0.1]; let impl_vector = vec![0.1, 0.9, 0.3, 0.5]; let agent_vector = vec![0.3, 0.2, 0.95, 0.1]; memory.add_embedding(design_doc, design_vector).await?; memory.add_embedding(impl_doc, impl_vector).await?; memory.add_embedding(agent_doc, agent_vector).await?; println!( " āœ… {} embeddings added\n", memory.embedding_count().await? ); // Test search println!("šŸ” Testing semantic search..."); let query = vec![0.7, 0.15, 0.85, 0.05]; // Query: design + architecture let results = memory.search_similar(query, 3).await?; println!(" Results:"); for (i, doc_id) in results.iter().enumerate() { if let Some(doc) = memory.get_document(*doc_id) { println!(" {}. {}", i + 1, doc.title); } } println!(); // Show final statistics let metadata = memory.metadata(); let stats = &metadata.statistics; println!("šŸ“Š Memory Statistics:"); println!(" Name: {}", metadata.name); println!(" Scope: {}", metadata.scope.identifier()); println!(" Documents: {}", stats.document_count); println!(" Facts: {}", stats.fact_count); println!(" Embeddings: {}", stats.embedding_count); println!(" Total size: {} bytes", stats.file_size_bytes); println!(); println!("āœ… Memory file created successfully!"); println!("šŸ“ Location: {}", output_path.display()); println!(); println!("Verify:"); println!(" file {}", output_path.display()); println!(" hexdump -C {} | head -20", output_path.display()); println!(); // Verify single file assert!(output_path.is_file()); assert!(!output_path.is_dir()); println!("āœ… Confirmed: Single file archive\n"); Ok(()) }