diff --git a/features/dashboard.py b/features/dashboard.py index 236d619c..8595e04a 100644 --- a/features/dashboard.py +++ b/features/dashboard.py @@ -157,24 +157,28 @@ class Dashboard: - def __init__(self, data_dir: Optional[str] = None): + def __init__(self, mm=None, data_dir: Optional[str] = None): self.data_dir = Path(data_dir or str(Path.home() / ".mcp-ariel-memory")) + if mm is None: + import sys - async def get_stats(self, user_id: str = "default") -> dict[str, Any]: - import sys + sys.path.insert(0, str(Path(__file__).parent.parent)) + from core import MemoryManager + from shared.cache import MemoryCache + + mm = MemoryManager(cache=MemoryCache()) + self.mm = mm - sys.path.insert(0, str(Path(__file__).parent.parent)) - from core import memory_manager + async def get_stats(self, user_id: str = "default") -> dict[str, Any]: from graph.epistemic import EpistemicGraph from wiki.file_wiki import FileWiki - mm = memory_manager uw = FileWiki(layer="user") aw = FileWiki(layer="agent") ug = EpistemicGraph(layer="user") - um = mm.user_memory(user_id) - am = mm.agent_memory(user_id) + um = self.mm.user_memory(user_id) + am = self.mm.agent_memory(user_id) return { "l1_buffer": um.l1.size(), @@ -191,27 +195,19 @@ async def get_stats(self, user_id: str = "default") -> dict[str, Any]: } async def get_user_facts(self, user_id: str = "default") -> list: - from core import memory_manager - - facts = await memory_manager.user_memory(user_id).l4.get_all(user_id, limit=50) + facts = await self.mm.user_memory(user_id).l4.get_all(user_id, limit=50) return [{"key": f.key, "value": f.value, "importance": f.importance} for f in facts] async def get_agent_facts(self, user_id: str = "default") -> list: - from core import memory_manager - - facts = await memory_manager.agent_memory(user_id).l4.get_all(user_id, limit=50) + facts = await self.mm.agent_memory(user_id).l4.get_all(user_id, limit=50) return [{"key": f.key, "value": f.value, "importance": f.importance} for f in facts] async def get_user_episodes(self, user_id: str = "default") -> list: - from core import memory_manager - - eps = await memory_manager.user_memory(user_id).l3.get_episodes(user_id, limit=20) + eps = await self.mm.user_memory(user_id).l3.get_episodes(user_id, limit=20) return [{"summary": e.summary, "weight": e.emotional_weight, "tags": e.tags} for e in eps] async def get_agent_episodes(self, user_id: str = "default") -> list: - from core import memory_manager - - eps = await memory_manager.agent_memory(user_id).l3.get_episodes(user_id, limit=20) + eps = await self.mm.agent_memory(user_id).l3.get_episodes(user_id, limit=20) return [{"summary": e.summary, "weight": e.emotional_weight, "tags": e.tags} for e in eps] async def get_audit(self, limit: int = 20) -> list: diff --git a/mcp_server/server.py b/mcp_server/server.py index 596efb63..ca7a0ddf 100644 --- a/mcp_server/server.py +++ b/mcp_server/server.py @@ -151,11 +151,14 @@ def _run_with_dashboard(host: str, port: int): from features.rate_limiting import ConnectionLimiter, RateLimiter from shared.metrics import metrics as m - dashboard = Dashboard() + ctx = AppContext() + dashboard = Dashboard(mm=ctx.mm) api_rate_limiter = RateLimiter() ws_limiter = ConnectionLimiter() def check_auth(request) -> bool: + if os.environ.get("MCP_AUTH_DISABLED"): + return True auth_enabled = config.get("auth", "bearer_token_enabled", default=True) if not auth_enabled: return True @@ -191,7 +194,7 @@ async def api_stats(request): if not await check_rate_limit(request): return JSONResponse({"error": "Rate limit exceeded"}, status_code=429) user_id = request.query_params.get("user_id", "default") - return JSONResponse(dashboard.get_stats(user_id)) + return JSONResponse(await dashboard.get_stats(user_id)) async def api_user_facts(request): if not check_auth(request): @@ -199,7 +202,7 @@ async def api_user_facts(request): if not await check_rate_limit(request): return JSONResponse({"error": "Rate limit exceeded"}, status_code=429) user_id = request.query_params.get("user_id", "default") - return JSONResponse(dashboard.get_user_facts(user_id)) + return JSONResponse(await dashboard.get_user_facts(user_id)) async def api_agent_facts(request): if not check_auth(request): @@ -207,7 +210,7 @@ async def api_agent_facts(request): if not await check_rate_limit(request): return JSONResponse({"error": "Rate limit exceeded"}, status_code=429) user_id = request.query_params.get("user_id", "default") - return JSONResponse(dashboard.get_agent_facts(user_id)) + return JSONResponse(await dashboard.get_agent_facts(user_id)) async def api_user_episodes(request): if not check_auth(request): @@ -215,7 +218,7 @@ async def api_user_episodes(request): if not await check_rate_limit(request): return JSONResponse({"error": "Rate limit exceeded"}, status_code=429) user_id = request.query_params.get("user_id", "default") - return JSONResponse(dashboard.get_user_episodes(user_id)) + return JSONResponse(await dashboard.get_user_episodes(user_id)) async def api_agent_episodes(request): if not check_auth(request): @@ -223,14 +226,14 @@ async def api_agent_episodes(request): if not await check_rate_limit(request): return JSONResponse({"error": "Rate limit exceeded"}, status_code=429) user_id = request.query_params.get("user_id", "default") - return JSONResponse(dashboard.get_agent_episodes(user_id)) + return JSONResponse(await dashboard.get_agent_episodes(user_id)) async def api_audit(request): if not check_auth(request): return JSONResponse({"error": "Unauthorized"}, status_code=401) if not await check_rate_limit(request): return JSONResponse({"error": "Rate limit exceeded"}, status_code=429) - return JSONResponse(dashboard.get_audit()) + return JSONResponse(await dashboard.get_audit()) async def metrics_endpoint(request): if not check_auth(request):