diff --git a/src/dashboard/routes/memory.py b/src/dashboard/routes/memory.py index 97ce6d7c..7ed0e64f 100644 --- a/src/dashboard/routes/memory.py +++ b/src/dashboard/routes/memory.py @@ -120,3 +120,39 @@ async def delete_fact(fact_id: str): if not ok: raise HTTPException(404, "Fact not found") return {"success": True, "id": fact_id} + +@router.get("/visualize", response_class=HTMLResponse) +async def memory_visualize(request: Request, query: str | None = None): + """Visualize related memories using D3.js.""" + results = [] + if query: + results = search_memories(query=query, limit=50) + else: + results = recall_personal_facts_with_ids()[:50] + + # Format for D3 (nodes and links) + nodes = [] + links = [] + + # Simple heuristic: link memories that share keywords or context + for i, res in enumerate(results): + nodes.append({ + "id": i, + "text": res.get("content", "")[:50] + "...", + "type": res.get("context_type", "general") + }) + + # Link to previous node for a simple chain, or more complex logic + if i > 0: + links.append({"source": i-1, "target": i}) + + return templates.TemplateResponse( + request, + "memory_graph.html", + { + "page_title": "Memory Visualization", + "nodes": nodes, + "links": links, + "query": query + }, + ) diff --git a/src/dashboard/templates/memory_graph.html b/src/dashboard/templates/memory_graph.html new file mode 100644 index 00000000..0691c01b --- /dev/null +++ b/src/dashboard/templates/memory_graph.html @@ -0,0 +1,103 @@ + +{% extends "base.html" %} + +{% block content %} +