do_memory_core/reflection/
mod.rs1mod helpers;
32mod improvement_analyzer;
33mod insight_generator;
34mod success_analyzer;
35
36#[cfg(test)]
37mod tests;
38
39use crate::episode::Episode;
40use crate::types::Reflection;
41use chrono::Utc;
42use tracing::{debug, instrument};
43
44const MAX_REFLECTION_ITEMS: usize = 5;
46
47#[derive(Clone)]
49pub struct ReflectionGenerator {
50 max_items: usize,
52}
53
54impl Default for ReflectionGenerator {
55 fn default() -> Self {
56 Self::new()
57 }
58}
59
60impl ReflectionGenerator {
61 #[must_use]
63 pub fn new() -> Self {
64 Self {
65 max_items: MAX_REFLECTION_ITEMS,
66 }
67 }
68
69 #[must_use]
71 pub fn with_max_items(max_items: usize) -> Self {
72 Self { max_items }
73 }
74
75 #[instrument(skip(self, episode), fields(episode_id = %episode.episode_id))]
77 pub fn generate(&self, episode: &Episode) -> Reflection {
78 let mut successes = success_analyzer::identify_successes(episode, self.max_items);
79 let mut improvements = improvement_analyzer::identify_improvements(episode, self.max_items);
80 let mut insights = insight_generator::generate_insights(episode, self.max_items);
81
82 successes.extend(success_analyzer::analyze_success_patterns(episode));
84 improvements.extend(improvement_analyzer::analyze_improvement_opportunities(
85 episode,
86 ));
87 insights.extend(insight_generator::generate_contextual_insights(episode));
88
89 successes.truncate(self.max_items);
91 improvements.truncate(self.max_items);
92 insights.truncate(self.max_items);
93
94 debug!(
95 successes_count = successes.len(),
96 improvements_count = improvements.len(),
97 insights_count = insights.len(),
98 "Generated reflection"
99 );
100
101 Reflection {
102 successes,
103 improvements,
104 insights,
105 generated_at: Utc::now(),
106 }
107 }
108}