avocado_core/
lib.rs

1//! AvocadoDB Core Engine
2//!
3//! The deterministic context compiler that fixes RAG.
4//!
5//! AvocadoDB replaces traditional vector databases' chaotic "top-k" retrieval
6//! with deterministic, citation-backed context generation using span-based
7//! compilation.
8//!
9//! # Key Features
10//!
11//! - **100% Deterministic**: Same query → same context, every time
12//! - **Citation-Backed**: Every piece of context has exact line number citations
13//! - **Token Efficient**: 95%+ token budget utilization (vs 60-70% in RAG)
14//! - **Fast**: < 500ms for 8K token context
15//!
16//! # Architecture
17//!
18//! ```text
19//! Query → Embed → [Semantic Search + Lexical Search] → Hybrid Fusion
20//!       → MMR Diversification → Token Packing → Deterministic Sort → WorkingSet
21//! ```
22
23#![warn(missing_docs)]
24
25pub mod types;
26pub mod span;
27pub mod embedding;
28pub mod compiler;
29pub mod db;
30pub mod index;
31pub mod session;
32pub mod approx;
33
34// Re-export commonly used types
35pub use types::{
36    Artifact, Citation, CompilerConfig, Error, Result, ScoredSpan, Span, WorkingSet,
37    Session, Message, MessageRole, SessionWorkingSet,
38};
39
40pub use session::{SessionManager, SessionReplay, SessionTurn};
41
42/// The version of AvocadoDB
43pub const VERSION: &str = env!("CARGO_PKG_VERSION");
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48
49    #[test]
50    fn test_version() {
51        assert!(!VERSION.is_empty());
52    }
53
54    #[test]
55    fn test_working_set_hash_determinism() {
56        let ws1 = WorkingSet {
57            text: "Hello, world!".to_string(),
58            spans: vec![],
59            citations: vec![],
60            tokens_used: 3,
61            query: "test".to_string(),
62            compilation_time_ms: 100,
63        };
64
65        let ws2 = WorkingSet {
66            text: "Hello, world!".to_string(),
67            spans: vec![],
68            citations: vec![],
69            tokens_used: 3,
70            query: "test".to_string(),
71            compilation_time_ms: 200, // Different timing
72        };
73
74        // Hash should be the same because it only depends on text
75        assert_eq!(ws1.deterministic_hash(), ws2.deterministic_hash());
76    }
77}