mod types;
pub use types::ProceduralMemory;
#[cfg(test)]
mod tests;
use crate::types::TaskContext;
use chrono::Utc;
use uuid::Uuid;
impl ProceduralMemory {
pub fn new(
name: String,
description: String,
context: TaskContext,
steps: Vec<crate::memory::playbook::PlaybookStep>,
) -> Self {
let now = Utc::now();
Self {
id: Uuid::new_v4(),
name,
description,
context,
steps,
effectiveness: crate::patterns::PatternEffectiveness::default(),
source_episodes: Vec::new(),
source_patterns: Vec::new(),
created_at: now,
updated_at: now,
}
}
#[must_use]
pub fn is_relevant_to(&self, query_context: &TaskContext) -> bool {
if self.context.domain == query_context.domain {
return true;
}
if self.context.language == query_context.language && self.context.language.is_some() {
return true;
}
let common_tags: Vec<_> = self
.context
.tags
.iter()
.filter(|t| query_context.tags.contains(t))
.collect();
if !common_tags.is_empty() {
return true;
}
false
}
pub fn record_retrieval(&mut self) {
self.effectiveness.record_retrieval();
self.updated_at = Utc::now();
}
pub fn record_application(&mut self, success: bool, reward_delta: f32) {
self.effectiveness.record_application(success, reward_delta);
self.updated_at = Utc::now();
}
pub fn add_source_episode(&mut self, episode_id: Uuid) {
if !self.source_episodes.contains(&episode_id) {
self.source_episodes.push(episode_id);
self.updated_at = Utc::now();
}
}
pub fn add_source_pattern(&mut self, pattern_id: crate::episode::PatternId) {
if !self.source_patterns.contains(&pattern_id) {
self.source_patterns.push(pattern_id);
self.updated_at = Utc::now();
}
}
}