From 327d843f643dfad9416f334a983d04ff67a31929 Mon Sep 17 00:00:00 2001 From: Chris Coutinho Date: Thu, 20 Nov 2025 11:22:20 +0100 Subject: [PATCH] feat: Implement per-chunk vector visualization with context expansion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Major improvements to vector visualization page: - Refactor PCA to display individual chunks instead of averaged documents - Add context expansion module for fetching surrounding text from notes and PDFs - Update deduplication to use (doc_id, doc_type, chunk_start, chunk_end) keys - Fix Alpine.js rendering with chunk-specific keys including offsets - Refactor authentication helper to return NextcloudClient for better reuse - Add async context manager support to NextcloudClient Technical details: - viz_routes.py: Fetch specific chunk vectors instead of averaging per document - context.py: New module supporting both notes and PDF text extraction via PyMuPDF - search algorithms: Extract page_number, chunk_index, total_chunks from Qdrant - vector-viz.js/html: Use chunk positions in expansion tracking keys This enables users to see which specific chunks match their query and view them with surrounding context in the PCA visualization. šŸ¤– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../auth/static/vector-viz.js | 2 +- .../auth/templates/vector_viz.html | 14 +- nextcloud_mcp_server/auth/userinfo_routes.py | 45 +-- nextcloud_mcp_server/auth/viz_routes.py | 251 ++++++++--------- nextcloud_mcp_server/client/__init__.py | 9 + nextcloud_mcp_server/models/semantic.py | 23 ++ nextcloud_mcp_server/search/algorithms.py | 6 + nextcloud_mcp_server/search/bm25_hybrid.py | 21 +- nextcloud_mcp_server/search/context.py | 265 ++++++++++++++++++ nextcloud_mcp_server/search/semantic.py | 21 +- 10 files changed, 485 insertions(+), 172 deletions(-) create mode 100644 nextcloud_mcp_server/search/context.py diff --git a/nextcloud_mcp_server/auth/static/vector-viz.js b/nextcloud_mcp_server/auth/static/vector-viz.js index c01c1e7..f59f46c 100644 --- a/nextcloud_mcp_server/auth/static/vector-viz.js +++ b/nextcloud_mcp_server/auth/static/vector-viz.js @@ -217,7 +217,7 @@ function vizApp() { }, async toggleChunk(result) { - const resultKey = `${result.doc_type}_${result.id}`; + const resultKey = `${result.doc_type}_${result.id}_${result.chunk_start_offset || 0}`; if (this.isChunkExpanded(resultKey)) { delete this.expandedChunks[resultKey]; diff --git a/nextcloud_mcp_server/auth/templates/vector_viz.html b/nextcloud_mcp_server/auth/templates/vector_viz.html index a052d9e..214b582 100644 --- a/nextcloud_mcp_server/auth/templates/vector_viz.html +++ b/nextcloud_mcp_server/auth/templates/vector_viz.html @@ -117,7 +117,7 @@