@ssmeo/mcp-local-rag 0.18.9 → 0.18.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.de.md +23 -2
- package/README.es.md +23 -2
- package/README.fr.md +23 -2
- package/README.md +34 -2
- package/README.pt-BR.md +23 -2
- package/README.zh-CN.md +23 -2
- package/dist/auto-sync-watch.d.ts +20 -0
- package/dist/auto-sync-watch.d.ts.map +1 -0
- package/dist/auto-sync-watch.js +46 -0
- package/dist/auto-sync-watch.js.map +1 -0
- package/dist/cli/common.d.ts.map +1 -1
- package/dist/cli/common.js +15 -2
- package/dist/cli/common.js.map +1 -1
- package/dist/cli/options.d.ts +19 -0
- package/dist/cli/options.d.ts.map +1 -1
- package/dist/cli/options.js +72 -8
- package/dist/cli/options.js.map +1 -1
- package/dist/rerank/command.d.ts +21 -0
- package/dist/rerank/command.d.ts.map +1 -0
- package/dist/rerank/command.js +20 -0
- package/dist/rerank/command.js.map +1 -0
- package/dist/rerank/index.d.ts +21 -0
- package/dist/rerank/index.d.ts.map +1 -0
- package/dist/rerank/index.js +104 -0
- package/dist/rerank/index.js.map +1 -0
- package/dist/rerank/response.d.ts +29 -0
- package/dist/rerank/response.d.ts.map +1 -0
- package/dist/rerank/response.js +77 -0
- package/dist/rerank/response.js.map +1 -0
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +68 -27
- package/dist/server/index.js.map +1 -1
- package/dist/server/tool-definitions.js +1 -1
- package/dist/server/tool-definitions.js.map +1 -1
- package/dist/server/tool-input.d.ts.map +1 -1
- package/dist/server/tool-input.js +5 -5
- package/dist/server/tool-input.js.map +1 -1
- package/dist/server/types.d.ts +4 -0
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server-main.d.ts +13 -22
- package/dist/server-main.d.ts.map +1 -1
- package/dist/server-main.js +50 -59
- package/dist/server-main.js.map +1 -1
- package/dist/utils/limits.d.ts +16 -1
- package/dist/utils/limits.d.ts.map +1 -1
- package/dist/utils/limits.js +16 -1
- package/dist/utils/limits.js.map +1 -1
- package/dist/vectordb/types.d.ts +4 -1
- package/dist/vectordb/types.d.ts.map +1 -1
- package/dist/vectordb/types.js.map +1 -1
- package/package.json +1 -1
- package/skills/mcp-local-rag/SKILL.md +3 -3
- package/skills/mcp-local-rag/references/cli-reference.md +1 -1
package/dist/cli/options.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAE/D,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAuB,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** An executable and the arguments configured alongside it. */
|
|
2
|
+
export interface RerankCommand {
|
|
3
|
+
/** Program to spawn. Must name a directly executable file, not a shim. */
|
|
4
|
+
executable: string;
|
|
5
|
+
/** Arguments configured by the operator, before the server's own flags. */
|
|
6
|
+
args: string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Splits the configured command on whitespace. Quoting and other shell syntax
|
|
10
|
+
* are deliberately not interpreted: the command is spawned without a shell, so
|
|
11
|
+
* a quote this parser stripped would not mean what the operator expects.
|
|
12
|
+
*
|
|
13
|
+
* Returns undefined when the string carries no token.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseRerankCommand(command: string): RerankCommand | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Appends the server's flags after the configured arguments. Each value is its
|
|
18
|
+
* own element, so query text is never read as command syntax.
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildRerankArgv(command: RerankCommand, query: string, top: number): string[];
|
|
21
|
+
//# sourceMappingURL=command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/rerank/command.ts"],"names":[],"mappings":"AAEA,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAA;IAClB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAG7E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAE5F"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Parsing of the configured rerank command into an argv vector.
|
|
2
|
+
/**
|
|
3
|
+
* Splits the configured command on whitespace. Quoting and other shell syntax
|
|
4
|
+
* are deliberately not interpreted: the command is spawned without a shell, so
|
|
5
|
+
* a quote this parser stripped would not mean what the operator expects.
|
|
6
|
+
*
|
|
7
|
+
* Returns undefined when the string carries no token.
|
|
8
|
+
*/
|
|
9
|
+
export function parseRerankCommand(command) {
|
|
10
|
+
const [executable, ...args] = command.split(/\s+/).filter((token) => token.length > 0);
|
|
11
|
+
return executable === undefined ? undefined : { executable, args };
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Appends the server's flags after the configured arguments. Each value is its
|
|
15
|
+
* own element, so query text is never read as command syntax.
|
|
16
|
+
*/
|
|
17
|
+
export function buildRerankArgv(command, query, top) {
|
|
18
|
+
return [...command.args, '--query', query, '--top', String(top)];
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/rerank/command.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAUhE;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACtF,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAsB,EAAE,KAAa,EAAE,GAAW;IAChF,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAClE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type RerankResult } from './response.js';
|
|
2
|
+
export type { RerankResult } from './response.js';
|
|
3
|
+
/** One rerank call: the results to hand over, and the command that handles them. */
|
|
4
|
+
export interface RerankRequest {
|
|
5
|
+
/** Search results in their pre-rerank order. Returned as-is on failure. */
|
|
6
|
+
candidates: RerankResult[];
|
|
7
|
+
/** Query text, passed to the command as its own argv element. */
|
|
8
|
+
query: string;
|
|
9
|
+
/** Result count the caller wants, passed through as `--top`. */
|
|
10
|
+
top: number;
|
|
11
|
+
/** Configured command, parsed as a whitespace-separated argv vector. */
|
|
12
|
+
command: string;
|
|
13
|
+
/** Per-call budget. The spawned process is killed when it elapses. */
|
|
14
|
+
timeoutMs: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* What the command produced, or the results unchanged when it could not run or
|
|
18
|
+
* answered with something that is not a valid result set. Never throws.
|
|
19
|
+
*/
|
|
20
|
+
export declare function rerankCandidates(request: RerankRequest): Promise<RerankResult[]>;
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rerank/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,YAAY,EAA0B,MAAM,eAAe,CAAA;AAEzE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEjD,oFAAoF;AACpF,MAAM,WAAW,aAAa;IAC5B,2EAA2E;IAC3E,UAAU,EAAE,YAAY,EAAE,CAAA;IAC1B,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAA;IACb,gEAAgE;IAChE,GAAG,EAAE,MAAM,CAAA;IACX,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAA;IACf,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAA;CAClB;AA2FD;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAmBtF"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// External reranking: hand the search candidates to a configured command and
|
|
2
|
+
// take its response as an ordering over them.
|
|
3
|
+
//
|
|
4
|
+
// Every failure mode degrades to the ordering the caller already had, the way
|
|
5
|
+
// the FTS fallback in `VectorStore.searchWithKeywordBoost` does. A reranker is
|
|
6
|
+
// an improvement to ranking, so a broken one must not fail the request; a
|
|
7
|
+
// process that fails to start arrives as an `error` event, and leaving that
|
|
8
|
+
// unhandled would take the server process down.
|
|
9
|
+
import { spawn } from 'node:child_process';
|
|
10
|
+
import { errorCode } from '../utils/type-guards.js';
|
|
11
|
+
import { buildRerankArgv, parseRerankCommand } from './command.js';
|
|
12
|
+
import { validateRerankResponse } from './response.js';
|
|
13
|
+
/** Complete results in `docs/schema/query-output.schema.json` form. */
|
|
14
|
+
function buildRerankPayload(candidates) {
|
|
15
|
+
return JSON.stringify(candidates);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* A missing command, one without execute permission, and a `.cmd` / `.bat` shim
|
|
19
|
+
* on Windows all land here. The operator would otherwise just see reranking not
|
|
20
|
+
* happening, so the line says what the command has to be. Only the error's code
|
|
21
|
+
* is reported: its message repeats the executable.
|
|
22
|
+
*/
|
|
23
|
+
function spawnFailureReason(error) {
|
|
24
|
+
return `the command could not be started (${errorCode(error) ?? 'unknown error'}); it must name a directly executable file, not a .cmd or .bat shim`;
|
|
25
|
+
}
|
|
26
|
+
function runRerankCommand(executable, argv, payload, timeoutMs) {
|
|
27
|
+
return new Promise((resolve) => {
|
|
28
|
+
let settled = false;
|
|
29
|
+
const stdoutChunks = [];
|
|
30
|
+
let timer;
|
|
31
|
+
const finish = (result) => {
|
|
32
|
+
if (settled) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
settled = true;
|
|
36
|
+
clearTimeout(timer);
|
|
37
|
+
resolve(result);
|
|
38
|
+
};
|
|
39
|
+
let child;
|
|
40
|
+
try {
|
|
41
|
+
// No shell on any platform: the query travels as its own argv element and
|
|
42
|
+
// nothing can splice it back into a command string. `stderr` is ignored
|
|
43
|
+
// because the child is untrusted and could otherwise write document text
|
|
44
|
+
// into this server's log stream.
|
|
45
|
+
child = spawn(executable, argv, { stdio: ['pipe', 'pipe', 'ignore'] });
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
finish({ ok: false, reason: spawnFailureReason(error) });
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// The budget itself ends the call. A child that traps the signal, or one
|
|
52
|
+
// whose descendant holds the inherited stdout open, never emits `close`, so
|
|
53
|
+
// waiting for the kill to land would leave the request pending for as long
|
|
54
|
+
// as the child felt like running. Its stdout is dropped and the handle is
|
|
55
|
+
// unreferenced so nothing it does afterwards reaches or holds this server.
|
|
56
|
+
timer = setTimeout(() => {
|
|
57
|
+
child.kill();
|
|
58
|
+
child.stdout?.destroy();
|
|
59
|
+
child.unref();
|
|
60
|
+
finish({ ok: false, reason: `the command timed out after ${timeoutMs}ms and was killed` });
|
|
61
|
+
}, timeoutMs);
|
|
62
|
+
child.stdout?.setEncoding('utf8');
|
|
63
|
+
child.stdout?.on('data', (chunk) => {
|
|
64
|
+
stdoutChunks.push(chunk);
|
|
65
|
+
});
|
|
66
|
+
// A child that exits before reading its input makes this write fail; the
|
|
67
|
+
// exit itself is what gets reported.
|
|
68
|
+
child.stdin?.on('error', () => { });
|
|
69
|
+
child.stdin?.end(payload);
|
|
70
|
+
child.on('error', (error) => {
|
|
71
|
+
finish({ ok: false, reason: spawnFailureReason(error) });
|
|
72
|
+
});
|
|
73
|
+
child.on('close', (code, signal) => {
|
|
74
|
+
if (code === 0) {
|
|
75
|
+
finish({ ok: true, stdout: stdoutChunks.join('') });
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const outcome = code === null ? `was terminated by ${signal}` : `exited with code ${code}`;
|
|
79
|
+
finish({ ok: false, reason: `the command ${outcome}` });
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
function fallback(candidates, reason) {
|
|
84
|
+
console.error(`Rerank: ${reason}; returning the pre-rerank ordering`);
|
|
85
|
+
return candidates;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* What the command produced, or the results unchanged when it could not run or
|
|
89
|
+
* answered with something that is not a valid result set. Never throws.
|
|
90
|
+
*/
|
|
91
|
+
export async function rerankCandidates(request) {
|
|
92
|
+
const { candidates, query, top, command, timeoutMs } = request;
|
|
93
|
+
const parsed = parseRerankCommand(command);
|
|
94
|
+
if (parsed === undefined) {
|
|
95
|
+
return fallback(candidates, 'the configured command is empty');
|
|
96
|
+
}
|
|
97
|
+
const run = await runRerankCommand(parsed.executable, buildRerankArgv(parsed, query, top), buildRerankPayload(candidates), timeoutMs);
|
|
98
|
+
if (!run.ok) {
|
|
99
|
+
return fallback(candidates, run.reason);
|
|
100
|
+
}
|
|
101
|
+
const validated = validateRerankResponse(run.stdout);
|
|
102
|
+
return validated.ok ? validated.results : fallback(candidates, validated.reason);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rerank/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** One result, as `docs/schema/query-output.schema.json` defines it. */
|
|
2
|
+
export interface RerankResult {
|
|
3
|
+
filePath: string;
|
|
4
|
+
chunkIndex: number;
|
|
5
|
+
text: string;
|
|
6
|
+
score: number;
|
|
7
|
+
fileTitle: string | null;
|
|
8
|
+
images: {
|
|
9
|
+
imageIndex: number;
|
|
10
|
+
mimeType: 'image/png' | 'image/jpeg';
|
|
11
|
+
data: string;
|
|
12
|
+
}[];
|
|
13
|
+
source?: string;
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
/** The reason reaches stderr, so it names no document text and no path. */
|
|
17
|
+
export type RerankMatch = {
|
|
18
|
+
ok: true;
|
|
19
|
+
results: RerankResult[];
|
|
20
|
+
} | {
|
|
21
|
+
ok: false;
|
|
22
|
+
reason: string;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* An empty array, a shorter array, a chunk the server did not send and a
|
|
26
|
+
* rewritten text are all valid answers; only the form is checked.
|
|
27
|
+
*/
|
|
28
|
+
export declare function validateRerankResponse(stdout: string): RerankMatch;
|
|
29
|
+
//# sourceMappingURL=response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/rerank/response.ts"],"names":[],"mappings":"AAKA,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,WAAW,GAAG,YAAY,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACpF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,2EAA2E;AAC3E,MAAM,MAAM,WAAW,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AA4D/F;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAiBlE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// The server sends `docs/schema/query-output.schema.json` and accepts the same
|
|
2
|
+
// shape back. Count, identity and repetition are the command's decisions.
|
|
3
|
+
import { isInteger, isRecord } from '../utils/type-guards.js';
|
|
4
|
+
const MIME_TYPES = new Set(['image/png', 'image/jpeg']);
|
|
5
|
+
function isNonNegativeInteger(value) {
|
|
6
|
+
return isInteger(value) && typeof value === 'number' && value >= 0;
|
|
7
|
+
}
|
|
8
|
+
function parseArray(stdout) {
|
|
9
|
+
let parsed;
|
|
10
|
+
try {
|
|
11
|
+
parsed = JSON.parse(stdout);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
return Array.isArray(parsed) ? parsed : undefined;
|
|
17
|
+
}
|
|
18
|
+
function imagesValid(value) {
|
|
19
|
+
if (!Array.isArray(value)) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
return value.every((image) => isRecord(image) &&
|
|
23
|
+
isNonNegativeInteger(image['imageIndex']) &&
|
|
24
|
+
typeof image['mimeType'] === 'string' &&
|
|
25
|
+
MIME_TYPES.has(image['mimeType']) &&
|
|
26
|
+
typeof image['data'] === 'string');
|
|
27
|
+
}
|
|
28
|
+
function isRerankResult(item) {
|
|
29
|
+
if (!isRecord(item)) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
if (typeof item['filePath'] !== 'string') {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
if (!isNonNegativeInteger(item['chunkIndex'])) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
if (typeof item['text'] !== 'string') {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
if (typeof item['score'] !== 'number' || !Number.isFinite(item['score'])) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
if (item['fileTitle'] !== null && typeof item['fileTitle'] !== 'string') {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
if (!imagesValid(item['images'])) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
if (item['source'] !== undefined && typeof item['source'] !== 'string') {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* An empty array, a shorter array, a chunk the server did not send and a
|
|
57
|
+
* rewritten text are all valid answers; only the form is checked.
|
|
58
|
+
*/
|
|
59
|
+
export function validateRerankResponse(stdout) {
|
|
60
|
+
const items = parseArray(stdout);
|
|
61
|
+
if (items === undefined) {
|
|
62
|
+
return { ok: false, reason: 'output was not a JSON array' };
|
|
63
|
+
}
|
|
64
|
+
for (const [index, item] of items.entries()) {
|
|
65
|
+
if (!isRerankResult(item)) {
|
|
66
|
+
return { ok: false, reason: `output item ${index} did not match the result schema` };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const results = [];
|
|
70
|
+
for (const item of items) {
|
|
71
|
+
if (isRerankResult(item)) {
|
|
72
|
+
results.push(item);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return { ok: true, results };
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/rerank/response.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -40,6 +40,9 @@ export declare class RAGServer {
|
|
|
40
40
|
private readonly maxFileSize;
|
|
41
41
|
private readonly device;
|
|
42
42
|
private readonly storeImages;
|
|
43
|
+
/** Configured reranker command. Undefined leaves query_documents unchanged. */
|
|
44
|
+
private readonly rerankCommand;
|
|
45
|
+
private readonly rerankTimeoutMs;
|
|
43
46
|
/**
|
|
44
47
|
* The one current-or-latest sync job this process retains. A new `sync_start`
|
|
45
48
|
* replaces a terminal record, so the older id becomes unknown; there is no
|
|
@@ -84,6 +87,8 @@ export declare class RAGServer {
|
|
|
84
87
|
/**
|
|
85
88
|
* query_documents tool handler
|
|
86
89
|
*/
|
|
90
|
+
/** Hands the finished results to the configured command and takes its answer. */
|
|
91
|
+
private applyReranker;
|
|
87
92
|
handleQueryDocuments(args: QueryDocumentsInput): Promise<{
|
|
88
93
|
content: QueryContent;
|
|
89
94
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import { resolve, sep } from 'node:path';
|
|
|
6
6
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
7
7
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
8
8
|
import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from '@modelcontextprotocol/sdk/types.js';
|
|
9
|
+
import { startAutoSyncWatch } from '../auto-sync-watch.js';
|
|
9
10
|
import { DEFAULT_MIN_CHUNK_LENGTH, SemanticChunker } from '../chunker/index.js';
|
|
10
11
|
import { collectFiles } from '../cli/file-collection.js';
|
|
11
12
|
import { Embedder } from '../embedder/index.js';
|
|
@@ -17,9 +18,10 @@ import { buildPreparedFileVectorChunks, prepareFileForIngest, } from '../ingest/
|
|
|
17
18
|
import { parseHtml } from '../parser/html-parser.js';
|
|
18
19
|
import { DocumentParser, ValidationError } from '../parser/index.js';
|
|
19
20
|
import { extractMarkdownTitle, extractTxtTitle } from '../parser/title-extractor.js';
|
|
21
|
+
import { rerankCandidates } from '../rerank/index.js';
|
|
20
22
|
import { displayPath } from '../utils/base-dirs.js';
|
|
21
23
|
import { toError } from '../utils/errors.js';
|
|
22
|
-
import { MAX_SCAN_DEPTH } from '../utils/limits.js';
|
|
24
|
+
import { DEFAULT_RERANK_TIMEOUT_MS, MAX_QUERY_LIMIT, MAX_SCAN_DEPTH, RERANK_CANDIDATE_MULTIPLIER, } from '../utils/limits.js';
|
|
23
25
|
import { checkRawDataArtifacts, extractSourceFromPath, generateMetaJsonPath, generateRawDataPath, isEnoent, isManagedRawDataPath, isPathInRawDataDir, isPathInRawDataDirLexical, loadMetaJson, saveMetaJson, saveRawData, } from '../utils/raw-data-utils.js';
|
|
24
26
|
import { bfsCollectSupportedFiles, canonicalizeRequestedPath, classifyRequestedPath, } from '../utils/scan.js';
|
|
25
27
|
import { nonAbsolutePrefixes } from '../utils/scope-match.js';
|
|
@@ -153,6 +155,9 @@ export class RAGServer {
|
|
|
153
155
|
maxFileSize;
|
|
154
156
|
device;
|
|
155
157
|
storeImages;
|
|
158
|
+
/** Configured reranker command. Undefined leaves query_documents unchanged. */
|
|
159
|
+
rerankCommand;
|
|
160
|
+
rerankTimeoutMs;
|
|
156
161
|
/**
|
|
157
162
|
* The one current-or-latest sync job this process retains. A new `sync_start`
|
|
158
163
|
* replaces a terminal record, so the older id becomes unknown; there is no
|
|
@@ -184,6 +189,8 @@ export class RAGServer {
|
|
|
184
189
|
this.maxFileSize = config.maxFileSize;
|
|
185
190
|
this.device = config.device;
|
|
186
191
|
this.storeImages = config.storeImages ?? false;
|
|
192
|
+
this.rerankCommand = config.rerankCommand;
|
|
193
|
+
this.rerankTimeoutMs = config.rerankTimeoutMs ?? DEFAULT_RERANK_TIMEOUT_MS;
|
|
187
194
|
this.excludePaths = [`${resolve(this.dbPath)}${sep}`, `${resolve(this.cacheDir)}${sep}`];
|
|
188
195
|
this.server = new Server({ name: 'rag-mcp-server', version: packageVersion }, { capabilities: { tools: {} } });
|
|
189
196
|
// Component initialization
|
|
@@ -342,45 +349,57 @@ export class RAGServer {
|
|
|
342
349
|
*/
|
|
343
350
|
async initialize() {
|
|
344
351
|
await this.vectorStore.initialize();
|
|
352
|
+
const watchers = startAutoSyncWatch({
|
|
353
|
+
baseDirs: this.baseDirs,
|
|
354
|
+
onDriftSignal: () => this.maybeAutoSync(),
|
|
355
|
+
onError: (message) => console.error(message),
|
|
356
|
+
});
|
|
357
|
+
if (watchers.length > 0) {
|
|
358
|
+
console.error('Auto-sync: watching document roots for changes');
|
|
359
|
+
}
|
|
345
360
|
console.error('RAGServer initialized');
|
|
346
361
|
}
|
|
347
362
|
/**
|
|
348
363
|
* query_documents tool handler
|
|
349
364
|
*/
|
|
365
|
+
/** Hands the finished results to the configured command and takes its answer. */
|
|
366
|
+
async applyReranker(results, query, limit) {
|
|
367
|
+
if (this.rerankCommand === undefined) {
|
|
368
|
+
return results;
|
|
369
|
+
}
|
|
370
|
+
return rerankCandidates({
|
|
371
|
+
candidates: results,
|
|
372
|
+
query,
|
|
373
|
+
top: limit,
|
|
374
|
+
command: this.rerankCommand,
|
|
375
|
+
timeoutMs: this.rerankTimeoutMs,
|
|
376
|
+
});
|
|
377
|
+
}
|
|
350
378
|
async handleQueryDocuments(args) {
|
|
351
379
|
this.maybeAutoSync();
|
|
352
380
|
// query_documents reads only LanceDB, so it stays callable in degraded
|
|
353
381
|
// mode; `withWarnings` and `status` remain the diagnostic surface.
|
|
354
382
|
const queryVector = await this.embedder.embed(args.query);
|
|
383
|
+
// A reranker only improves on what the search returned, so it is given more
|
|
384
|
+
// candidates than the caller asked for. `search` applies every filter and
|
|
385
|
+
// caps at `limit`, so the expansion has to be requested up front.
|
|
386
|
+
const limit = args.limit ?? 10;
|
|
387
|
+
const candidateLimit = this.rerankCommand === undefined
|
|
388
|
+
? limit
|
|
389
|
+
: Math.min(limit * RERANK_CANDIDATE_MULTIPLIER, MAX_QUERY_LIMIT);
|
|
355
390
|
// `args.scope` is parser-validated; array-wrap without re-validating, and
|
|
356
391
|
// omit the key when absent (exactOptionalPropertyTypes) to keep the scope-absent path.
|
|
357
|
-
const
|
|
392
|
+
const candidates = await this.vectorStore.search(queryVector, {
|
|
358
393
|
queryText: args.query,
|
|
359
|
-
limit:
|
|
394
|
+
limit: candidateLimit,
|
|
360
395
|
...(args.scope !== undefined ? { scope: toArray(args.scope) } : {}),
|
|
361
396
|
});
|
|
362
|
-
//
|
|
363
|
-
const results = searchResults.map((result) => {
|
|
364
|
-
const queryResult = {
|
|
365
|
-
filePath: result.filePath,
|
|
366
|
-
chunkIndex: result.chunkIndex,
|
|
367
|
-
text: result.text,
|
|
368
|
-
score: result.score,
|
|
369
|
-
fileTitle: result.fileTitle ?? null,
|
|
370
|
-
};
|
|
371
|
-
if (isManagedRawDataPath(result.filePath, this.dbPath)) {
|
|
372
|
-
const source = extractSourceFromPath(result.filePath);
|
|
373
|
-
if (source) {
|
|
374
|
-
queryResult.source = source;
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
return queryResult;
|
|
378
|
-
});
|
|
379
|
-
let hydratedRows = [];
|
|
397
|
+
// Hydrated before the command runs, so its answer needs no identity lookup.
|
|
380
398
|
let attachmentWarning = null;
|
|
399
|
+
let attachmentsById = new Map();
|
|
381
400
|
try {
|
|
382
|
-
const hydration = await this.vectorStore.hydrateVisualAttachments(
|
|
383
|
-
|
|
401
|
+
const hydration = await this.vectorStore.hydrateVisualAttachments(candidates);
|
|
402
|
+
attachmentsById = new Map(hydration.rows.map((row) => [row.id, row.attachments]));
|
|
384
403
|
if (hydration.omittedCount > 0) {
|
|
385
404
|
attachmentWarning = attachmentOmissionWarning(hydration.omittedCount);
|
|
386
405
|
}
|
|
@@ -388,15 +407,37 @@ export class RAGServer {
|
|
|
388
407
|
catch {
|
|
389
408
|
attachmentWarning = attachmentHydrationFailureWarning();
|
|
390
409
|
}
|
|
410
|
+
// Format results with source restoration for raw-data files
|
|
411
|
+
const retrieved = candidates.map((candidate) => {
|
|
412
|
+
const result = {
|
|
413
|
+
filePath: candidate.filePath,
|
|
414
|
+
chunkIndex: candidate.chunkIndex,
|
|
415
|
+
text: candidate.text,
|
|
416
|
+
score: candidate.score,
|
|
417
|
+
fileTitle: candidate.fileTitle ?? null,
|
|
418
|
+
images: attachmentsById.get(candidate.id) ?? [],
|
|
419
|
+
};
|
|
420
|
+
if (isManagedRawDataPath(candidate.filePath, this.dbPath)) {
|
|
421
|
+
const source = extractSourceFromPath(candidate.filePath);
|
|
422
|
+
if (source) {
|
|
423
|
+
result.source = source;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
return result;
|
|
427
|
+
});
|
|
428
|
+
// `search` already applied the limit, so only the expanded set is trimmed.
|
|
429
|
+
const results = this.rerankCommand === undefined
|
|
430
|
+
? retrieved
|
|
431
|
+
: (await this.applyReranker(retrieved, args.query, limit)).slice(0, limit);
|
|
391
432
|
const content = [
|
|
392
433
|
{
|
|
393
434
|
type: 'text',
|
|
394
|
-
|
|
435
|
+
// Attachments go out as image blocks below, never inside this JSON.
|
|
436
|
+
text: JSON.stringify(results.map(({ images: _images, ...rest }) => rest), null, 2),
|
|
395
437
|
},
|
|
396
438
|
];
|
|
397
|
-
const
|
|
398
|
-
|
|
399
|
-
const attachments = attachmentsByIdentity.get(searchResults[resultIndex]?.id ?? '') ?? [];
|
|
439
|
+
for (const result of results) {
|
|
440
|
+
const attachments = result.images;
|
|
400
441
|
for (const attachment of attachments) {
|
|
401
442
|
content.push({
|
|
402
443
|
type: 'text',
|