1#![cfg_attr(test, allow(clippy::unwrap_used, clippy::expect_used))]
2
3use std::sync::Arc;
18use std::time::SystemTime;
19
20use async_trait::async_trait;
21
22use crate::error::MemoryError;
23use crate::observation::{Observation, ObservationType, SaveEntry};
24use crate::store::{DueTask, Store, UsageSummary};
25use crate::types::{HistoryRow, MessageRow};
26
27#[async_trait]
34pub trait MemoryStore: Send + Sync {
35 async fn close_current_conversation(
40 &self,
41 channel: &str,
42 sender_id: &str,
43 project: &str,
44 ) -> Result<bool, MemoryError>;
45
46 async fn get_memory_stats(&self, sender_id: &str) -> Result<(i64, i64, i64, i64), MemoryError>;
56
57 async fn db_size(&self) -> Result<u64, MemoryError>;
59
60 async fn get_total_usage(&self) -> Result<UsageSummary, MemoryError>;
62
63 async fn get_history(
66 &self,
67 channel: &str,
68 sender_id: &str,
69 limit: i64,
70 ) -> Result<Vec<HistoryRow>, MemoryError>;
71
72 async fn search_messages(
77 &self,
78 query: &str,
79 exclude_conversation_id: &str,
80 sender_id: &str,
81 limit: i64,
82 since: Option<SystemTime>,
83 ) -> Result<Vec<MessageRow>, MemoryError>;
84
85 async fn get_message_by_id(&self, id: &str) -> Result<Option<MessageRow>, MemoryError>;
88
89 async fn store_fact(&self, sender_id: &str, key: &str, value: &str) -> Result<(), MemoryError>;
95
96 async fn get_fact(&self, sender_id: &str, key: &str) -> Result<Option<String>, MemoryError>;
99
100 async fn get_facts(&self, sender_id: &str) -> Result<Vec<(String, String)>, MemoryError>;
102
103 async fn soft_delete_fact(&self, sender_id: &str, key: &str) -> Result<bool, MemoryError>;
107
108 async fn soft_delete_facts(
113 &self,
114 sender_id: &str,
115 key: Option<&str>,
116 ) -> Result<u64, MemoryError>;
117
118 async fn list_soft_deleted_facts(
121 &self,
122 sender_id: &str,
123 ) -> Result<Vec<(String, String, String)>, MemoryError>;
124
125 async fn save_observation(&self, entry: SaveEntry) -> Result<Observation, MemoryError>;
132
133 async fn get_observation_by_id(&self, id: &str) -> Result<Option<Observation>, MemoryError>;
137
138 async fn search_observations(
142 &self,
143 query: &str,
144 sender_id: &str,
145 limit: i64,
146 since: Option<SystemTime>,
147 kind: Option<ObservationType>,
148 ) -> Result<Vec<Observation>, MemoryError>;
149
150 async fn soft_delete_observation(&self, id: &str) -> Result<bool, MemoryError>;
155
156 async fn list_soft_deleted_observations(
160 &self,
161 sender_id: &str,
162 ) -> Result<Vec<Observation>, MemoryError>;
163
164 #[allow(clippy::too_many_arguments)]
168 async fn create_task(
169 &self,
170 channel: &str,
171 sender_id: &str,
172 reply_target: &str,
173 description: &str,
174 due_at: &str,
175 repeat: Option<&str>,
176 task_type: &str,
177 project: &str,
178 ) -> Result<String, MemoryError>;
179
180 async fn get_tasks_for_sender(
183 &self,
184 sender_id: &str,
185 ) -> Result<Vec<(String, String, String, Option<String>, String, String)>, MemoryError>;
186
187 async fn complete_task(&self, id: &str, repeat: Option<&str>) -> Result<(), MemoryError>;
191
192 async fn fail_task(&self, id: &str, error: &str, max_retries: u32)
196 -> Result<bool, MemoryError>;
197
198 async fn cancel_task(&self, id_prefix: &str, sender_id: &str) -> Result<bool, MemoryError>;
201
202 async fn get_due_tasks(&self) -> Result<Vec<DueTask>, MemoryError>;
204}
205
206#[async_trait]
207impl MemoryStore for Store {
208 async fn close_current_conversation(
209 &self,
210 channel: &str,
211 sender_id: &str,
212 project: &str,
213 ) -> Result<bool, MemoryError> {
214 Store::close_current_conversation(self, channel, sender_id, project).await
215 }
216
217 async fn get_memory_stats(&self, sender_id: &str) -> Result<(i64, i64, i64, i64), MemoryError> {
218 Store::get_memory_stats(self, sender_id).await
219 }
220
221 async fn db_size(&self) -> Result<u64, MemoryError> {
222 Store::db_size(self).await
223 }
224
225 async fn get_total_usage(&self) -> Result<UsageSummary, MemoryError> {
226 Store::get_total_usage(self).await
227 }
228
229 async fn get_history(
230 &self,
231 channel: &str,
232 sender_id: &str,
233 limit: i64,
234 ) -> Result<Vec<HistoryRow>, MemoryError> {
235 Store::get_history(self, channel, sender_id, limit).await
236 }
237
238 async fn search_messages(
239 &self,
240 query: &str,
241 exclude_conversation_id: &str,
242 sender_id: &str,
243 limit: i64,
244 since: Option<SystemTime>,
245 ) -> Result<Vec<MessageRow>, MemoryError> {
246 Store::search_messages(
247 self,
248 query,
249 exclude_conversation_id,
250 sender_id,
251 limit,
252 since,
253 )
254 .await
255 }
256
257 async fn get_message_by_id(&self, id: &str) -> Result<Option<MessageRow>, MemoryError> {
258 Store::get_message_by_id(self, id).await
259 }
260
261 async fn store_fact(&self, sender_id: &str, key: &str, value: &str) -> Result<(), MemoryError> {
262 Store::store_fact(self, sender_id, key, value).await
263 }
264
265 async fn get_fact(&self, sender_id: &str, key: &str) -> Result<Option<String>, MemoryError> {
266 Store::get_fact(self, sender_id, key).await
267 }
268
269 async fn get_facts(&self, sender_id: &str) -> Result<Vec<(String, String)>, MemoryError> {
270 Store::get_facts(self, sender_id).await
271 }
272
273 async fn soft_delete_fact(&self, sender_id: &str, key: &str) -> Result<bool, MemoryError> {
274 Store::soft_delete_fact(self, sender_id, key).await
275 }
276
277 async fn soft_delete_facts(
278 &self,
279 sender_id: &str,
280 key: Option<&str>,
281 ) -> Result<u64, MemoryError> {
282 Store::soft_delete_facts(self, sender_id, key).await
283 }
284
285 async fn list_soft_deleted_facts(
286 &self,
287 sender_id: &str,
288 ) -> Result<Vec<(String, String, String)>, MemoryError> {
289 Store::list_soft_deleted_facts(self, sender_id).await
290 }
291
292 async fn save_observation(&self, entry: SaveEntry) -> Result<Observation, MemoryError> {
293 Store::save_observation(self, entry).await
294 }
295
296 async fn get_observation_by_id(&self, id: &str) -> Result<Option<Observation>, MemoryError> {
297 Store::get_observation_by_id(self, id).await
298 }
299
300 async fn search_observations(
301 &self,
302 query: &str,
303 sender_id: &str,
304 limit: i64,
305 since: Option<SystemTime>,
306 kind: Option<ObservationType>,
307 ) -> Result<Vec<Observation>, MemoryError> {
308 Store::search_observations(self, query, sender_id, limit, since, kind).await
309 }
310
311 async fn soft_delete_observation(&self, id: &str) -> Result<bool, MemoryError> {
312 Store::soft_delete_observation(self, id).await
313 }
314
315 async fn list_soft_deleted_observations(
316 &self,
317 sender_id: &str,
318 ) -> Result<Vec<Observation>, MemoryError> {
319 Store::list_soft_deleted_observations(self, sender_id).await
320 }
321
322 async fn create_task(
323 &self,
324 channel: &str,
325 sender_id: &str,
326 reply_target: &str,
327 description: &str,
328 due_at: &str,
329 repeat: Option<&str>,
330 task_type: &str,
331 project: &str,
332 ) -> Result<String, MemoryError> {
333 Store::create_task(
334 self,
335 channel,
336 sender_id,
337 reply_target,
338 description,
339 due_at,
340 repeat,
341 task_type,
342 project,
343 )
344 .await
345 }
346
347 async fn get_tasks_for_sender(
348 &self,
349 sender_id: &str,
350 ) -> Result<Vec<(String, String, String, Option<String>, String, String)>, MemoryError> {
351 Store::get_tasks_for_sender(self, sender_id).await
352 }
353
354 async fn complete_task(&self, id: &str, repeat: Option<&str>) -> Result<(), MemoryError> {
355 Store::complete_task(self, id, repeat).await
356 }
357
358 async fn fail_task(
359 &self,
360 id: &str,
361 error: &str,
362 max_retries: u32,
363 ) -> Result<bool, MemoryError> {
364 Store::fail_task(self, id, error, max_retries).await
365 }
366
367 async fn cancel_task(&self, id_prefix: &str, sender_id: &str) -> Result<bool, MemoryError> {
368 Store::cancel_task(self, id_prefix, sender_id).await
369 }
370
371 async fn get_due_tasks(&self) -> Result<Vec<DueTask>, MemoryError> {
372 Store::get_due_tasks(self).await
373 }
374}
375
376pub fn into_handle(store: Store) -> Arc<dyn MemoryStore> {
381 Arc::new(store)
382}