use super::{ MemoryRecord, MemoryUpsert, SchedulerJobRecord, SchedulerJobState, SchedulerJobStatus, SchedulerJobUpsert, SessionRecord, SkillEventRecord, StorageError, }; use crate::bus::ChatMessage; pub trait ConversationRepository: Send + Sync + 'static { fn ensure_channel_session( &self, channel_name: &str, chat_id: &str, ) -> Result; /// 确保指定 session_id 的会话存在(如果不存在则创建) fn ensure_session( &self, session_id: &str, channel_name: &str, chat_id: &str, title: &str, ) -> Result; fn load_messages(&self, session_id: &str) -> Result, StorageError>; fn load_messages_for_topic(&self, topic_id: &str) -> Result, StorageError>; fn append_message(&self, session_id: &str, message: &ChatMessage) -> Result<(), StorageError>; fn append_message_with_topic( &self, session_id: &str, topic_id: Option<&str>, message: &ChatMessage, ) -> Result<(), StorageError>; fn append_messages_batch( &self, session_id: &str, topic_id: Option<&str>, messages: &[ChatMessage], ) -> Result<(), StorageError>; fn clear_messages(&self, session_id: &str) -> Result<(), StorageError>; fn compact_active_history( &self, session_id: &str, snapshot_end_seq: i64, preserved_system_messages: &[ChatMessage], summary_message: &ChatMessage, preserved_messages: &[ChatMessage], ) -> Result; } pub trait PromptInjectionRepository: Send + Sync + 'static { fn get_session(&self, session_id: &str) -> Result, StorageError>; fn count_active_user_messages(&self, session_id: &str) -> Result; fn mark_agent_prompt_reinjected(&self, session_id: &str) -> Result<(), StorageError>; } pub trait MemoryRepository: Send + Sync + 'static { fn put_memory(&self, input: &MemoryUpsert) -> Result; fn update_memory(&self, input: &MemoryUpsert) -> Result, StorageError>; fn delete_memory( &self, scope_kind: &str, scope_key: &str, namespace: &str, memory_key: &str, ) -> Result; fn get_memory( &self, scope_kind: &str, scope_key: &str, namespace: &str, memory_key: &str, ) -> Result, StorageError>; fn list_memories( &self, scope_kind: &str, scope_key: &str, namespace: Option<&str>, limit: usize, ) -> Result, StorageError>; fn search_memories_any( &self, scope_kind: &str, scope_key: &str, queries: &[String], namespace: Option<&str>, limit: usize, ) -> Result, StorageError>; } pub trait SchedulerJobRepository: Send + Sync + 'static { fn upsert_scheduler_job( &self, input: &SchedulerJobUpsert, ) -> Result; fn get_scheduler_job(&self, job_id: &str) -> Result, StorageError>; fn list_scheduler_jobs( &self, enabled_only: bool, ) -> Result, StorageError>; fn list_running_scheduler_jobs(&self) -> Result, StorageError>; fn delete_scheduler_job(&self, job_id: &str) -> Result<(), StorageError>; fn update_scheduler_job_runtime( &self, job_id: &str, state: SchedulerJobState, last_status: Option, last_error: Option<&str>, run_count: i64, last_fired_at: Option, next_fire_at: Option, paused_at: Option, completed_at: Option, ) -> Result<(), StorageError>; } pub trait SkillEventRepository: Send + Sync + 'static { fn append_skill_event( &self, session_id: Option<&str>, event_type: &str, skill_name: Option<&str>, payload: &serde_json::Value, ) -> Result<(), StorageError>; fn list_skill_events( &self, session_id: Option<&str>, ) -> Result, StorageError>; } impl ConversationRepository for super::SessionStore { fn ensure_channel_session( &self, channel_name: &str, chat_id: &str, ) -> Result { super::SessionStore::ensure_channel_session(self, channel_name, chat_id) } fn ensure_session( &self, session_id: &str, channel_name: &str, chat_id: &str, title: &str, ) -> Result { super::SessionStore::ensure_session(self, session_id, channel_name, chat_id, title) } fn load_messages(&self, session_id: &str) -> Result, StorageError> { super::SessionStore::load_messages(self, session_id) } fn load_messages_for_topic(&self, topic_id: &str) -> Result, StorageError> { super::SessionStore::load_messages_for_topic(self, topic_id) } fn append_message(&self, session_id: &str, message: &ChatMessage) -> Result<(), StorageError> { super::SessionStore::append_message(self, session_id, message) } fn append_message_with_topic( &self, session_id: &str, topic_id: Option<&str>, message: &ChatMessage, ) -> Result<(), StorageError> { super::SessionStore::append_message_with_topic(self, session_id, topic_id, message) } fn append_messages_batch( &self, session_id: &str, topic_id: Option<&str>, messages: &[ChatMessage], ) -> Result<(), StorageError> { super::SessionStore::append_messages_batch(self, session_id, topic_id, messages) } fn clear_messages(&self, session_id: &str) -> Result<(), StorageError> { super::SessionStore::clear_messages(self, session_id) } fn compact_active_history( &self, session_id: &str, snapshot_end_seq: i64, preserved_system_messages: &[ChatMessage], summary_message: &ChatMessage, preserved_messages: &[ChatMessage], ) -> Result { super::SessionStore::compact_active_history( self, session_id, snapshot_end_seq, preserved_system_messages, summary_message, preserved_messages, ) } } impl PromptInjectionRepository for super::SessionStore { fn get_session(&self, session_id: &str) -> Result, StorageError> { super::SessionStore::get_session(self, session_id) } fn count_active_user_messages(&self, session_id: &str) -> Result { super::SessionStore::count_active_user_messages(self, session_id) } fn mark_agent_prompt_reinjected(&self, session_id: &str) -> Result<(), StorageError> { super::SessionStore::mark_agent_prompt_reinjected(self, session_id) } } impl MemoryRepository for super::SessionStore { fn put_memory(&self, input: &MemoryUpsert) -> Result { super::SessionStore::put_memory(self, input) } fn update_memory(&self, input: &MemoryUpsert) -> Result, StorageError> { super::SessionStore::update_memory(self, input) } fn delete_memory( &self, scope_kind: &str, scope_key: &str, namespace: &str, memory_key: &str, ) -> Result { super::SessionStore::delete_memory(self, scope_kind, scope_key, namespace, memory_key) } fn get_memory( &self, scope_kind: &str, scope_key: &str, namespace: &str, memory_key: &str, ) -> Result, StorageError> { super::SessionStore::get_memory(self, scope_kind, scope_key, namespace, memory_key) } fn list_memories( &self, scope_kind: &str, scope_key: &str, namespace: Option<&str>, limit: usize, ) -> Result, StorageError> { super::SessionStore::list_memories(self, scope_kind, scope_key, namespace, limit) } fn search_memories_any( &self, scope_kind: &str, scope_key: &str, queries: &[String], namespace: Option<&str>, limit: usize, ) -> Result, StorageError> { super::SessionStore::search_memories_any( self, scope_kind, scope_key, queries, namespace, limit, ) } } impl SchedulerJobRepository for super::SessionStore { fn upsert_scheduler_job( &self, input: &SchedulerJobUpsert, ) -> Result { super::SessionStore::upsert_scheduler_job(self, input) } fn get_scheduler_job(&self, job_id: &str) -> Result, StorageError> { super::SessionStore::get_scheduler_job(self, job_id) } fn list_scheduler_jobs( &self, enabled_only: bool, ) -> Result, StorageError> { super::SessionStore::list_scheduler_jobs(self, enabled_only) } fn list_running_scheduler_jobs(&self) -> Result, StorageError> { super::SessionStore::list_running_scheduler_jobs(self) } fn delete_scheduler_job(&self, job_id: &str) -> Result<(), StorageError> { super::SessionStore::delete_scheduler_job(self, job_id) } fn update_scheduler_job_runtime( &self, job_id: &str, state: SchedulerJobState, last_status: Option, last_error: Option<&str>, run_count: i64, last_fired_at: Option, next_fire_at: Option, paused_at: Option, completed_at: Option, ) -> Result<(), StorageError> { super::SessionStore::update_scheduler_job_runtime( self, job_id, state, last_status, last_error, run_count, last_fired_at, next_fire_at, paused_at, completed_at, ) } } impl SkillEventRepository for super::SessionStore { fn append_skill_event( &self, session_id: Option<&str>, event_type: &str, skill_name: Option<&str>, payload: &serde_json::Value, ) -> Result<(), StorageError> { super::SessionStore::append_skill_event(self, session_id, event_type, skill_name, payload) } fn list_skill_events( &self, session_id: Option<&str>, ) -> Result, StorageError> { super::SessionStore::list_skill_events(self, session_id) } }