@ssmeo/mcp-local-rag 0.18.6
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/LICENSE +21 -0
- package/README.de.md +441 -0
- package/README.es.md +441 -0
- package/README.fr.md +441 -0
- package/README.md +530 -0
- package/README.pt-BR.md +441 -0
- package/README.zh-CN.md +441 -0
- package/dist/bin/install-skills.d.ts +19 -0
- package/dist/bin/install-skills.d.ts.map +1 -0
- package/dist/bin/install-skills.js +218 -0
- package/dist/bin/install-skills.js.map +1 -0
- package/dist/chunker/index.d.ts +24 -0
- package/dist/chunker/index.d.ts.map +1 -0
- package/dist/chunker/index.js +2 -0
- package/dist/chunker/index.js.map +1 -0
- package/dist/chunker/semantic-chunker.d.ts +96 -0
- package/dist/chunker/semantic-chunker.d.ts.map +1 -0
- package/dist/chunker/semantic-chunker.js +362 -0
- package/dist/chunker/semantic-chunker.js.map +1 -0
- package/dist/chunker/sentence-splitter.d.ts +32 -0
- package/dist/chunker/sentence-splitter.d.ts.map +1 -0
- package/dist/chunker/sentence-splitter.js +231 -0
- package/dist/chunker/sentence-splitter.js.map +1 -0
- package/dist/chunker/token-containment.d.ts +39 -0
- package/dist/chunker/token-containment.d.ts.map +1 -0
- package/dist/chunker/token-containment.js +83 -0
- package/dist/chunker/token-containment.js.map +1 -0
- package/dist/cli/common.d.ts +34 -0
- package/dist/cli/common.d.ts.map +1 -0
- package/dist/cli/common.js +121 -0
- package/dist/cli/common.js.map +1 -0
- package/dist/cli/delete.d.ts +3 -0
- package/dist/cli/delete.d.ts.map +1 -0
- package/dist/cli/delete.js +169 -0
- package/dist/cli/delete.js.map +1 -0
- package/dist/cli/file-collection.d.ts +2 -0
- package/dist/cli/file-collection.d.ts.map +1 -0
- package/dist/cli/file-collection.js +53 -0
- package/dist/cli/file-collection.js.map +1 -0
- package/dist/cli/ingest.d.ts +69 -0
- package/dist/cli/ingest.d.ts.map +1 -0
- package/dist/cli/ingest.js +323 -0
- package/dist/cli/ingest.js.map +1 -0
- package/dist/cli/list.d.ts +27 -0
- package/dist/cli/list.d.ts.map +1 -0
- package/dist/cli/list.js +207 -0
- package/dist/cli/list.js.map +1 -0
- package/dist/cli/options.d.ts +89 -0
- package/dist/cli/options.d.ts.map +1 -0
- package/dist/cli/options.js +244 -0
- package/dist/cli/options.js.map +1 -0
- package/dist/cli/query.d.ts +17 -0
- package/dist/cli/query.d.ts.map +1 -0
- package/dist/cli/query.js +194 -0
- package/dist/cli/query.js.map +1 -0
- package/dist/cli/read-neighbors.d.ts +3 -0
- package/dist/cli/read-neighbors.d.ts.map +1 -0
- package/dist/cli/read-neighbors.js +192 -0
- package/dist/cli/read-neighbors.js.map +1 -0
- package/dist/cli/status.d.ts +6 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +78 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/sync.d.ts +6 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +271 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/cli-main.d.ts +9 -0
- package/dist/cli-main.d.ts.map +1 -0
- package/dist/cli-main.js +60 -0
- package/dist/cli-main.js.map +1 -0
- package/dist/embedder/index.d.ts +143 -0
- package/dist/embedder/index.d.ts.map +1 -0
- package/dist/embedder/index.js +429 -0
- package/dist/embedder/index.js.map +1 -0
- package/dist/embedder/remote.d.ts +51 -0
- package/dist/embedder/remote.d.ts.map +1 -0
- package/dist/embedder/remote.js +182 -0
- package/dist/embedder/remote.js.map +1 -0
- package/dist/features/list.d.ts +37 -0
- package/dist/features/list.d.ts.map +1 -0
- package/dist/features/list.js +41 -0
- package/dist/features/list.js.map +1 -0
- package/dist/features/sync.d.ts +219 -0
- package/dist/features/sync.d.ts.map +1 -0
- package/dist/features/sync.js +461 -0
- package/dist/features/sync.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/compute.d.ts +63 -0
- package/dist/ingest/compute.d.ts.map +1 -0
- package/dist/ingest/compute.js +161 -0
- package/dist/ingest/compute.js.map +1 -0
- package/dist/ingest/file.d.ts +40 -0
- package/dist/ingest/file.d.ts.map +1 -0
- package/dist/ingest/file.js +74 -0
- package/dist/ingest/file.js.map +1 -0
- package/dist/ingest/visual.d.ts +52 -0
- package/dist/ingest/visual.d.ts.map +1 -0
- package/dist/ingest/visual.js +294 -0
- package/dist/ingest/visual.js.map +1 -0
- package/dist/parser/docx-parser.d.ts +12 -0
- package/dist/parser/docx-parser.d.ts.map +1 -0
- package/dist/parser/docx-parser.js +375 -0
- package/dist/parser/docx-parser.js.map +1 -0
- package/dist/parser/html-parser.d.ts +16 -0
- package/dist/parser/html-parser.d.ts.map +1 -0
- package/dist/parser/html-parser.js +119 -0
- package/dist/parser/html-parser.js.map +1 -0
- package/dist/parser/index.d.ts +125 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +364 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/pdf-extract.d.ts +49 -0
- package/dist/parser/pdf-extract.d.ts.map +1 -0
- package/dist/parser/pdf-extract.js +114 -0
- package/dist/parser/pdf-extract.js.map +1 -0
- package/dist/parser/pdf-filter.d.ts +91 -0
- package/dist/parser/pdf-filter.d.ts.map +1 -0
- package/dist/parser/pdf-filter.js +522 -0
- package/dist/parser/pdf-filter.js.map +1 -0
- package/dist/parser/title-extractor.d.ts +28 -0
- package/dist/parser/title-extractor.d.ts.map +1 -0
- package/dist/parser/title-extractor.js +105 -0
- package/dist/parser/title-extractor.js.map +1 -0
- package/dist/pdf-visual/captioner.d.ts +11 -0
- package/dist/pdf-visual/captioner.d.ts.map +1 -0
- package/dist/pdf-visual/captioner.js +48 -0
- package/dist/pdf-visual/captioner.js.map +1 -0
- package/dist/pdf-visual/captioners/fast.d.ts +7 -0
- package/dist/pdf-visual/captioners/fast.d.ts.map +1 -0
- package/dist/pdf-visual/captioners/fast.js +108 -0
- package/dist/pdf-visual/captioners/fast.js.map +1 -0
- package/dist/pdf-visual/captioners/quality.d.ts +7 -0
- package/dist/pdf-visual/captioners/quality.d.ts.map +1 -0
- package/dist/pdf-visual/captioners/quality.js +101 -0
- package/dist/pdf-visual/captioners/quality.js.map +1 -0
- package/dist/pdf-visual/captioners/shared.d.ts +81 -0
- package/dist/pdf-visual/captioners/shared.d.ts.map +1 -0
- package/dist/pdf-visual/captioners/shared.js +156 -0
- package/dist/pdf-visual/captioners/shared.js.map +1 -0
- package/dist/pdf-visual/detector.d.ts +9 -0
- package/dist/pdf-visual/detector.d.ts.map +1 -0
- package/dist/pdf-visual/detector.js +269 -0
- package/dist/pdf-visual/detector.js.map +1 -0
- package/dist/pdf-visual/index.d.ts +13 -0
- package/dist/pdf-visual/index.d.ts.map +1 -0
- package/dist/pdf-visual/index.js +53 -0
- package/dist/pdf-visual/index.js.map +1 -0
- package/dist/pdf-visual/renderer.d.ts +9 -0
- package/dist/pdf-visual/renderer.d.ts.map +1 -0
- package/dist/pdf-visual/renderer.js +186 -0
- package/dist/pdf-visual/renderer.js.map +1 -0
- package/dist/pdf-visual/types.d.ts +53 -0
- package/dist/pdf-visual/types.d.ts.map +1 -0
- package/dist/pdf-visual/types.js +17 -0
- package/dist/pdf-visual/types.js.map +1 -0
- package/dist/server/error-utils.d.ts +63 -0
- package/dist/server/error-utils.d.ts.map +1 -0
- package/dist/server/error-utils.js +124 -0
- package/dist/server/error-utils.js.map +1 -0
- package/dist/server/index.d.ts +216 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +1068 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/list-scanner.d.ts +30 -0
- package/dist/server/list-scanner.d.ts.map +1 -0
- package/dist/server/list-scanner.js +50 -0
- package/dist/server/list-scanner.js.map +1 -0
- package/dist/server/tool-definitions.d.ts +8 -0
- package/dist/server/tool-definitions.d.ts.map +1 -0
- package/dist/server/tool-definitions.js +181 -0
- package/dist/server/tool-definitions.js.map +1 -0
- package/dist/server/tool-input.d.ts +37 -0
- package/dist/server/tool-input.d.ts.map +1 -0
- package/dist/server/tool-input.js +211 -0
- package/dist/server/tool-input.js.map +1 -0
- package/dist/server/types.d.ts +307 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +3 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server-main.d.ts +40 -0
- package/dist/server-main.d.ts.map +1 -0
- package/dist/server-main.js +254 -0
- package/dist/server-main.js.map +1 -0
- package/dist/utils/base-dirs.d.ts +145 -0
- package/dist/utils/base-dirs.d.ts.map +1 -0
- package/dist/utils/base-dirs.js +344 -0
- package/dist/utils/base-dirs.js.map +1 -0
- package/dist/utils/errors.d.ts +32 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +61 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/limits.d.ts +26 -0
- package/dist/utils/limits.d.ts.map +1 -0
- package/dist/utils/limits.js +28 -0
- package/dist/utils/limits.js.map +1 -0
- package/dist/utils/list-sources.d.ts +38 -0
- package/dist/utils/list-sources.d.ts.map +1 -0
- package/dist/utils/list-sources.js +40 -0
- package/dist/utils/list-sources.js.map +1 -0
- package/dist/utils/raw-data-utils.d.ts +76 -0
- package/dist/utils/raw-data-utils.d.ts.map +1 -0
- package/dist/utils/raw-data-utils.js +202 -0
- package/dist/utils/raw-data-utils.js.map +1 -0
- package/dist/utils/scan.d.ts +114 -0
- package/dist/utils/scan.d.ts.map +1 -0
- package/dist/utils/scan.js +209 -0
- package/dist/utils/scan.js.map +1 -0
- package/dist/utils/scope-match.d.ts +38 -0
- package/dist/utils/scope-match.d.ts.map +1 -0
- package/dist/utils/scope-match.js +86 -0
- package/dist/utils/scope-match.js.map +1 -0
- package/dist/utils/sensitive-path.d.ts +9 -0
- package/dist/utils/sensitive-path.d.ts.map +1 -0
- package/dist/utils/sensitive-path.js +78 -0
- package/dist/utils/sensitive-path.js.map +1 -0
- package/dist/utils/sync-path-key.d.ts +14 -0
- package/dist/utils/sync-path-key.d.ts.map +1 -0
- package/dist/utils/sync-path-key.js +27 -0
- package/dist/utils/sync-path-key.js.map +1 -0
- package/dist/utils/type-guards.d.ts +18 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +34 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/dist/utils/visual-profile.d.ts +10 -0
- package/dist/utils/visual-profile.d.ts.map +1 -0
- package/dist/utils/visual-profile.js +15 -0
- package/dist/utils/visual-profile.js.map +1 -0
- package/dist/vectordb/index.d.ts +132 -0
- package/dist/vectordb/index.d.ts.map +1 -0
- package/dist/vectordb/index.js +617 -0
- package/dist/vectordb/index.js.map +1 -0
- package/dist/vectordb/search-filters.d.ts +15 -0
- package/dist/vectordb/search-filters.d.ts.map +1 -0
- package/dist/vectordb/search-filters.js +129 -0
- package/dist/vectordb/search-filters.js.map +1 -0
- package/dist/vectordb/types.d.ts +194 -0
- package/dist/vectordb/types.d.ts.map +1 -0
- package/dist/vectordb/types.js +237 -0
- package/dist/vectordb/types.js.map +1 -0
- package/package.json +108 -0
- package/skills/mcp-local-rag/SKILL.md +234 -0
- package/skills/mcp-local-rag/references/cli-reference.md +190 -0
- package/skills/mcp-local-rag/references/html-ingestion.md +78 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
// CLI query subcommand — search ingested documents
|
|
2
|
+
import { MAX_QUERY_LIMIT, MIN_QUERY_LIMIT } from '../utils/limits.js';
|
|
3
|
+
import { extractSourceFromPath, isManagedRawDataPath } from '../utils/raw-data-utils.js';
|
|
4
|
+
import { createEmbedder, createVectorStore, formatCliError } from './common.js';
|
|
5
|
+
import { requireFlagValue, resolveGlobalConfig } from './options.js';
|
|
6
|
+
// ============================================
|
|
7
|
+
// Defaults
|
|
8
|
+
// ============================================
|
|
9
|
+
const QUERY_DEFAULTS = {
|
|
10
|
+
limit: 10,
|
|
11
|
+
};
|
|
12
|
+
// ============================================
|
|
13
|
+
// Help
|
|
14
|
+
// ============================================
|
|
15
|
+
const HELP_TEXT = `Usage: mcp-local-rag [global-options] query [options] <query-text>
|
|
16
|
+
|
|
17
|
+
Search ingested documents using hybrid vector + keyword matching.
|
|
18
|
+
|
|
19
|
+
Options:
|
|
20
|
+
--limit <n> Max results (default: ${QUERY_DEFAULTS.limit}, range: ${MIN_QUERY_LIMIT}-${MAX_QUERY_LIMIT})
|
|
21
|
+
--scope <prefix> Restrict results to a path prefix (repeatable for multiple prefixes)
|
|
22
|
+
-h, --help Show this help
|
|
23
|
+
|
|
24
|
+
Global options (must appear before "query"):
|
|
25
|
+
--db-path <path> LanceDB database path
|
|
26
|
+
--cache-dir <path> Model cache directory
|
|
27
|
+
--model-name <name> Embedding model`;
|
|
28
|
+
// ============================================
|
|
29
|
+
// Arg Parsing
|
|
30
|
+
// ============================================
|
|
31
|
+
/**
|
|
32
|
+
* Parse query-specific CLI arguments into options and a positional query text.
|
|
33
|
+
* Flags: --limit, --scope (repeatable), -h/--help
|
|
34
|
+
* Unknown flags (including global flags passed after subcommand) cause an error.
|
|
35
|
+
*/
|
|
36
|
+
/** Reject an unknown flag, or a second positional query text. */
|
|
37
|
+
function rejectUnexpectedArgument(arg, queryText) {
|
|
38
|
+
if (arg.startsWith('-')) {
|
|
39
|
+
console.error(`Unknown option: ${arg}`);
|
|
40
|
+
console.error(HELP_TEXT);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
if (queryText !== undefined) {
|
|
44
|
+
console.error(`Unexpected argument: ${arg}`);
|
|
45
|
+
console.error('Only one query text argument is accepted.');
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** Read one repeatable `--scope` value, rejecting an empty one. */
|
|
50
|
+
function requireScopeValue(args, flagIndex) {
|
|
51
|
+
const value = requireFlagValue(args, flagIndex, '--scope').trim();
|
|
52
|
+
if (value.length === 0) {
|
|
53
|
+
console.error('--scope value must not be empty');
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
58
|
+
export function parseArgs(args) {
|
|
59
|
+
const options = {};
|
|
60
|
+
let queryText;
|
|
61
|
+
let help = false;
|
|
62
|
+
let i = 0;
|
|
63
|
+
while (i < args.length) {
|
|
64
|
+
const arg = args[i] ?? '';
|
|
65
|
+
switch (arg) {
|
|
66
|
+
case '-h':
|
|
67
|
+
case '--help':
|
|
68
|
+
help = true;
|
|
69
|
+
i++;
|
|
70
|
+
break;
|
|
71
|
+
case '--limit': {
|
|
72
|
+
const value = requireFlagValue(args, i, '--limit');
|
|
73
|
+
if (!/^\d+$/.test(value)) {
|
|
74
|
+
console.error(`--limit must be between ${MIN_QUERY_LIMIT} and ${MAX_QUERY_LIMIT}`);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
options.limit = Number.parseInt(value, 10);
|
|
78
|
+
i += 2;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
case '--scope':
|
|
82
|
+
options.scope = [...(options.scope ?? []), requireScopeValue(args, i)];
|
|
83
|
+
i += 2;
|
|
84
|
+
break;
|
|
85
|
+
default:
|
|
86
|
+
rejectUnexpectedArgument(arg, queryText);
|
|
87
|
+
queryText = arg;
|
|
88
|
+
i++;
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return { queryText, options, help };
|
|
93
|
+
}
|
|
94
|
+
// ============================================
|
|
95
|
+
// Limit Validation
|
|
96
|
+
// ============================================
|
|
97
|
+
/**
|
|
98
|
+
* Validate and resolve the limit value.
|
|
99
|
+
* Returns the validated limit or exits with error.
|
|
100
|
+
*/
|
|
101
|
+
function resolveLimit(rawLimit) {
|
|
102
|
+
const limit = rawLimit ?? QUERY_DEFAULTS.limit;
|
|
103
|
+
if (!Number.isFinite(limit) || limit < MIN_QUERY_LIMIT || limit > MAX_QUERY_LIMIT) {
|
|
104
|
+
console.error(`--limit must be between ${MIN_QUERY_LIMIT} and ${MAX_QUERY_LIMIT}`);
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
return limit;
|
|
108
|
+
}
|
|
109
|
+
// ============================================
|
|
110
|
+
// Main Entry Point
|
|
111
|
+
// ============================================
|
|
112
|
+
/**
|
|
113
|
+
* Run the query CLI subcommand.
|
|
114
|
+
*/
|
|
115
|
+
export async function runQuery(args, globalOptions = {}) {
|
|
116
|
+
// Parse CLI options
|
|
117
|
+
const { queryText, options, help } = parseArgs(args);
|
|
118
|
+
// Handle --help
|
|
119
|
+
if (help) {
|
|
120
|
+
console.error(HELP_TEXT);
|
|
121
|
+
process.exit(0);
|
|
122
|
+
}
|
|
123
|
+
// Validate positional argument
|
|
124
|
+
if (!queryText) {
|
|
125
|
+
console.error('Usage: mcp-local-rag query [options] <query-text>');
|
|
126
|
+
console.error(' Search ingested documents.');
|
|
127
|
+
console.error(' Run with --help for all options.');
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
// Validate limit
|
|
131
|
+
const limit = resolveLimit(options.limit);
|
|
132
|
+
// Resolve global config
|
|
133
|
+
const globalConfig = resolveGlobalConfig(globalOptions);
|
|
134
|
+
// Initialize components
|
|
135
|
+
const vectorStore = createVectorStore(globalConfig);
|
|
136
|
+
const embedder = createEmbedder(globalConfig);
|
|
137
|
+
await vectorStore.initialize();
|
|
138
|
+
try {
|
|
139
|
+
// Generate query embedding
|
|
140
|
+
const embeddings = await embedder.embedBatch([queryText]);
|
|
141
|
+
const queryVector = embeddings[0];
|
|
142
|
+
if (!queryVector) {
|
|
143
|
+
throw new Error('Failed to generate query embedding');
|
|
144
|
+
}
|
|
145
|
+
// Hybrid search (vector + BM25). Thread scope only when present so the
|
|
146
|
+
// scope-absent call shape stays identical to the pre-flag behavior.
|
|
147
|
+
const searchResults = await vectorStore.search(queryVector, {
|
|
148
|
+
queryText,
|
|
149
|
+
limit,
|
|
150
|
+
...(options.scope ? { scope: options.scope } : {}),
|
|
151
|
+
});
|
|
152
|
+
let attachmentsByIdentity = new Map();
|
|
153
|
+
try {
|
|
154
|
+
const hydration = await vectorStore.hydrateVisualAttachments(searchResults);
|
|
155
|
+
attachmentsByIdentity = new Map(hydration.rows.map((row) => [row.id, row.attachments]));
|
|
156
|
+
if (hydration.omittedCount > 0) {
|
|
157
|
+
console.error(`Warning: omitted ${hydration.omittedCount} unavailable or malformed image attachment(s) from query results`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
console.error('Warning: image attachments could not be loaded; returning text results only');
|
|
162
|
+
}
|
|
163
|
+
// Format results with source restoration for raw-data files
|
|
164
|
+
const results = searchResults.map((result) => {
|
|
165
|
+
const output = {
|
|
166
|
+
filePath: result.filePath,
|
|
167
|
+
chunkIndex: result.chunkIndex,
|
|
168
|
+
text: result.text,
|
|
169
|
+
score: result.score,
|
|
170
|
+
fileTitle: result.fileTitle ?? null,
|
|
171
|
+
images: attachmentsByIdentity.get(result.id) ?? [],
|
|
172
|
+
};
|
|
173
|
+
if (isManagedRawDataPath(result.filePath, globalConfig.dbPath)) {
|
|
174
|
+
const source = extractSourceFromPath(result.filePath);
|
|
175
|
+
if (source) {
|
|
176
|
+
output.source = source;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return output;
|
|
180
|
+
});
|
|
181
|
+
// Output JSON to stdout
|
|
182
|
+
process.stdout.write(JSON.stringify(results, null, 2));
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
const reason = formatCliError(error);
|
|
186
|
+
console.error(`Error: ${reason}`);
|
|
187
|
+
process.exit(1);
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
await embedder.dispose();
|
|
191
|
+
await vectorStore.close();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/cli/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-neighbors.d.ts","sourceRoot":"","sources":["../../src/cli/read-neighbors.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AA0LjD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EAAE,EACd,aAAa,GAAE,aAAkB,GAChC,OAAO,CAAC,IAAI,CAAC,CAsDf"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
// CLI read-neighbors subcommand — read N chunks before/after a target chunk within one document
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { MAX_NEIGHBOR_COUNT } from '../utils/limits.js';
|
|
4
|
+
import { extractSourceFromPath, generateRawDataPath, isManagedRawDataPath, } from '../utils/raw-data-utils.js';
|
|
5
|
+
import { createVectorStore, formatCliError } from './common.js';
|
|
6
|
+
import { resolveGlobalConfig, validatePath } from './options.js';
|
|
7
|
+
// ============================================
|
|
8
|
+
// Defaults
|
|
9
|
+
// ============================================
|
|
10
|
+
const READ_NEIGHBORS_DEFAULTS = {
|
|
11
|
+
before: 2,
|
|
12
|
+
after: 2,
|
|
13
|
+
};
|
|
14
|
+
// ============================================
|
|
15
|
+
// Help
|
|
16
|
+
// ============================================
|
|
17
|
+
const HELP_TEXT = `Usage: mcp-local-rag [global-options] read-neighbors [options]
|
|
18
|
+
|
|
19
|
+
Read N chunks before and after a target chunk within the same document.
|
|
20
|
+
|
|
21
|
+
Either --file-path or --source is required, not both.
|
|
22
|
+
|
|
23
|
+
Options:
|
|
24
|
+
--file-path <abs-path> File path of ingested content (absolute path)
|
|
25
|
+
--source <id> Source identifier (for content ingested via ingest_data)
|
|
26
|
+
--chunk-index <n> Target chunk index (zero-based, required, non-negative integer)
|
|
27
|
+
--before <n> Number of chunks before the target (default: ${READ_NEIGHBORS_DEFAULTS.before}, non-negative integer)
|
|
28
|
+
--after <n> Number of chunks after the target (default: ${READ_NEIGHBORS_DEFAULTS.after}, non-negative integer)
|
|
29
|
+
-h, --help Show this help
|
|
30
|
+
|
|
31
|
+
Defaults: before=${READ_NEIGHBORS_DEFAULTS.before}, after=${READ_NEIGHBORS_DEFAULTS.after} (grep -C 2 convention)
|
|
32
|
+
|
|
33
|
+
Example:
|
|
34
|
+
npx mcp-local-rag read-neighbors --file-path /abs/path/file.md --chunk-index 12 --before 3 --after 3
|
|
35
|
+
|
|
36
|
+
Global options (must appear before "read-neighbors"):
|
|
37
|
+
--db-path <path> LanceDB database path
|
|
38
|
+
--cache-dir <path> Model cache directory
|
|
39
|
+
--model-name <name> Embedding model`;
|
|
40
|
+
/**
|
|
41
|
+
* Parse a value expected to be a non-negative integer flag value.
|
|
42
|
+
* Throws a descriptive Error on malformed input; the outer runReadNeighbors
|
|
43
|
+
* try/catch converts this into `console.error` + `process.exit(1)`.
|
|
44
|
+
*/
|
|
45
|
+
function parseNonNegativeInteger(flag, rawValue) {
|
|
46
|
+
if (rawValue === undefined || rawValue.startsWith('-')) {
|
|
47
|
+
throw new Error(`Missing value for ${flag}`);
|
|
48
|
+
}
|
|
49
|
+
const parsed = Number.parseInt(rawValue, 10);
|
|
50
|
+
if (!Number.isInteger(parsed) || parsed < 0 || String(parsed) !== rawValue) {
|
|
51
|
+
throw new Error(`${flag} must be a non-negative integer`);
|
|
52
|
+
}
|
|
53
|
+
return parsed;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parse read-neighbors CLI arguments.
|
|
57
|
+
* Flags: --file-path, --source, --chunk-index, --before, --after, -h/--help.
|
|
58
|
+
* Integer flags are validated syntactically (must be non-negative integer).
|
|
59
|
+
* Semantic validation (required-ness, XOR) is performed in runReadNeighbors.
|
|
60
|
+
*/
|
|
61
|
+
/** Flags whose value is taken verbatim, mapped to the field they fill. */
|
|
62
|
+
const STRING_FLAGS = new Map([
|
|
63
|
+
['--file-path', 'filePath'],
|
|
64
|
+
['--source', 'source'],
|
|
65
|
+
]);
|
|
66
|
+
/** Flags whose value must parse as a non-negative integer. */
|
|
67
|
+
const INTEGER_FLAGS = new Map([
|
|
68
|
+
['--chunk-index', 'chunkIndex'],
|
|
69
|
+
['--before', 'before'],
|
|
70
|
+
['--after', 'after'],
|
|
71
|
+
]);
|
|
72
|
+
/** Take a flag's value, rejecting an absent one or the next flag. */
|
|
73
|
+
function requireValue(flag, rawValue) {
|
|
74
|
+
if (rawValue === undefined || rawValue.startsWith('-')) {
|
|
75
|
+
throw new Error(`Missing value for ${flag}`);
|
|
76
|
+
}
|
|
77
|
+
return rawValue;
|
|
78
|
+
}
|
|
79
|
+
function parseArgs(args) {
|
|
80
|
+
const result = { help: false };
|
|
81
|
+
let i = 0;
|
|
82
|
+
while (i < args.length) {
|
|
83
|
+
const arg = args[i] ?? '';
|
|
84
|
+
if (arg === '-h' || arg === '--help') {
|
|
85
|
+
result.help = true;
|
|
86
|
+
i += 1;
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const stringKey = STRING_FLAGS.get(arg);
|
|
90
|
+
if (stringKey !== undefined) {
|
|
91
|
+
result[stringKey] = requireValue(arg, args[i + 1]);
|
|
92
|
+
i += 2;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const integerKey = INTEGER_FLAGS.get(arg);
|
|
96
|
+
if (integerKey !== undefined) {
|
|
97
|
+
result[integerKey] = parseNonNegativeInteger(arg, args[i + 1]);
|
|
98
|
+
i += 2;
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
throw new Error(arg.startsWith('-') ? `Unknown option: ${arg}` : `Unexpected argument: ${arg}`);
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Apply the same validation order as the MCP handler: chunkIndex, then the
|
|
107
|
+
* window bounds, then the file-path/source XOR.
|
|
108
|
+
*/
|
|
109
|
+
function validateRequest(parsed) {
|
|
110
|
+
if (parsed.chunkIndex === undefined) {
|
|
111
|
+
throw new Error('--chunk-index is required and must be a non-negative integer');
|
|
112
|
+
}
|
|
113
|
+
const before = parsed.before ?? READ_NEIGHBORS_DEFAULTS.before;
|
|
114
|
+
if (before > MAX_NEIGHBOR_COUNT) {
|
|
115
|
+
throw new Error(`before must be between 0 and ${MAX_NEIGHBOR_COUNT} (got ${before})`);
|
|
116
|
+
}
|
|
117
|
+
const after = parsed.after ?? READ_NEIGHBORS_DEFAULTS.after;
|
|
118
|
+
if (after > MAX_NEIGHBOR_COUNT) {
|
|
119
|
+
throw new Error(`after must be between 0 and ${MAX_NEIGHBOR_COUNT} (got ${after})`);
|
|
120
|
+
}
|
|
121
|
+
if (parsed.filePath === undefined && parsed.source === undefined) {
|
|
122
|
+
throw new Error('Either --file-path or --source is required');
|
|
123
|
+
}
|
|
124
|
+
if (parsed.filePath !== undefined && parsed.source !== undefined) {
|
|
125
|
+
throw new Error('Cannot specify both --file-path and --source');
|
|
126
|
+
}
|
|
127
|
+
return { chunkIndex: parsed.chunkIndex, before, after };
|
|
128
|
+
}
|
|
129
|
+
/** Resolve the document to read from either input form. */
|
|
130
|
+
function resolveTargetPath(parsed, dbPath) {
|
|
131
|
+
if (parsed.source !== undefined) {
|
|
132
|
+
return generateRawDataPath(dbPath, parsed.source);
|
|
133
|
+
}
|
|
134
|
+
// DB key is the resolve()'d ingest path, so look up by resolve() (never
|
|
135
|
+
// realpath); validate here (mirrors runDelete; realpath stays there).
|
|
136
|
+
const targetPath = resolve(parsed.filePath ?? '');
|
|
137
|
+
const pathError = validatePath(targetPath, '--file-path');
|
|
138
|
+
if (pathError) {
|
|
139
|
+
console.error(pathError);
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
return targetPath;
|
|
143
|
+
}
|
|
144
|
+
export async function runReadNeighbors(args, globalOptions = {}) {
|
|
145
|
+
// Parse CLI options (parse errors are caught and converted to exit(1) below).
|
|
146
|
+
let parsed;
|
|
147
|
+
try {
|
|
148
|
+
parsed = parseArgs(args);
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
const reason = formatCliError(error);
|
|
152
|
+
console.error(`Error: ${reason}`);
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
// Handle --help OUTSIDE the main try/catch so exit(0) is not converted to exit(1).
|
|
156
|
+
// Mirrors src/cli/delete.ts and src/cli/query.ts.
|
|
157
|
+
if (parsed.help) {
|
|
158
|
+
console.error(HELP_TEXT);
|
|
159
|
+
process.exit(0);
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
const request = validateRequest(parsed);
|
|
163
|
+
const globalConfig = resolveGlobalConfig(globalOptions);
|
|
164
|
+
const targetPath = resolveTargetPath(parsed, globalConfig.dbPath);
|
|
165
|
+
const vectorStore = createVectorStore(globalConfig);
|
|
166
|
+
try {
|
|
167
|
+
await vectorStore.initialize();
|
|
168
|
+
const rows = await vectorStore.getChunksByRange(targetPath, Math.max(0, request.chunkIndex - request.before), request.chunkIndex + request.after);
|
|
169
|
+
const sourceForAll = isManagedRawDataPath(targetPath, globalConfig.dbPath)
|
|
170
|
+
? extractSourceFromPath(targetPath)
|
|
171
|
+
: null;
|
|
172
|
+
const items = rows.map((row) => ({
|
|
173
|
+
filePath: row.filePath,
|
|
174
|
+
chunkIndex: row.chunkIndex,
|
|
175
|
+
text: row.text,
|
|
176
|
+
isTarget: row.chunkIndex === request.chunkIndex,
|
|
177
|
+
fileTitle: row.fileTitle ?? null,
|
|
178
|
+
...(sourceForAll ? { source: sourceForAll } : {}),
|
|
179
|
+
}));
|
|
180
|
+
process.stdout.write(`${JSON.stringify(items, null, 2)}\n`);
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
await vectorStore.close();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
const reason = formatCliError(error);
|
|
188
|
+
console.error(`Error: ${reason}`);
|
|
189
|
+
process.exitCode = 1;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=read-neighbors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-neighbors.js","sourceRoot":"","sources":["../../src/cli/read-neighbors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAoDjD;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,aAAa,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BhG"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// CLI status subcommand — show vector database status
|
|
2
|
+
import { createVectorStore, formatCliError } from './common.js';
|
|
3
|
+
import { resolveGlobalConfig } from './options.js';
|
|
4
|
+
// ============================================
|
|
5
|
+
// Help
|
|
6
|
+
// ============================================
|
|
7
|
+
const HELP_TEXT = `Usage: mcp-local-rag [global-options] status
|
|
8
|
+
|
|
9
|
+
Show vector database status (document count, chunk count, memory usage, etc.).
|
|
10
|
+
|
|
11
|
+
Options:
|
|
12
|
+
-h, --help Show this help
|
|
13
|
+
|
|
14
|
+
Global options (must appear before "status"):
|
|
15
|
+
--db-path <path> LanceDB database path
|
|
16
|
+
--cache-dir <path> Model cache directory
|
|
17
|
+
--model-name <name> Embedding model`;
|
|
18
|
+
// ============================================
|
|
19
|
+
// Arg Parsing
|
|
20
|
+
// ============================================
|
|
21
|
+
/**
|
|
22
|
+
* Parse status-specific CLI arguments.
|
|
23
|
+
* Status accepts no options or positional args — only -h/--help.
|
|
24
|
+
* Unknown flags or positional args cause an error.
|
|
25
|
+
*/
|
|
26
|
+
function parseArgs(args) {
|
|
27
|
+
let help = false;
|
|
28
|
+
for (const arg of args) {
|
|
29
|
+
if (arg === '-h' || arg === '--help') {
|
|
30
|
+
help = true;
|
|
31
|
+
}
|
|
32
|
+
else if (arg.startsWith('-')) {
|
|
33
|
+
console.error(`Unknown option: ${arg}`);
|
|
34
|
+
console.error(HELP_TEXT);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
console.error(`Unexpected argument: ${arg}`);
|
|
39
|
+
console.error(HELP_TEXT);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return { help };
|
|
44
|
+
}
|
|
45
|
+
// ============================================
|
|
46
|
+
// Main Entry Point
|
|
47
|
+
// ============================================
|
|
48
|
+
/**
|
|
49
|
+
* Run the status CLI subcommand.
|
|
50
|
+
*/
|
|
51
|
+
export async function runStatus(args, globalOptions = {}) {
|
|
52
|
+
// Parse CLI options
|
|
53
|
+
const { help } = parseArgs(args);
|
|
54
|
+
// Handle --help
|
|
55
|
+
if (help) {
|
|
56
|
+
console.error(HELP_TEXT);
|
|
57
|
+
process.exit(0);
|
|
58
|
+
}
|
|
59
|
+
// Resolve global config
|
|
60
|
+
const globalConfig = resolveGlobalConfig(globalOptions);
|
|
61
|
+
const vectorStore = createVectorStore(globalConfig);
|
|
62
|
+
try {
|
|
63
|
+
await vectorStore.initialize();
|
|
64
|
+
// Get status
|
|
65
|
+
const status = await vectorStore.getStatus();
|
|
66
|
+
// Output JSON to stdout
|
|
67
|
+
process.stdout.write(JSON.stringify(status));
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
const reason = formatCliError(error);
|
|
71
|
+
console.error(`Error: ${reason}`);
|
|
72
|
+
process.exitCode = 1;
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
await vectorStore.close();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,+CAA+C;AAC/C,OAAO;AACP,+CAA+C;AAE/C,MAAM,SAAS,GAAG;;;;;;;;;;yCAUuB,CAAA;AAEzC,+CAA+C;AAC/C,cAAc;AACd,+CAA+C;AAE/C;;;;GAIG;AACH,SAAS,SAAS,CAAC,IAAc;IAC/B,IAAI,IAAI,GAAG,KAAK,CAAA;IAEhB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrC,IAAI,GAAG,IAAI,CAAA;QACb,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAA;YACvC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAA;YAC5C,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,CAAA;AACjB,CAAC;AAED,+CAA+C;AAC/C,mBAAmB;AACnB,+CAA+C;AAE/C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc,EAAE,aAAa,GAAkB,EAAE;IAC/E,oBAAoB;IACpB,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAEhC,gBAAgB;IAChB,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,wBAAwB;IACxB,MAAM,YAAY,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAA;IACvD,MAAM,WAAW,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAA;IAEnD,IAAI,CAAC;QACH,MAAM,WAAW,CAAC,UAAU,EAAE,CAAA;QAE9B,aAAa;QACb,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,CAAA;QAE5C,wBAAwB;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;QACpC,OAAO,CAAC,KAAK,CAAC,UAAU,MAAM,EAAE,CAAC,CAAA;QACjC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;IACtB,CAAC;YAAS,CAAC;QACT,MAAM,WAAW,CAAC,KAAK,EAAE,CAAA;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/cli/sync.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAmKjD;;GAEG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,aAAa,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6I9F"}
|