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