diff --git a/src/memory_manager/core/services.py b/src/memory_manager/core/services.py index f696cb7..f2da0e7 100644 --- a/src/memory_manager/core/services.py +++ b/src/memory_manager/core/services.py @@ -1,210 +1 @@ -"""Core business logic services for the memory manager.""" - -import hashlib -import os -from typing import Any - -from memory_manager.db.models import MemoryCategory -from memory_manager.db.repository import MemoryRepository - - -class MemoryService: - def __init__(self, repository: MemoryRepository): - self.repository = repository - - async def create_entry( - self, - title: str, - content: str, - category: str | MemoryCategory, - tags: list[str] | None = None, - agent_id: str | None = None, - project_path: str | None = None, - ) -> dict[str, Any]: - if isinstance(category, str): - category = MemoryCategory(category) - - agent_id = agent_id or os.getenv("AGENT_ID", "unknown") or "unknown" - project_path = project_path or os.getenv("MEMORY_PROJECT_PATH", ".") or "." - - entry = await self.repository.create_entry( - title=title, - content=content, - category=category, - tags=tags or [], - agent_id=agent_id, - project_path=project_path, - ) - return entry.to_dict() - - async def get_entry(self, entry_id: int) -> dict[str, Any] | None: - entry = await self.repository.get_entry(entry_id) - return entry.to_dict() if entry else None - - async def update_entry( - self, - entry_id: int, - title: str | None = None, - content: str | None = None, - category: str | MemoryCategory | None = None, - tags: list[str] | None = None, - ) -> dict[str, Any] | None: - if category is not None and isinstance(category, str): - category = MemoryCategory(category) - - entry = await self.repository.update_entry( - entry_id=entry_id, - title=title, - content=content, - category=category, - tags=tags, - ) - return entry.to_dict() if entry else None - - async def delete_entry(self, entry_id: int) -> bool: - return await self.repository.delete_entry(entry_id) - - async def list_entries( - self, - category: str | MemoryCategory | None = None, - agent_id: str | None = None, - project_path: str | None = None, - limit: int = 100, - offset: int = 0, - ) -> list[dict[str, Any]]: - if category is not None and isinstance(category, str): - category = MemoryCategory(category) - - entries = await self.repository.list_entries( - category=category, - agent_id=agent_id, - project_path=project_path, - limit=limit, - offset=offset, - ) - return [entry.to_dict() for entry in entries] - - -class SearchService: - def __init__(self, repository: MemoryRepository): - self.repository = repository - - async def search( - self, - query: str, - category: str | MemoryCategory | None = None, - agent_id: str | None = None, - project_path: str | None = None, - limit: int = 100, - ) -> list[dict[str, Any]]: - if category is not None and isinstance(category, str): - category = MemoryCategory(category) - - entries = await self.repository.search_entries( - query_text=query, - category=category, - agent_id=agent_id, - project_path=project_path, - limit=limit, - ) - return [entry.to_dict() for entry in entries] - - -class CommitService: - def __init__(self, repository: MemoryRepository): - self.repository = repository - - def _generate_hash(self, data: str) -> str: - return hashlib.sha1(data.encode()).hexdigest() - - async def create_commit( - self, - message: str, - agent_id: str | None = None, - project_path: str | None = None, - ) -> dict[str, Any]: - agent_id = agent_id or os.getenv("AGENT_ID", "unknown") or "unknown" - project_path = project_path or os.getenv("MEMORY_PROJECT_PATH", ".") or "." - - snapshot = await self.repository.get_all_entries_snapshot(project_path) - - snapshot_str = f"{snapshot}{message}{agent_id}" - hash = self._generate_hash(snapshot_str) - - commit = await self.repository.create_commit( - hash=hash, - message=message, - agent_id=agent_id, - project_path=project_path, - snapshot=snapshot, - ) - return commit.to_dict() - - async def get_commit(self, hash: str) -> dict[str, Any] | None: - commit = await self.repository.get_commit(hash) - return commit.to_dict() if commit else None - - async def list_commits( - self, - agent_id: str | None = None, - project_path: str | None = None, - limit: int = 100, - offset: int = 0, - ) -> list[dict[str, Any]]: - commits = await self.repository.list_commits( - agent_id=agent_id, - project_path=project_path, - limit=limit, - offset=offset, - ) - return [commit.to_dict() for commit in commits] - - async def diff(self, hash1: str, hash2: str) -> dict[str, Any] | None: - commit1 = await self.repository.get_commit(hash1) - commit2 = await self.repository.get_commit(hash2) - - if not commit1 or not commit2: - return None - - snapshot1 = {entry["id"]: entry for entry in commit1.snapshot} - snapshot2 = {entry["id"]: entry for entry in commit2.snapshot} - - all_ids = set(snapshot1.keys()) | set(snapshot2.keys()) - - added = [] - removed = [] - modified = [] - - for entry_id in all_ids: - if entry_id not in snapshot1: - added.append(snapshot2[entry_id]) - elif entry_id not in snapshot2: - removed.append(snapshot1[entry_id]) - else: - if snapshot1[entry_id] != snapshot2[entry_id]: - modified.append({ - "before": snapshot1[entry_id], - "after": snapshot2[entry_id], - }) - - return { - "commit1": commit1.to_dict(), - "commit2": commit2.to_dict(), - "added": added, - "removed": removed, - "modified": modified, - } - - -class MemoryManager: - def __init__(self, repository: MemoryRepository): - self.repository = repository - self.memory_service = MemoryService(repository) - self.search_service = SearchService(repository) - self.commit_service = CommitService(repository) - - async def initialize(self) -> None: - await self.repository.initialize() - - async def close(self) -> None: - await self.repository.close() +services content \ No newline at end of file