diff --git a/surfsense_backend/app/agents/new_chat/tools/shared_memory.py b/surfsense_backend/app/agents/new_chat/tools/shared_memory.py new file mode 100644 index 000000000..565745fa3 --- /dev/null +++ b/surfsense_backend/app/agents/new_chat/tools/shared_memory.py @@ -0,0 +1,39 @@ +"""Shared (team) memory backend for search-space-scoped AI context.""" + +import logging + +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from app.db import SharedMemory + +logger = logging.getLogger(__name__) + +DEFAULT_RECALL_TOP_K = 5 +MAX_MEMORIES_PER_SEARCH_SPACE = 250 + + +async def get_shared_memory_count( + db_session: AsyncSession, + search_space_id: int, +) -> int: + result = await db_session.execute( + select(SharedMemory).where(SharedMemory.search_space_id == search_space_id) + ) + return len(result.scalars().all()) + + +async def delete_oldest_shared_memory( + db_session: AsyncSession, + search_space_id: int, +) -> None: + result = await db_session.execute( + select(SharedMemory) + .where(SharedMemory.search_space_id == search_space_id) + .order_by(SharedMemory.updated_at.asc()) + .limit(1) + ) + oldest = result.scalars().first() + if oldest: + await db_session.delete(oldest) + await db_session.commit() diff --git a/surfsense_backend/app/db.py b/surfsense_backend/app/db.py index 7caa0046d..a6c553bff 100644 --- a/surfsense_backend/app/db.py +++ b/surfsense_backend/app/db.py @@ -801,9 +801,8 @@ class MemoryCategory(str, Enum): class UserMemory(BaseModel, TimestampMixin): """ - Stores facts, preferences, and context about users for personalized AI responses. - Similar to Claude's memory feature - enables the AI to remember user information - across conversations. + Private memory: facts, preferences, context per user per search space. + Used only for private chats (not shared/team chats). """ __tablename__ = "user_memories"