From 62f4bb99102fcd332139a2331a36ff34e381acdd Mon Sep 17 00:00:00 2001 From: Stahldavid Date: Thu, 24 Sep 2026 15:40:51 +0300 Subject: [PATCH 1/2] fix: atomically activate individual watcher mutations --- .changeset/atomic-watcher-updates.md | 7 +++ packages/cli/README.md | 2 +- packages/core/src/semantic/indexer.test.ts | 39 +++++++++++- packages/core/src/semantic/indexer.ts | 69 +++++++++++----------- 4 files changed, 80 insertions(+), 37 deletions(-) create mode 100644 .changeset/atomic-watcher-updates.md diff --git a/.changeset/atomic-watcher-updates.md b/.changeset/atomic-watcher-updates.md new file mode 100644 index 0000000..727df5b --- /dev/null +++ b/.changeset/atomic-watcher-updates.md @@ -0,0 +1,7 @@ +--- +"@sensegrep/core": patch +"@sensegrep/cli": patch +"@sensegrep/mcp": patch +--- + +Extend staged, atomic index activation to individual watched file updates and removals, including files that become ignored or empty. Validate the staged chunk count before committing metadata and leave the active generation untouched if persistence or metadata writing fails. diff --git a/packages/cli/README.md b/packages/cli/README.md index 2a5974c..7da0a24 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -58,4 +58,4 @@ Search defaults to one result per file; use `--max-per-file 2` for more snippets Duplicate JSON respects `--limit`. `summary.outputTruncated` means more groups were found than emitted; raise `--limit` to expose them. A continuation cursor advances the candidate scan, not output pagination. Candidate caps still require raising `--max-candidates` for full coverage. -Incremental `index --no-watch` stages updates before atomically activating the new snapshot, preserving the old index if the process is interrupted. No-change runs avoid copying vectors. This protection does not yet extend to individual watcher updates. +Incremental `index --no-watch` stages updates before atomically activating the new snapshot, preserving the old index if the process is interrupted. No-change runs avoid copying vectors. Since 1.17.2 this protection also covers individual watcher updates and removals, including files that become non-indexable. diff --git a/packages/core/src/semantic/indexer.test.ts b/packages/core/src/semantic/indexer.test.ts index d519d4d..b7bcf76 100644 --- a/packages/core/src/semantic/indexer.test.ts +++ b/packages/core/src/semantic/indexer.test.ts @@ -310,7 +310,7 @@ describe("Indexer incremental updates", () => { expect(embedDocumentsReusingFile).toHaveBeenCalledTimes(1) expect(embedDocuments).toHaveBeenCalledTimes(1) - expect(replaceFileDocuments).toHaveBeenCalledWith({}, "src/a.ts", expect.any(Array)) + expect(replaceFileDocuments).toHaveBeenCalledWith({ staging: true }, "src/a.ts", expect.any(Array)) expect(writeIndexMeta).toHaveBeenCalledTimes(1) expect(writeIndexMeta.mock.calls[0][1].files["src/a.ts"].collapsibleRegions).toEqual(regions) expect(writeIndexMeta.mock.calls[0][1].chunking).toEqual(testChunkingSignature) @@ -326,12 +326,13 @@ describe("Indexer incremental updates", () => { }) it("removes generated files from index metadata during file updates", async () => { + getStats.mockResolvedValue({ count: 0 }) await writeFile(path.join(TEST_DIR, "src/a.ts"), "x".repeat(60_000)) const { Indexer } = await import("./indexer.js") await Indexer.updateFile("src/a.ts") - expect(deleteByFile).toHaveBeenCalledWith({}, "src/a.ts") + expect(deleteByFile).toHaveBeenCalledWith({ staging: true }, "src/a.ts") expect(embedDocuments).not.toHaveBeenCalled() expect(embedDocumentsReusingFile).not.toHaveBeenCalled() expect(writeIndexMeta).toHaveBeenCalledTimes(1) @@ -339,6 +340,7 @@ describe("Indexer incremental updates", () => { }) it("removes stale metadata when a watched file is no longer indexable", async () => { + getStats.mockResolvedValue({ count: 0 }) readIndexMeta.mockResolvedValueOnce({ version: 1, root: TEST_DIR, @@ -362,7 +364,7 @@ describe("Indexer incremental updates", () => { await Indexer.updateFile("src/a.ts.map") - expect(deleteByFile).toHaveBeenCalledWith({}, "src/a.ts.map") + expect(deleteByFile).toHaveBeenCalledWith({ staging: true }, "src/a.ts.map") expect(embedDocuments).not.toHaveBeenCalled() expect(embedDocumentsReusingFile).not.toHaveBeenCalled() expect(getConfig).not.toHaveBeenCalled() @@ -370,6 +372,37 @@ describe("Indexer incremental updates", () => { expect(writeIndexMeta.mock.calls[0][1].files["src/a.ts.map"]).toBeUndefined() }) + it.each(["update", "remove"])("preserves active watcher metadata when %s persistence fails", async (operation) => { + const meta = await readIndexMeta() + const original = structuredClone(meta) + if (operation === "update") replaceFileDocuments.mockRejectedValueOnce(new Error("disk failure")) + else deleteByFile.mockRejectedValueOnce(new Error("disk failure")) + const { Indexer } = await import("./indexer.js") + await expect(operation === "update" ? Indexer.updateFile("src/a.ts") : Indexer.removeFile("src/a.ts")).rejects.toThrow("disk failure") + expect(meta).toEqual(original) + expect(writeIndexMeta).not.toHaveBeenCalled() + expect(dropCollectionTable).toHaveBeenCalledWith(TEST_DIR, "chunks_staging") + }) + + it("does not activate watcher changes with inconsistent staged counts", async () => { + getStats.mockResolvedValue({ count: 999 }) + const { Indexer } = await import("./indexer.js") + await expect(Indexer.updateFile("src/a.ts")).rejects.toThrow("chunk mismatch") + expect(writeIndexMeta).not.toHaveBeenCalled() + expect(dropCollectionTable).toHaveBeenCalled() + }) + + it("discards watcher staging when the metadata commit fails", async () => { + writeIndexMeta.mockRejectedValueOnce(new Error("metadata failure")) + const meta = await readIndexMeta() + const original = structuredClone(meta) + const { Indexer } = await import("./indexer.js") + await expect(Indexer.updateFile("src/a.ts")).rejects.toThrow("metadata failure") + expect(meta).toEqual(original) + expect(clearProjectCache).not.toHaveBeenCalled() + expect(dropCollectionTable).toHaveBeenCalled() + }) + it("serializes concurrent indexing for the same project", async () => { let activeReads = 0 let maxActiveReads = 0 diff --git a/packages/core/src/semantic/indexer.ts b/packages/core/src/semantic/indexer.ts index 7fed5f1..3335bc3 100644 --- a/packages/core/src/semantic/indexer.ts +++ b/packages/core/src/semantic/indexer.ts @@ -566,31 +566,38 @@ export namespace Indexer { return { count: documents.length, chunkHashes: documents.map((d) => d.hash) } } - async function deleteFileFromIndexAndMeta( + async function commitWatchedMutation( collection: Awaited>, - filePath: string, + meta: VectorStore.IndexMeta, + files: VectorStore.IndexMeta["files"], + mutate: (target: Awaited>) => Promise, ): Promise { - await VectorStore.deleteByFile(collection, filePath) - const meta = await VectorStore.readIndexMeta(Instance.directory) - if (meta?.files) { - delete meta.files[filePath] - meta.updatedAt = Date.now() - await VectorStore.writeIndexMeta(Instance.directory, meta) + const staging = await VectorStore.createStagingCollection(Instance.directory, meta.embeddings.dimension) + let activated = false + try { + await VectorStore.copyCollection(collection, staging.collection) + await mutate(staging.collection) + const expected = Object.values(files).reduce((sum, file) => sum + (file.chunks?.length ?? 0), 0) + const actual = (await VectorStore.getStats(staging.collection)).count + if (actual !== expected) throw new Error(`Staged watcher index chunk mismatch: expected ${expected}, persisted ${actual}`) + await VectorStore.writeIndexMeta(Instance.directory, { + ...meta, files, tableName: staging.tableName, updatedAt: Date.now(), + }) + activated = true + VectorStore.clearProjectCache(Instance.directory) + await VectorStore.cleanupInactiveTables(Instance.directory, staging.tableName) + } finally { + if (!activated) await VectorStore.dropCollectionTable(Instance.directory, staging.tableName).catch(() => {}) } } async function deleteIndexedFileIfPresent(filePath: string): Promise { const meta = await VectorStore.readIndexMeta(Instance.directory) - if (!meta?.files || !meta.files[filePath]) return - - if (await VectorStore.hasCollection(Instance.directory)) { - const collection = await VectorStore.getCollectionUnsafe(Instance.directory, meta.embeddings?.dimension) - await VectorStore.deleteByFile(collection, filePath) - } - - delete meta.files[filePath] - meta.updatedAt = Date.now() - await VectorStore.writeIndexMeta(Instance.directory, meta) + if (!meta?.files?.[filePath]) return + const collection = await VectorStore.getCollectionUnsafe(Instance.directory, meta.embeddings.dimension) + const files = { ...meta.files } + delete files[filePath] + await commitWatchedMutation(collection, meta, files, (target) => VectorStore.deleteByFile(target, filePath)) } async function buildDocuments(input: { @@ -1496,7 +1503,8 @@ export namespace Indexer { } const existingMeta = await VectorStore.readIndexMeta(Instance.directory) - if (existingMeta && !sameChunkingSignature(existingMeta.chunking, getChunkingSignature(Embeddings.getConfig()))) { + if (!existingMeta) throw new Error("No index metadata; run sensegrep index --no-watch before watched updates") + if (!sameChunkingSignature(existingMeta.chunking, getChunkingSignature(Embeddings.getConfig()))) { throw new Error("Chunking policy changed; run sensegrep index --no-watch to rebuild before applying watched updates") } const { collapsibleRegions, documents } = await analyzeFile(filePath, content) @@ -1513,20 +1521,15 @@ export namespace Indexer { metadata, })) const prepared = await VectorStore.embedDocumentsReusingFile(collection, filePath, docsToAdd) - await VectorStore.replaceFileDocuments(collection, filePath, prepared.rows) - const meta = await VectorStore.readIndexMeta(Instance.directory) - if (meta?.files) { - meta.chunking = getChunkingSignature(Embeddings.getConfig()) - meta.files[filePath] = { - size: stat.size, - mtimeMs: stat.mtimeMs, - hash: hashContent(content), - chunks: documents.map((d) => d.hash), - collapsibleRegions, - } - meta.updatedAt = Date.now() - await VectorStore.writeIndexMeta(Instance.directory, meta) - } + const nextFiles = { ...existingMeta.files, [filePath]: { + size: stat.size, + mtimeMs: stat.mtimeMs, + hash: hashContent(content), + chunks: documents.map((d) => d.hash), + collapsibleRegions, + } } + await commitWatchedMutation(collection, existingMeta, nextFiles, + (target) => VectorStore.replaceFileDocuments(target, filePath, prepared.rows)) } export async function updateFile(filePath: string): Promise { From 55975283d6fd51f39859aac6a9b5a668cca22d39 Mon Sep 17 00:00:00 2001 From: Stahldavid Date: Thu, 24 Sep 2026 15:41:05 +0300 Subject: [PATCH 2/2] chore: release 1.17.2 --- .changeset/atomic-watcher-updates.md | 7 ------- .claude-plugin/marketplace.json | 2 +- .cursor-plugin/marketplace.json | 2 +- package-lock.json | 12 ++++++------ packages/cli/CHANGELOG.md | 9 +++++++++ packages/cli/package.json | 4 ++-- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/mcp/CHANGELOG.md | 9 +++++++++ packages/mcp/package.json | 4 ++-- packages/mcp/src/http-server.ts | 2 +- packages/mcp/src/server.ts | 2 +- packages/vscode/package.json | 2 +- plugin/sensegrep-cursor/.cursor-plugin/plugin.json | 2 +- plugin/sensegrep-cursor/.mcp.json | 2 +- .../sensegrep-plugin/.claude-plugin/marketplace.json | 2 +- plugin/sensegrep-plugin/.claude-plugin/plugin.json | 2 +- plugin/sensegrep-plugin/.mcp.json | 2 +- plugins/sensegrep/.codex-plugin/plugin.json | 2 +- plugins/sensegrep/.mcp.json | 2 +- server.json | 4 ++-- 21 files changed, 49 insertions(+), 32 deletions(-) delete mode 100644 .changeset/atomic-watcher-updates.md diff --git a/.changeset/atomic-watcher-updates.md b/.changeset/atomic-watcher-updates.md deleted file mode 100644 index 727df5b..0000000 --- a/.changeset/atomic-watcher-updates.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@sensegrep/core": patch -"@sensegrep/cli": patch -"@sensegrep/mcp": patch ---- - -Extend staged, atomic index activation to individual watched file updates and removals, including files that become ignored or empty. Validate the staged chunk count before committing metadata and leave the active generation untouched if persistence or metadata writing fails. diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 32c4a71..b2f3e33 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -13,7 +13,7 @@ "name": "sensegrep", "source": "./plugin/sensegrep-plugin", "description": "Semantic code search for AI agents. Search code by meaning, not text patterns. Adds sensegrep MCP tools + smart usage instructions to Claude Code.", - "version": "1.17.1", + "version": "1.17.2", "author": { "name": "sensegrep" }, diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index 437c319..3bcada4 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -13,7 +13,7 @@ "name": "sensegrep", "source": "plugin/sensegrep-cursor", "description": "Semantic code search for AI agents. Search code by meaning, not text patterns.", - "version": "1.17.1" + "version": "1.17.2" } ] } diff --git a/package-lock.json b/package-lock.json index 4ff1d34..aa19f6c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8703,10 +8703,10 @@ }, "packages/cli": { "name": "@sensegrep/cli", - "version": "1.17.1", + "version": "1.17.2", "license": "Apache-2.0", "dependencies": { - "@sensegrep/core": "^1.17.1" + "@sensegrep/core": "^1.17.2" }, "bin": { "sensegrep": "dist/main.js" @@ -8717,7 +8717,7 @@ }, "packages/core": { "name": "@sensegrep/core", - "version": "1.17.1", + "version": "1.17.2", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-bedrock-runtime": "^3.1084.0", @@ -8738,13 +8738,13 @@ }, "packages/mcp": { "name": "@sensegrep/mcp", - "version": "1.17.1", + "version": "1.17.2", "license": "Apache-2.0", "dependencies": { "@modelcontextprotocol/node": "^2.0.0", "@modelcontextprotocol/sdk": "^1.29.0", "@modelcontextprotocol/server": "^2.0.0", - "@sensegrep/core": "^1.17.1", + "@sensegrep/core": "^1.17.2", "zod": "^4.4.3" }, "bin": { @@ -8760,7 +8760,7 @@ "version": "0.1.27", "license": "Apache-2.0", "dependencies": { - "@sensegrep/core": "^1.17.1" + "@sensegrep/core": "^1.17.2" }, "devDependencies": { "@types/node": "^20.19.43", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 773871c..311f953 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,14 @@ # @sensegrep/cli +## 1.17.2 + +### Patch Changes + +- [`62f4bb9`](https://github.com/Stahldavid/sensegrep/commit/62f4bb99102fcd332139a2331a36ff34e381acdd) Thanks [@Stahldavid](https://github.com/Stahldavid)! - Extend staged, atomic index activation to individual watched file updates and removals, including files that become ignored or empty. Validate the staged chunk count before committing metadata and leave the active generation untouched if persistence or metadata writing fails. + +- Updated dependencies [[`62f4bb9`](https://github.com/Stahldavid/sensegrep/commit/62f4bb99102fcd332139a2331a36ff34e381acdd)]: + - @sensegrep/core@1.17.2 + ## 1.17.1 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index b8c497b..a206b37 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@sensegrep/cli", - "version": "1.17.1", + "version": "1.17.2", "type": "module", "bin": { "sensegrep": "dist/main.js" @@ -25,7 +25,7 @@ "node": ">=20" }, "dependencies": { - "@sensegrep/core": "^1.17.1" + "@sensegrep/core": "^1.17.2" }, "publishConfig": { "access": "public" diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 93ad9bc..e8df5cb 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,5 +1,11 @@ # @sensegrep/core +## 1.17.2 + +### Patch Changes + +- [`62f4bb9`](https://github.com/Stahldavid/sensegrep/commit/62f4bb99102fcd332139a2331a36ff34e381acdd) Thanks [@Stahldavid](https://github.com/Stahldavid)! - Extend staged, atomic index activation to individual watched file updates and removals, including files that become ignored or empty. Validate the staged chunk count before committing metadata and leave the active generation untouched if persistence or metadata writing fails. + ## 1.17.1 ### Patch Changes diff --git a/packages/core/package.json b/packages/core/package.json index f2e37b7..fefc658 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@sensegrep/core", - "version": "1.17.1", + "version": "1.17.2", "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/packages/mcp/CHANGELOG.md b/packages/mcp/CHANGELOG.md index 1faee07..9dd2525 100644 --- a/packages/mcp/CHANGELOG.md +++ b/packages/mcp/CHANGELOG.md @@ -1,5 +1,14 @@ # @sensegrep/mcp +## 1.17.2 + +### Patch Changes + +- [`62f4bb9`](https://github.com/Stahldavid/sensegrep/commit/62f4bb99102fcd332139a2331a36ff34e381acdd) Thanks [@Stahldavid](https://github.com/Stahldavid)! - Extend staged, atomic index activation to individual watched file updates and removals, including files that become ignored or empty. Validate the staged chunk count before committing metadata and leave the active generation untouched if persistence or metadata writing fails. + +- Updated dependencies [[`62f4bb9`](https://github.com/Stahldavid/sensegrep/commit/62f4bb99102fcd332139a2331a36ff34e381acdd)]: + - @sensegrep/core@1.17.2 + ## 1.17.1 ### Patch Changes diff --git a/packages/mcp/package.json b/packages/mcp/package.json index e2dab04..4ee4766 100644 --- a/packages/mcp/package.json +++ b/packages/mcp/package.json @@ -1,7 +1,7 @@ { "name": "@sensegrep/mcp", "mcpName": "io.github.Stahldavid/sensegrep", - "version": "1.17.1", + "version": "1.17.2", "type": "module", "main": "./dist/server.js", "bin": { @@ -33,7 +33,7 @@ "@modelcontextprotocol/node": "^2.0.0", "@modelcontextprotocol/sdk": "^1.29.0", "@modelcontextprotocol/server": "^2.0.0", - "@sensegrep/core": "^1.17.1", + "@sensegrep/core": "^1.17.2", "zod": "^4.4.3" }, "publishConfig": { diff --git a/packages/mcp/src/http-server.ts b/packages/mcp/src/http-server.ts index 8dc7a50..ccacffc 100644 --- a/packages/mcp/src/http-server.ts +++ b/packages/mcp/src/http-server.ts @@ -39,7 +39,7 @@ export function createSensegrepHttpHandler( return createMcpHandler(async (context) => { options.onServerCreated?.(context); const server = new Server( - { name: "sensegrep", version: "1.17.1" }, + { name: "sensegrep", version: "1.17.2" }, { capabilities: { tools: {} } }, ); diff --git a/packages/mcp/src/server.ts b/packages/mcp/src/server.ts index 8de6454..a394d4d 100644 --- a/packages/mcp/src/server.ts +++ b/packages/mcp/src/server.ts @@ -939,7 +939,7 @@ export function createStdioMcpServer(): Server { const server = new Server( { name: "sensegrep", - version: "1.17.1", + version: "1.17.2", }, { capabilities: { diff --git a/packages/vscode/package.json b/packages/vscode/package.json index 19d3680..4d29ed0 100644 --- a/packages/vscode/package.json +++ b/packages/vscode/package.json @@ -602,6 +602,6 @@ "typescript": "^5.9.3" }, "dependencies": { - "@sensegrep/core": "^1.17.1" + "@sensegrep/core": "^1.17.2" } } diff --git a/plugin/sensegrep-cursor/.cursor-plugin/plugin.json b/plugin/sensegrep-cursor/.cursor-plugin/plugin.json index 4f4ecac..71fbb83 100644 --- a/plugin/sensegrep-cursor/.cursor-plugin/plugin.json +++ b/plugin/sensegrep-cursor/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "sensegrep", - "version": "1.17.1", + "version": "1.17.2", "description": "Semantic code search for AI agents. Search code by meaning, not text patterns. Replaces grep/ripgrep for 95% of code exploration tasks.", "author": { "name": "sensegrep" diff --git a/plugin/sensegrep-cursor/.mcp.json b/plugin/sensegrep-cursor/.mcp.json index e6925cb..0bac553 100644 --- a/plugin/sensegrep-cursor/.mcp.json +++ b/plugin/sensegrep-cursor/.mcp.json @@ -4,7 +4,7 @@ "command": "npx", "args": [ "-y", - "@sensegrep/mcp@1.17.1" + "@sensegrep/mcp@1.17.2" ] } } diff --git a/plugin/sensegrep-plugin/.claude-plugin/marketplace.json b/plugin/sensegrep-plugin/.claude-plugin/marketplace.json index e08f7d8..3eceacb 100644 --- a/plugin/sensegrep-plugin/.claude-plugin/marketplace.json +++ b/plugin/sensegrep-plugin/.claude-plugin/marketplace.json @@ -13,7 +13,7 @@ "name": "sensegrep", "source": ".", "description": "Semantic code search for AI agents. Search code by meaning, not text patterns. Adds sensegrep MCP tools + smart usage instructions to Claude Code.", - "version": "1.17.1", + "version": "1.17.2", "author": { "name": "sensegrep" }, diff --git a/plugin/sensegrep-plugin/.claude-plugin/plugin.json b/plugin/sensegrep-plugin/.claude-plugin/plugin.json index 494464e..eed2e7e 100644 --- a/plugin/sensegrep-plugin/.claude-plugin/plugin.json +++ b/plugin/sensegrep-plugin/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "sensegrep", - "version": "1.17.1", + "version": "1.17.2", "description": "Semantic code search for AI agents. Search code by meaning, not text patterns. Replaces grep/ripgrep for 95% of code exploration tasks.", "author": { "name": "sensegrep", diff --git a/plugin/sensegrep-plugin/.mcp.json b/plugin/sensegrep-plugin/.mcp.json index e6925cb..0bac553 100644 --- a/plugin/sensegrep-plugin/.mcp.json +++ b/plugin/sensegrep-plugin/.mcp.json @@ -4,7 +4,7 @@ "command": "npx", "args": [ "-y", - "@sensegrep/mcp@1.17.1" + "@sensegrep/mcp@1.17.2" ] } } diff --git a/plugins/sensegrep/.codex-plugin/plugin.json b/plugins/sensegrep/.codex-plugin/plugin.json index fcd6169..a7c4fc9 100644 --- a/plugins/sensegrep/.codex-plugin/plugin.json +++ b/plugins/sensegrep/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "sensegrep", - "version": "1.17.1", + "version": "1.17.2", "description": "Semantic + structural code search for AI agents. Read the right code, not more code — combining semantic search, exact matching, and AST-aware retrieval.", "author": { "name": "sensegrep", diff --git a/plugins/sensegrep/.mcp.json b/plugins/sensegrep/.mcp.json index e6925cb..0bac553 100644 --- a/plugins/sensegrep/.mcp.json +++ b/plugins/sensegrep/.mcp.json @@ -4,7 +4,7 @@ "command": "npx", "args": [ "-y", - "@sensegrep/mcp@1.17.1" + "@sensegrep/mcp@1.17.2" ] } } diff --git a/server.json b/server.json index 46e6ea6..cc530a8 100644 --- a/server.json +++ b/server.json @@ -8,12 +8,12 @@ "url": "https://github.com/Stahldavid/sensegrep", "source": "github" }, - "version": "1.17.1", + "version": "1.17.2", "packages": [ { "registryType": "npm", "identifier": "@sensegrep/mcp", - "version": "1.17.1", + "version": "1.17.2", "transport": { "type": "stdio" },