From 1b745623d57f280d9de8a2d70beb64ee058e2867 Mon Sep 17 00:00:00 2001 From: Mario Aldayuz Date: Sat, 13 Jun 2026 08:24:24 -0400 Subject: [PATCH 1/2] chore(cursor): bump extension to v0.1.5 Version bump for the upstream PR carrying the Cursor extension dashboard fixes (loader script paths, real KPIs, graph centering, vendored d3) and the memory-recall hook instrumentation. Rebuilds the packaged vsix so the tracked artifact matches the manifest version. --- ...x => hivemind-cursor-extension-0.1.5.vsix} | Bin 136698 -> 136697 bytes harnesses/cursor/extension/package-lock.json | 4 ++-- harnesses/cursor/extension/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename harnesses/cursor/extension/{hivemind-cursor-extension-0.1.4.vsix => hivemind-cursor-extension-0.1.5.vsix} (97%) diff --git a/harnesses/cursor/extension/hivemind-cursor-extension-0.1.4.vsix b/harnesses/cursor/extension/hivemind-cursor-extension-0.1.5.vsix similarity index 97% rename from harnesses/cursor/extension/hivemind-cursor-extension-0.1.4.vsix rename to harnesses/cursor/extension/hivemind-cursor-extension-0.1.5.vsix index 2f0cf1be3545b395fd51979a5f7d05eb95047c69..d023c9c296a59e3318ee6649ff4f76ff174146a5 100644 GIT binary patch delta 1591 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 diff --git a/harnesses/cursor/extension/package-lock.json b/harnesses/cursor/extension/package-lock.json index 5a2ad990..4c7c73be 100644 --- a/harnesses/cursor/extension/package-lock.json +++ b/harnesses/cursor/extension/package-lock.json @@ -1,12 +1,12 @@ { "name": "hivemind-cursor-extension", - "version": "0.1.4", + "version": "0.1.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "hivemind-cursor-extension", - "version": "0.1.4", + "version": "0.1.5", "devDependencies": { "@types/node": "^20.11.0", "@types/vscode": "^1.85.0", diff --git a/harnesses/cursor/extension/package.json b/harnesses/cursor/extension/package.json index 34454cda..abb14f81 100644 --- a/harnesses/cursor/extension/package.json +++ b/harnesses/cursor/extension/package.json @@ -2,7 +2,7 @@ "name": "hivemind-cursor-extension", "displayName": "Hivemind for Cursor", "description": "Shared memory, health checks, dashboard, and codebase graph inside Cursor", - "version": "0.1.4", + "version": "0.1.5", "publisher": "deeplake", "engines": { "vscode": "^1.85.0" From f39f8d38c11a4738d527290b969ed4596f11e7cd Mon Sep 17 00:00:00 2001 From: Mario Aldayuz Date: Sat, 13 Jun 2026 19:23:56 -0400 Subject: [PATCH 2/2] fix(search): fall back to lexical recall when semantic search fails grepBothTables ran a single semantic query and let it throw. When the memory table has inconsistent summary_embedding dimensions the Deeplake vector op 500s ("Can't stack arrays with different dimensions"), so every semantic recall failed: the Cursor pre-tool-use fast path caught the throw and fell through, returning no memory to the agent (and recording no recall for the dashboard KPIs). Now grepBothTables retries once with lexical search when the semantic query throws, so recall still resolves and auto-recovers when the embedding column is re-indexed. --- src/shell/grep-core.ts | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/shell/grep-core.ts b/src/shell/grep-core.ts index cf7e116e..3a169107 100644 --- a/src/shell/grep-core.ts +++ b/src/shell/grep-core.ts @@ -633,10 +633,30 @@ export async function grepBothTables( queryEmbedding?: number[] | null, ): Promise { const meta = { truncated: false }; - const rows = await searchDeeplakeTables(api, memoryTable, sessionsTable, { - ...buildGrepSearchOptions(params, targetPath), - queryEmbedding, - }, meta); + const baseOptions = buildGrepSearchOptions(params, targetPath); + let usedEmbedding = queryEmbedding ?? null; + let rows: ContentRow[]; + try { + rows = await searchDeeplakeTables(api, memoryTable, sessionsTable, { + ...baseOptions, + queryEmbedding, + }, meta); + } catch (e) { + // Semantic search can fail at the DB level (e.g. inconsistent + // summary_embedding dimensions in the memory table -> "Can't stack + // arrays with different dimensions"). Rather than give up on recall, + // retry once with lexical search so memory still resolves. Auto-recovers + // when the embedding column is re-indexed. + if (queryEmbedding && queryEmbedding.length > 0) { + usedEmbedding = null; + rows = await searchDeeplakeTables(api, memoryTable, sessionsTable, { + ...baseOptions, + queryEmbedding: null, + }, meta); + } else { + throw e; + } + } // Defensive path dedup — memory and sessions tables use disjoint path // prefixes in every schema we ship (/summaries/… vs /sessions/…), so the // overlap is theoretical, but we dedupe to match grep-interceptor.ts and @@ -651,7 +671,7 @@ export async function grepBothTables( // pattern (the whole point of semantic). Return every non-empty normalized // line from the top-K rows, prefixed with the path so Claude can follow up // with Read. The downstream output-cap keeps the response bounded. - if (queryEmbedding && queryEmbedding.length > 0) { + if (usedEmbedding && usedEmbedding.length > 0) { const emitAllLines = process.env.HIVEMIND_SEMANTIC_EMIT_ALL !== "false"; if (emitAllLines) { const lines: string[] = [];