use super::{Memory, MemoryHook};
use memory::{EntryKind, Op};
use schemars::JsonSchema;
use serde::Deserialize;
use wcore::ToolDispatch;
#[derive(Deserialize, JsonSchema)]
pub struct Remember {
pub name: String,
pub content: String,
#[serde(default)]
pub aliases: Vec<String>,
}
impl Memory {
pub fn remember(&self, name: String, content: String, aliases: Vec<String>) -> String {
let mut store = self.store_write();
let exists = store.get(&name).is_some();
let op = if exists {
Op::Update {
name: name.clone(),
content,
aliases,
}
} else {
Op::Add {
name: name.clone(),
content,
aliases,
kind: EntryKind::Note,
}
};
match store.apply(op) {
Ok(_) => format!("remembered: {name}"),
Err(e) => format!("failed to save entry: {e}"),
}
}
}
impl MemoryHook {
pub(super) async fn handle_remember(&self, call: ToolDispatch) -> Result<String, String> {
let input: Remember =
serde_json::from_str(&call.args).map_err(|e| format!("invalid arguments: {e}"))?;
Ok(self
.memory
.remember(input.name, input.content, input.aliases))
}
}