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, TaskRunRecord, 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 async fn claim_due_tasks(&self) -> Result<Vec<DueTask>, MemoryError>;
213
214 #[allow(clippy::too_many_arguments)]
217 async fn record_task_run(
218 &self,
219 task_id: &str,
220 started_at: &str,
221 status: &str,
222 result: Option<&str>,
223 error: Option<&str>,
224 tokens_used: Option<u64>,
225 ) -> Result<String, MemoryError>;
226
227 async fn list_task_runs(
230 &self,
231 task_id_prefix: &str,
232 limit: u32,
233 ) -> Result<Vec<TaskRunRecord>, MemoryError>;
234}
235
236#[async_trait]
237impl MemoryStore for Store {
238 async fn close_current_conversation(
239 &self,
240 channel: &str,
241 sender_id: &str,
242 project: &str,
243 ) -> Result<bool, MemoryError> {
244 Store::close_current_conversation(self, channel, sender_id, project).await
245 }
246
247 async fn get_memory_stats(&self, sender_id: &str) -> Result<(i64, i64, i64, i64), MemoryError> {
248 Store::get_memory_stats(self, sender_id).await
249 }
250
251 async fn db_size(&self) -> Result<u64, MemoryError> {
252 Store::db_size(self).await
253 }
254
255 async fn get_total_usage(&self) -> Result<UsageSummary, MemoryError> {
256 Store::get_total_usage(self).await
257 }
258
259 async fn get_history(
260 &self,
261 channel: &str,
262 sender_id: &str,
263 limit: i64,
264 ) -> Result<Vec<HistoryRow>, MemoryError> {
265 Store::get_history(self, channel, sender_id, limit).await
266 }
267
268 async fn search_messages(
269 &self,
270 query: &str,
271 exclude_conversation_id: &str,
272 sender_id: &str,
273 limit: i64,
274 since: Option<SystemTime>,
275 ) -> Result<Vec<MessageRow>, MemoryError> {
276 Store::search_messages(
277 self,
278 query,
279 exclude_conversation_id,
280 sender_id,
281 limit,
282 since,
283 )
284 .await
285 }
286
287 async fn get_message_by_id(&self, id: &str) -> Result<Option<MessageRow>, MemoryError> {
288 Store::get_message_by_id(self, id).await
289 }
290
291 async fn store_fact(&self, sender_id: &str, key: &str, value: &str) -> Result<(), MemoryError> {
292 Store::store_fact(self, sender_id, key, value).await
293 }
294
295 async fn get_fact(&self, sender_id: &str, key: &str) -> Result<Option<String>, MemoryError> {
296 Store::get_fact(self, sender_id, key).await
297 }
298
299 async fn get_facts(&self, sender_id: &str) -> Result<Vec<(String, String)>, MemoryError> {
300 Store::get_facts(self, sender_id).await
301 }
302
303 async fn soft_delete_fact(&self, sender_id: &str, key: &str) -> Result<bool, MemoryError> {
304 Store::soft_delete_fact(self, sender_id, key).await
305 }
306
307 async fn soft_delete_facts(
308 &self,
309 sender_id: &str,
310 key: Option<&str>,
311 ) -> Result<u64, MemoryError> {
312 Store::soft_delete_facts(self, sender_id, key).await
313 }
314
315 async fn list_soft_deleted_facts(
316 &self,
317 sender_id: &str,
318 ) -> Result<Vec<(String, String, String)>, MemoryError> {
319 Store::list_soft_deleted_facts(self, sender_id).await
320 }
321
322 async fn save_observation(&self, entry: SaveEntry) -> Result<Observation, MemoryError> {
323 Store::save_observation(self, entry).await
324 }
325
326 async fn get_observation_by_id(&self, id: &str) -> Result<Option<Observation>, MemoryError> {
327 Store::get_observation_by_id(self, id).await
328 }
329
330 async fn search_observations(
331 &self,
332 query: &str,
333 sender_id: &str,
334 limit: i64,
335 since: Option<SystemTime>,
336 kind: Option<ObservationType>,
337 ) -> Result<Vec<Observation>, MemoryError> {
338 Store::search_observations(self, query, sender_id, limit, since, kind).await
339 }
340
341 async fn soft_delete_observation(&self, id: &str) -> Result<bool, MemoryError> {
342 Store::soft_delete_observation(self, id).await
343 }
344
345 async fn list_soft_deleted_observations(
346 &self,
347 sender_id: &str,
348 ) -> Result<Vec<Observation>, MemoryError> {
349 Store::list_soft_deleted_observations(self, sender_id).await
350 }
351
352 async fn create_task(
353 &self,
354 channel: &str,
355 sender_id: &str,
356 reply_target: &str,
357 description: &str,
358 due_at: &str,
359 repeat: Option<&str>,
360 task_type: &str,
361 project: &str,
362 ) -> Result<String, MemoryError> {
363 Store::create_task(
364 self,
365 channel,
366 sender_id,
367 reply_target,
368 description,
369 due_at,
370 repeat,
371 task_type,
372 project,
373 )
374 .await
375 }
376
377 async fn get_tasks_for_sender(
378 &self,
379 sender_id: &str,
380 ) -> Result<Vec<(String, String, String, Option<String>, String, String)>, MemoryError> {
381 Store::get_tasks_for_sender(self, sender_id).await
382 }
383
384 async fn complete_task(&self, id: &str, repeat: Option<&str>) -> Result<(), MemoryError> {
385 Store::complete_task(self, id, repeat).await
386 }
387
388 async fn fail_task(
389 &self,
390 id: &str,
391 error: &str,
392 max_retries: u32,
393 ) -> Result<bool, MemoryError> {
394 Store::fail_task(self, id, error, max_retries).await
395 }
396
397 async fn cancel_task(&self, id_prefix: &str, sender_id: &str) -> Result<bool, MemoryError> {
398 Store::cancel_task(self, id_prefix, sender_id).await
399 }
400
401 async fn get_due_tasks(&self) -> Result<Vec<DueTask>, MemoryError> {
402 Store::get_due_tasks(self).await
403 }
404
405 async fn claim_due_tasks(&self) -> Result<Vec<DueTask>, MemoryError> {
406 Store::claim_due_tasks(self).await
407 }
408
409 async fn record_task_run(
410 &self,
411 task_id: &str,
412 started_at: &str,
413 status: &str,
414 result: Option<&str>,
415 error: Option<&str>,
416 tokens_used: Option<u64>,
417 ) -> Result<String, MemoryError> {
418 Store::record_task_run(
419 self,
420 task_id,
421 started_at,
422 status,
423 result,
424 error,
425 tokens_used,
426 )
427 .await
428 }
429
430 async fn list_task_runs(
431 &self,
432 task_id_prefix: &str,
433 limit: u32,
434 ) -> Result<Vec<TaskRunRecord>, MemoryError> {
435 Store::list_task_runs(self, task_id_prefix, limit).await
436 }
437}
438
439pub fn into_handle(store: Store) -> Arc<dyn MemoryStore> {
444 Arc::new(store)
445}