From 0be31bbf7ec5f57b1b1fe7650b4e08c076261170 Mon Sep 17 00:00:00 2001 From: iven Date: Sat, 4 Apr 2026 01:22:03 +0800 Subject: [PATCH] feat(memory): add message pagination support - get_messages_paginated(session_id, limit, offset) for batch loading - count_messages(session_id) for total count queries - Enables frontend to load messages progressively instead of all-at-once --- crates/zclaw-memory/src/store.rs | 40 ++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/crates/zclaw-memory/src/store.rs b/crates/zclaw-memory/src/store.rs index 5c60ff6..ce38a0d 100644 --- a/crates/zclaw-memory/src/store.rs +++ b/crates/zclaw-memory/src/store.rs @@ -324,6 +324,46 @@ impl MemoryStore { Ok(messages) } + /// Get messages for a session with pagination + pub async fn get_messages_paginated( + &self, + session_id: &SessionId, + limit: u32, + offset: u32, + ) -> Result> { + let session_str = session_id.to_string(); + + let rows = sqlx::query_as::<_, (String,)>( + "SELECT content FROM messages WHERE session_id = ? ORDER BY seq LIMIT ? OFFSET ?" + ) + .bind(&session_str) + .bind(limit) + .bind(offset) + .fetch_all(&self.pool) + .await + .map_err(|e| ZclawError::StorageError(e.to_string()))?; + + let messages = rows + .into_iter() + .filter_map(|(content,)| serde_json::from_str(&content).ok()) + .collect(); + Ok(messages) + } + + /// Count messages in a session + pub async fn count_messages(&self, session_id: &SessionId) -> Result { + let session_str = session_id.to_string(); + let count: i64 = sqlx::query_scalar( + "SELECT COUNT(*) FROM messages WHERE session_id = ?" + ) + .bind(&session_str) + .fetch_one(&self.pool) + .await + .map_err(|e| ZclawError::StorageError(e.to_string()))?; + + Ok(count as u64) + } + // === KV Store === /// Store a key-value pair for an agent