Skip to main content

do_memory_core/
lib.rs

1#![deny(unsafe_code)]
2// Justified clippy suppressions for this crate (WG-113 audit)
3//
4// CAST-RELATED (necessary for embedding/similarity calculations):
5// - cast_precision_loss: f32/f64 conversions in similarity math
6// - cast_possible_truncation: usize to u32 for storage IDs
7// - cast_sign_loss: positive integers cast to unsigned
8// - cast_possible_wrap: negative to unsigned with validation
9//
10// DOCUMENTATION (would require extensive rework across all functions):
11// - missing_errors_doc: Documenting every Result error variant
12// - missing_panics_doc: Documenting every potential panic
13// - doc_markdown: Backticks around field names in docs is pedantic
14//
15// API DESIGN CHOICES (intentional decisions):
16// - unused_self: Methods that may use self in future extensions
17// - implicit_hasher: Accepting HashMap/HashSet without generic bound
18// - needless_pass_by_value: Ownership semantics for builder pattern
19//
20// PEDANTIC LINTS (widespread, provide minimal value):
21// - must_use_candidate: Constructors commonly return Self; not worth marking all
22// - redundant_closure_for_method_calls: Style preference; closures are clear
23// - ref_option: API design choice for consistency with existing patterns
24// - match_same_arms: Merging arms reduces readability for maintenance
25// - map_unwrap_or: map_or is less readable than the explicit pattern
26// - float_cmp: Intentional exact comparisons for known values (e.g., 1.0, 0.5)
27// - assigning_clones: clone_from is not always more efficient
28// - similar_names: Short variable names common in mathematical contexts
29// - missing_docs: Documentation for all public items would require extensive rework
30// - cognitive_complexity: Complex functions exist; refactoring tracked as tech debt
31// - expect_used/unwrap_used: Required for infallible operations and test assertions
32#![allow(clippy::cognitive_complexity)]
33#![allow(clippy::cast_precision_loss)]
34#![allow(clippy::cast_possible_truncation)]
35#![allow(clippy::cast_sign_loss)]
36#![allow(clippy::cast_possible_wrap)]
37#![allow(clippy::missing_errors_doc)]
38#![allow(clippy::missing_panics_doc)]
39#![allow(clippy::doc_markdown)]
40#![allow(clippy::unused_self)]
41#![allow(clippy::implicit_hasher)]
42#![allow(clippy::needless_pass_by_value)]
43#![allow(clippy::must_use_candidate)]
44#![allow(clippy::redundant_closure_for_method_calls)]
45#![allow(clippy::ref_option)]
46#![allow(clippy::match_same_arms)]
47#![allow(clippy::map_unwrap_or)]
48#![allow(clippy::float_cmp)]
49#![allow(clippy::assigning_clones)]
50#![allow(clippy::similar_names)]
51#![allow(clippy::expect_used)]
52#![allow(clippy::unwrap_used)]
53#![allow(clippy::panic)]
54#![allow(missing_docs)]
55
56//! # Memory Core
57//!
58//! Core data structures and types for the self-learning memory system with episodic learning.
59//!
60//! This crate provides the fundamental building blocks for AI agents to learn from execution:
61//!
62//! ## Core Concepts
63//!
64//! - **Episodes**: Complete task execution records with steps, outcomes, and metadata
65//! - **Patterns**: Reusable patterns extracted from episodes using statistical analysis
66//! - **Heuristics**: Learned condition-action rules for future decision-making
67//! - **Reflections**: Generated insights after episode completion
68//! - **Rewards**: Quantitative scoring of episode success
69//!
70//! ## Module Organization
71//!
72//! ### Primary APIs
73//! - [`memory`]: Main orchestrator for the learning cycle
74//! - [`episode`]: Episode creation, logging, and management
75//! - [`patterns`]: Pattern extraction, clustering, and validation
76//! - [`embeddings`]: Semantic embedding generation and similarity search
77//!
78//! ### Support Modules
79//! - [`types`]: Common types used across the system
80//! - [`storage`]: Storage backend abstractions (persistence layer)
81//! - [`pre_storage`]: Pre-storage ingest layer (quality, normalization, validation)
82//! - [`retrieval`]: Memory retrieval and caching
83//! - [`search`]: Search and ranking functionality
84//! - [`security`]: Audit logging and security
85//! - [`monitoring`]: Agent performance monitoring
86//!
87//! ### Data Pipeline
88//!
89//! ```text
90//! Episode → [pre_storage: ingest] → [storage: persistence] → Backend (Turso/redb)
91//! ```
92//!
93//! - **pre_storage**: Sanitize, enrich, normalize, validate episodes
94//! - **storage**: Backend traits, repository interfaces, query construction
95//!
96//! ## Quick Start
97//!
98//! ### Local Development (No Credentials)
99//!
100//! Use `do-memory-storage-turso` for durable local storage:
101//!
102//! ```no_run
103//! use do_memory_core::SelfLearningMemory;
104//!
105//! // In-memory storage for quick testing (no dependencies)
106//! let memory = SelfLearningMemory::new();
107//! ```
108//!
109//! For local SQLite storage, see the `do_memory_storage_turso::SelfLearningMemoryExt` trait.
110//!
111//! ### Basic Episode Recording
112//!
113//! ```no_run
114//! use do_memory_core::memory::SelfLearningMemory;
115//! use do_memory_core::{TaskContext, TaskType, TaskOutcome, ExecutionStep, ExecutionResult};
116//!
117//! #[tokio::main]
118//! async fn main() {
119//!     let memory = SelfLearningMemory::new();
120//!
121//!     // 1. Start an episode for a task
122//!     let context = TaskContext::default();
123//!     let episode_id = memory.start_episode(
124//!         "Implement authentication".to_string(),
125//!         context,
126//!         TaskType::CodeGeneration,
127//!     ).await;
128//!
129//!     // 2. Log execution steps
130//!     let mut step = ExecutionStep::new(
131//!         1,
132//!         "analyzer".to_string(),
133//!         "Analyze requirements".to_string()
134//!     );
135//!     step.result = Some(ExecutionResult::Success {
136//!         output: "Requirements clear".to_string()
137//!     });
138//!     memory.log_step(episode_id, step).await;
139//!
140//!     // 3. Complete episode with learning
141//!     memory.complete_episode(episode_id, TaskOutcome::Success {
142//!         verdict: "Auth implemented successfully".to_string(),
143//!         artifacts: vec!["auth.rs".to_string()],
144//!     }).await.unwrap();
145//!
146//!     // 4. Retrieve relevant context for future tasks
147//!     let relevant = memory.retrieve_relevant_context(
148//!         "Add authorization".to_string(),
149//!         TaskContext::default(),
150//!         5,
151//!     ).await;
152//!
153//!     println!("Found {} relevant episodes", relevant.len());
154//! }
155//! ```
156//!
157//! ### Pattern-Based Learning
158//!
159//! The system automatically extracts reusable patterns from completed episodes:
160//!
161//! ```no_run
162//! use do_memory_core::memory::SelfLearningMemory;
163//! use do_memory_core::patterns::HybridPatternExtractor;
164//! use do_memory_core::episode::Episode;
165//!
166//! # #[tokio::main]
167//! # async fn main() {
168//! # let memory = SelfLearningMemory::new();
169//! // Configure hybrid pattern extraction
170//! let extractor = HybridPatternExtractor::new();
171//!
172//! // Patterns are automatically extracted during episode completion
173//! // The system tracks pattern effectiveness over time
174//! # }
175//! ```
176//!
177//! ### Semantic Search with Embeddings
178//!
179//! ```no_run
180//! use do_memory_core::embeddings::{SemanticService, EmbeddingConfig, InMemoryEmbeddingStorage};
181//! use do_memory_core::episode::Episode;
182//! use do_memory_core::TaskContext;
183//!
184//! # #[tokio::main]
185//! # async fn main() {
186//! # let config = EmbeddingConfig::default();
187//! // Use semantic similarity to find related episodes
188//! # let storage = Box::new(InMemoryEmbeddingStorage::new());
189//! let semantic = SemanticService::default(storage).await.unwrap();
190//!
191//! let related_episodes = semantic
192//!     .find_similar_episodes(
193//!         "fix authentication bug",
194//!         &TaskContext::default(),
195//!         10
196//!     )
197//!     .await
198//!     .unwrap();
199//! # }
200//! ```
201//!
202//! ## Learning Cycle
203//!
204//! 1. **Start Episode**: Create a new episode with task context
205//! 2. **Log Steps**: Record each execution step with outcomes
206//! 3. **Complete Episode**: Mark episode as success/failure
207//! 4. **Extract Patterns**: Identify reusable patterns
208//! 5. **Generate Reflection**: Create insights and lessons learned
209//! 6. **Calculate Reward**: Score episode success
210//! 7. **Retrieve**: Use learned patterns for future tasks
211//!
212//! ## Error Handling
213//!
214//! Most functions return [`Result<T>`] for proper error handling:
215//!
216//! ```no_run
217//! use do_memory_core::{Error, Result};
218//!
219//! async fn example() -> Result<()> {
220//!     // Operations that can fail
221//!     // .await?
222//!     Ok(())
223//! }
224//! ```
225//!
226//! ## Feature Flags
227//!
228//! - `openai`: Enable OpenAI embeddings
229//! - `local-embeddings`: Enable local ONNX-based embeddings
230//! - `turso`: Enable Turso/libSQL storage backend
231//! - `redb`: Enable redb cache storage
232//! - `full`: Enable all features
233//!
234
235pub mod constants;
236pub mod context;
237pub mod embeddings;
238pub mod episode;
239pub mod error;
240pub mod extraction;
241pub mod indexing;
242pub mod learning;
243pub mod memory;
244pub mod monitoring;
245pub mod patterns;
246pub mod pre_storage;
247pub mod procedural;
248pub mod reflection;
249pub mod retrieval;
250pub mod retry;
251pub mod reward;
252pub mod search;
253pub mod security;
254pub mod semantic;
255pub mod spatiotemporal;
256pub mod storage;
257pub mod sync;
258pub use sync::StorageSynchronizer;
259pub mod types;
260
261// Re-export commonly used types
262pub use episode::{CapacityManager, Episode, EvictionPolicy, ExecutionStep, PatternId};
263pub use error::{CacheError, Error, RelationshipError, Result};
264pub use extraction::PatternExtractor;
265pub use indexing::{
266    BenchmarkResult, IndexMetrics, IndexableMemory, QueryPerformance,
267    hierarchical::{HierarchicalIndex, HierarchicalIndexStats, HierarchicalQuery},
268    spatiotemporal::{IndexStats, QueryOptions, SpatiotemporalIndex, TimeBucket},
269};
270pub use learning::queue::{PatternExtractionQueue, QueueConfig, QueueStats};
271pub use memory::SelfLearningMemory;
272pub use memory::checkpoint::{CheckpointMeta, HandoffPack};
273pub use memory::filters::{EpisodeFilter, EpisodeFilterBuilder, OutcomeType};
274pub use memory::step_buffer::BatchConfig;
275pub use monitoring::{AgentMetrics, AgentMonitor, AgentType, MonitoringConfig, TaskMetrics};
276pub use patterns::{
277    Anomaly, AnomalyReason, ChangeDirection, ChangeType, Changepoint, ChangepointConfig,
278    ChangepointDetector, ClusterCentroid, ClusteringConfig, DBSCANAnomalyDetector,
279    DBSCANClusterResult, DBSCANConfig, DBSCANStats, EffectivenessTracker, EpisodeCluster,
280    FeatureWeights, Heuristic, Pattern, PatternClusterer, PatternEffectiveness, PatternMetrics,
281    PatternUsage, PatternValidator, SegmentComparison, SegmentComparisonConfig, SegmentStats,
282    UsageStats, ValidationConfig,
283};
284pub use procedural::ProceduralMemory;
285pub use reflection::ReflectionGenerator;
286pub use retrieval::{CacheKey, CacheMetrics, QueryCache};
287pub use reward::{
288    AdaptiveRewardCalculator, DomainStatistics, DomainStatisticsCache, RewardCalculator,
289};
290pub use security::audit::{
291    ActorType, AuditConfig, AuditContext, AuditEntry, AuditEventType, AuditLogLevel, AuditLogger,
292    AuditOutput, AuditResult,
293};
294pub use storage::{DEFAULT_QUERY_LIMIT, MAX_QUERY_LIMIT, StorageBackend, apply_query_limit};
295pub use types::{
296    CloudEvent, ComplexityLevel, ConcurrencyConfig, DualRewardScore, EventEmitter,
297    EventEmitterMode, Evidence, ExecutionResult, LogEmitter, MemoryConfig, MemoryEventMapping,
298    NoOpEmitter, OutcomeStats, Reflection, RewardScore, StorageConfig, TaskContext, TaskOutcome,
299    TaskType,
300};
301
302// Re-export attribution types (ADR-044 Feature 2)
303pub use memory::attribution::{
304    RecommendationFeedback, RecommendationSession, RecommendationStats, RecommendationTracker,
305};
306
307// Re-export context bundle types (WG-117)
308pub use context::{
309    AddResult, BundleAccumulator, BundleConfig, BundleStats, ContextItem, ContextItemType,
310};
311
312// Re-export retry types (issue #753)
313pub use retry::{ConcurrencyLimiter, RetryBudget, RetryConfig, RetryMetrics, RetryPolicy};