fix(session): 消息持久化和恢复
问题:消息只写内存,重启后丢失。from_storage 恢复了 meta 但没加载消息。 修复: - add_message 改为 async,同时写内存和 Storage - compact 场景用 persist=false 避免重复持久化 - clear_session_history 同时清内存和 Storage 消息 - 所有调用点添加 .await 和错误转换
This commit is contained in:
parent
c48ed83a23
commit
e2fd836794
@ -163,27 +163,9 @@ impl Session {
|
||||
self.id.to_string()
|
||||
}
|
||||
|
||||
/// 添加消息到历史(仅内存,Phase 3 会扩展为持久化)
|
||||
pub fn add_message(&mut self, message: ChatMessage) {
|
||||
let is_user = message.role == "user";
|
||||
let now = chrono::Utc::now().timestamp_millis();
|
||||
|
||||
// Assign seq (in-memory only, persistence in Phase 3)
|
||||
let _seq = self.seq_counter;
|
||||
self.seq_counter += 1;
|
||||
|
||||
// Update in-memory state
|
||||
self.messages.push(message);
|
||||
self.total_message_count += 1;
|
||||
if is_user {
|
||||
self.message_count += 1;
|
||||
}
|
||||
self.last_active_at = now;
|
||||
}
|
||||
|
||||
/// 添加消息到历史并持久化到 Storage(Phase 3 使用)
|
||||
/// 目前 storage 为 None,此方法退化为 add_message
|
||||
pub async fn add_message_and_persist(&mut self, message: ChatMessage) -> Result<(), StorageError> {
|
||||
/// 添加消息到历史并持久化到 Storage
|
||||
/// 如果 `persist` 为 false,只更新内存(用于 compaction 场景)
|
||||
pub async fn add_message(&mut self, message: ChatMessage, persist: bool) -> Result<(), StorageError> {
|
||||
let is_user = message.role == "user";
|
||||
let now = chrono::Utc::now().timestamp_millis();
|
||||
|
||||
@ -191,7 +173,8 @@ impl Session {
|
||||
let seq = self.seq_counter;
|
||||
self.seq_counter += 1;
|
||||
|
||||
// Persist to Storage (currently None, wired up in Phase 3)
|
||||
// Persist to Storage
|
||||
if persist {
|
||||
if let Some(ref storage) = self.storage {
|
||||
let msg_meta = crate::storage::message::MessageMeta {
|
||||
id: message.id.clone(),
|
||||
@ -211,6 +194,7 @@ impl Session {
|
||||
};
|
||||
storage.append_message_with_retry(&self.id.to_string(), &msg_meta).await?;
|
||||
}
|
||||
}
|
||||
|
||||
// Update in-memory state
|
||||
self.messages.push(message);
|
||||
@ -757,7 +741,8 @@ impl SessionManager {
|
||||
let compressed_count = compressed.len();
|
||||
session_guard.clear_history();
|
||||
for msg in compressed {
|
||||
session_guard.add_message(msg);
|
||||
session_guard.add_message(msg, false).await
|
||||
.map_err(|e| AgentError::Other(format!("persist error: {}", e)))?;
|
||||
}
|
||||
Ok((None, format!(
|
||||
"Context compressed: {} → {} messages.",
|
||||
@ -1125,7 +1110,8 @@ impl SessionManager {
|
||||
}
|
||||
|
||||
let user_message = session_guard.create_user_message(content, media_refs);
|
||||
session_guard.add_message(user_message);
|
||||
session_guard.add_message(user_message, true).await
|
||||
.map_err(|e| AgentError::Other(format!("persist error: {}", e)))?;
|
||||
|
||||
let mut history = session_guard.get_history().to_vec();
|
||||
|
||||
@ -1145,7 +1131,8 @@ impl SessionManager {
|
||||
let result = agent.process(history).await?;
|
||||
|
||||
for msg in result.emitted_messages {
|
||||
session_guard.add_message(msg);
|
||||
session_guard.add_message(msg, true).await
|
||||
.map_err(|e| AgentError::Other(format!("persist error: {}", e)))?;
|
||||
}
|
||||
|
||||
result.final_response.content
|
||||
@ -1165,7 +1152,16 @@ impl SessionManager {
|
||||
pub async fn clear_session_history(&self, unified_id: &UnifiedSessionId) -> Result<(), AgentError> {
|
||||
let session = self.get_or_create_session(unified_id).await?;
|
||||
let mut session_guard = session.lock().await;
|
||||
session_guard.clear_history();
|
||||
// Clear in-memory
|
||||
session_guard.messages.clear();
|
||||
session_guard.seq_counter = 1;
|
||||
session_guard.total_message_count = 0;
|
||||
session_guard.message_count = 0;
|
||||
// Clear Storage
|
||||
if let Some(ref storage) = session_guard.storage {
|
||||
storage.clear_messages(&session_guard.id.to_string()).await
|
||||
.map_err(|e| AgentError::Other(format!("failed to clear messages: {}", e)))?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user