77 lines
2.7 KiB
Python
77 lines
2.7 KiB
Python
from __future__ import annotations
|
|
|
|
import contextlib
|
|
import shutil
|
|
import unittest
|
|
import uuid
|
|
from pathlib import Path
|
|
|
|
from opc.core.models import Task
|
|
from opc.database.store import OPCStore
|
|
from opc.layer1_perception.context_assembler import ContextAssembler
|
|
from opc.layer5_memory.memory_manager import MemoryManager
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def _workspace_tempdir() -> Path:
|
|
base = Path.cwd() / ".tmp-test" / f"focused-memory-{uuid.uuid4().hex}"
|
|
base.mkdir(parents=True, exist_ok=True)
|
|
try:
|
|
yield base
|
|
finally:
|
|
shutil.rmtree(base, ignore_errors=True)
|
|
|
|
|
|
class FocusedMemoryContextTests(unittest.IsolatedAsyncioTestCase):
|
|
async def test_focused_memory_context_prefers_relevant_sections(self) -> None:
|
|
with _workspace_tempdir() as root:
|
|
store = OPCStore(root / "tasks.db")
|
|
await store.initialize()
|
|
memory = MemoryManager(root, "proj1", store=store)
|
|
memory.save_memory(
|
|
"# Global\n\n"
|
|
"## Rust Build\n"
|
|
"- Use cargo build for Rust projects.\n\n"
|
|
"## Database Migrations\n"
|
|
"- Always use migrations for schema changes.\n",
|
|
project=False,
|
|
)
|
|
memory.save_memory(
|
|
"# Project\n\n"
|
|
"## Search Tooling\n"
|
|
"- Prefer rg for code search.\n\n"
|
|
"## Browser Checks\n"
|
|
"- Use Playwright for browser verification.\n",
|
|
project=True,
|
|
)
|
|
session_id = "session-focus"
|
|
await memory.ensure_session(session_id, project_id="proj1")
|
|
await memory.update_session_summary(session_id, "Remember the current runtime summary.")
|
|
|
|
focused = await memory.build_focused_memory_context(
|
|
query="improve code search with rg",
|
|
project_id="proj1",
|
|
session_id=session_id,
|
|
)
|
|
self.assertIn("Focused Project Memory", focused)
|
|
self.assertIn("Search Tooling", focused)
|
|
self.assertNotIn("Browser Checks", focused)
|
|
self.assertIn("## Session Memory", focused)
|
|
|
|
assembler = ContextAssembler(memory)
|
|
core = await assembler.build_core_context(
|
|
Task(
|
|
title="Search fix",
|
|
description="Use rg to inspect the repository",
|
|
project_id="proj1",
|
|
session_id=session_id,
|
|
)
|
|
)
|
|
self.assertIn("Search Tooling", core)
|
|
self.assertNotIn("Browser Checks", core)
|
|
await store.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|