- New GraphView.vue: lightweight page at /graph/<id> that resolves a
graph_id back to its owning project_id via /api/graph/project/list,
then router-replaces to /process/<projectId> so the existing project
page handles the full graph visualisation.
- HistoryDatabase.vue: fetch /api/simulation/history and /api/graph/project/list
in parallel and merge by project_id (sims win on conflict, project list
fills the gap so home history is non-empty for users who only built
graphs). Newest first by created_at.
- frontend/src/api/graph.js: add listProjects(limit) wrapper.
- frontend/src/router/index.js: register /graph/:id route, props: true.
- frontend/src/api/index.js: switch VITE_API_BASE_URL fallback from ||
to ?? so an empty string is honoured (Vite uses empty to mean 'same
origin', letting Traefik reverse-proxy /api/* to the backend container
without an absolute baseURL).
- Dockerfile: VITE_API_BASE_URL="" baked in at build time (default).
- graphiti_service.py: strip lowercase <think> / <antmlthinking> reasoning
blocks in addition to <think> (M2.7 vs M3/Qwen emit different
reasoning tags); accept M2.7's 'entity_types' plural list shape in
_normalize_extraction_payload.