From f88875d99c1e2255796577dd7f30a1754a685b9e Mon Sep 17 00:00:00 2001 From: Robert DeRienzo Date: Mon, 2 Mar 2026 19:59:59 +0000 Subject: [PATCH 1/2] feat: add source-type filter to search (#246) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- docs/reference/cli.md | 1 + src/api/routes.ts | 10 +++++++++- src/cli/index.ts | 3 +++ src/mcp/server.ts | 5 +++++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/docs/reference/cli.md b/docs/reference/cli.md index ec3faba..4b5e898 100644 --- a/docs/reference/cli.md +++ b/docs/reference/cli.md @@ -68,6 +68,7 @@ libscope search "deploy process" --context 1 # include neighboring chunks |--------|-------------| | `--library ` | Filter by library | | `--topic ` | Filter by topic | +| `--source ` | Filter by source type (e.g., `confluence`, `url`, `topic`, `file`) | | `--limit ` | Max results (default: 10) | | `--min-rating ` | Minimum average rating | | `--context ` | Include N neighboring chunks before/after each result (0-2, default: 0) | diff --git a/src/api/routes.ts b/src/api/routes.ts index a2ed3e2..1ba3253 100644 --- a/src/api/routes.ts +++ b/src/api/routes.ts @@ -142,6 +142,7 @@ export async function handleRequest( return; } const topic = url.searchParams.get("topic") ?? undefined; + const source = url.searchParams.get("source") ?? undefined; const tag = url.searchParams.get("tag") ?? undefined; const limitRaw = url.searchParams.get("limit"); const limitParsed = limitRaw ? parseInt(limitRaw, 10) : NaN; @@ -151,7 +152,14 @@ export async function handleRequest( const offset = Number.isNaN(offsetParsed) ? undefined : offsetParsed; const tags = tag ? [tag] : undefined; - const result = await searchDocuments(db, provider, { query: q, topic, tags, limit, offset }); + const result = await searchDocuments(db, provider, { + query: q, + topic, + tags, + source, + limit, + offset, + }); const took = Math.round(performance.now() - start); sendJson(res, 200, result, took); return; diff --git a/src/cli/index.ts b/src/cli/index.ts index 39dd60e..871ab02 100644 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -330,6 +330,7 @@ program .description("Search indexed documents") .option("--topic ", "Filter by topic") .option("--library ", "Filter by library") + .option("--source ", "Filter by source type (e.g., 'confluence', 'url', 'topic', 'file')") .option("--limit ", "Max results", "5") .option("--offset ", "Offset for pagination", "0") .option("--context ", "Include N neighboring chunks before/after each result (0-2)", "0") @@ -339,6 +340,7 @@ program opts: { topic?: string; library?: string; + source?: string; limit: string; offset: string; context: string; @@ -351,6 +353,7 @@ program query, topic: opts.topic, library: opts.library, + source: opts.source, limit: parseIntOption(opts.limit, "--limit"), offset: parseIntOption(opts.offset, "--offset"), contextChunks: contextChunks > 0 ? contextChunks : undefined, diff --git a/src/mcp/server.ts b/src/mcp/server.ts index 1a39bdf..7bbd76a 100644 --- a/src/mcp/server.ts +++ b/src/mcp/server.ts @@ -118,6 +118,10 @@ async function main(): Promise { topic: z.string().optional().describe("Filter by topic ID"), library: z.string().optional().describe("Filter by library name"), version: z.string().optional().describe("Filter by library version"), + source: z + .string() + .optional() + .describe("Filter by source type (e.g., 'confluence', 'url', 'topic', 'file')"), minRating: z.number().min(1).max(5).optional().describe("Minimum average rating filter"), offset: z.number().min(0).optional().describe("Offset for pagination (default: 0)"), limit: z @@ -141,6 +145,7 @@ async function main(): Promise { topic: params.topic, library: params.library, version: params.version, + source: params.source, minRating: params.minRating, limit: params.limit, offset: params.offset, From 2d389529e90d71fed5640a3383481e4f00deaa1a Mon Sep 17 00:00:00 2001 From: Robert DeRienzo Date: Mon, 2 Mar 2026 20:09:14 +0000 Subject: [PATCH 2/2] fix: correct source type examples in documentation --- docs/reference/cli.md | 2 +- src/cli/index.ts | 5 ++++- src/mcp/server.ts | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/reference/cli.md b/docs/reference/cli.md index 4b5e898..6e99a39 100644 --- a/docs/reference/cli.md +++ b/docs/reference/cli.md @@ -68,7 +68,7 @@ libscope search "deploy process" --context 1 # include neighboring chunks |--------|-------------| | `--library ` | Filter by library | | `--topic ` | Filter by topic | -| `--source ` | Filter by source type (e.g., `confluence`, `url`, `topic`, `file`) | +| `--source ` | Filter by source type (e.g., `library`, `topic`, `manual`, `model-generated`) | | `--limit ` | Max results (default: 10) | | `--min-rating ` | Minimum average rating | | `--context ` | Include N neighboring chunks before/after each result (0-2, default: 0) | diff --git a/src/cli/index.ts b/src/cli/index.ts index 871ab02..cf61c44 100644 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -330,7 +330,10 @@ program .description("Search indexed documents") .option("--topic ", "Filter by topic") .option("--library ", "Filter by library") - .option("--source ", "Filter by source type (e.g., 'confluence', 'url', 'topic', 'file')") + .option( + "--source ", + "Filter by source type (e.g., 'library', 'topic', 'manual', 'model-generated')", + ) .option("--limit ", "Max results", "5") .option("--offset ", "Offset for pagination", "0") .option("--context ", "Include N neighboring chunks before/after each result (0-2)", "0") diff --git a/src/mcp/server.ts b/src/mcp/server.ts index 7bbd76a..a0dd9bf 100644 --- a/src/mcp/server.ts +++ b/src/mcp/server.ts @@ -121,7 +121,7 @@ async function main(): Promise { source: z .string() .optional() - .describe("Filter by source type (e.g., 'confluence', 'url', 'topic', 'file')"), + .describe("Filter by source type (e.g., 'library', 'topic', 'manual', 'model-generated')"), minRating: z.number().min(1).max(5).optional().describe("Minimum average rating filter"), offset: z.number().min(0).optional().describe("Offset for pagination (default: 0)"), limit: z