diff --git a/src/dashboard/routes/memory.py b/src/dashboard/routes/memory.py index 97ce6d7c..7ac4e5ed 100644 --- a/src/dashboard/routes/memory.py +++ b/src/dashboard/routes/memory.py @@ -16,6 +16,40 @@ from timmy.memory_system import ( router = APIRouter(prefix="/memory", tags=["memory"]) +@router.get("/graph_data") +async def memory_graph_data(): + """Return memory nodes and links for D3 visualization.""" + from timmy.memory_system import get_connection + import json + + nodes = [] + links = [] + + with get_connection() as conn: + rows = conn.execute( + "SELECT id, content, memory_type, session_id, agent_id, embedding FROM memories ORDER BY created_at DESC LIMIT 100" + ).fetchall() + + for row in rows: + nodes.append({ + "id": row["id"], + "content": row["content"][:50] + "..." if len(row["content"]) > 50 else row["content"], + "type": row["memory_type"], + "session": row["session_id"], + "agent": row["agent_id"] + }) + + # Create links based on session_id + for i in range(len(nodes)): + for j in range(i + 1, len(nodes)): + if nodes[i]["session"] and nodes[i]["session"] == nodes[j]["session"]: + links.append({"source": nodes[i]["id"], "target": nodes[j]["id"], "value": 1, "type": "session"}) + elif nodes[i]["agent"] and nodes[i]["agent"] == nodes[j]["agent"]: + links.append({"source": nodes[i]["id"], "target": nodes[j]["id"], "value": 0.5, "type": "agent"}) + + return {"nodes": nodes, "links": links} + + @router.get("", response_class=HTMLResponse) async def memory_page( request: Request, diff --git a/src/dashboard/templates/memory.html b/src/dashboard/templates/memory.html index 1c2822aa..857a3d5f 100644 --- a/src/dashboard/templates/memory.html +++ b/src/dashboard/templates/memory.html @@ -31,7 +31,19 @@ {% endfor %} - +