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