@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.
Files changed (247) hide show
  1. package/LICENSE +21 -0
  2. package/README.de.md +441 -0
  3. package/README.es.md +441 -0
  4. package/README.fr.md +441 -0
  5. package/README.md +530 -0
  6. package/README.pt-BR.md +441 -0
  7. package/README.zh-CN.md +441 -0
  8. package/dist/bin/install-skills.d.ts +19 -0
  9. package/dist/bin/install-skills.d.ts.map +1 -0
  10. package/dist/bin/install-skills.js +218 -0
  11. package/dist/bin/install-skills.js.map +1 -0
  12. package/dist/chunker/index.d.ts +24 -0
  13. package/dist/chunker/index.d.ts.map +1 -0
  14. package/dist/chunker/index.js +2 -0
  15. package/dist/chunker/index.js.map +1 -0
  16. package/dist/chunker/semantic-chunker.d.ts +96 -0
  17. package/dist/chunker/semantic-chunker.d.ts.map +1 -0
  18. package/dist/chunker/semantic-chunker.js +362 -0
  19. package/dist/chunker/semantic-chunker.js.map +1 -0
  20. package/dist/chunker/sentence-splitter.d.ts +32 -0
  21. package/dist/chunker/sentence-splitter.d.ts.map +1 -0
  22. package/dist/chunker/sentence-splitter.js +231 -0
  23. package/dist/chunker/sentence-splitter.js.map +1 -0
  24. package/dist/chunker/token-containment.d.ts +39 -0
  25. package/dist/chunker/token-containment.d.ts.map +1 -0
  26. package/dist/chunker/token-containment.js +83 -0
  27. package/dist/chunker/token-containment.js.map +1 -0
  28. package/dist/cli/common.d.ts +34 -0
  29. package/dist/cli/common.d.ts.map +1 -0
  30. package/dist/cli/common.js +121 -0
  31. package/dist/cli/common.js.map +1 -0
  32. package/dist/cli/delete.d.ts +3 -0
  33. package/dist/cli/delete.d.ts.map +1 -0
  34. package/dist/cli/delete.js +169 -0
  35. package/dist/cli/delete.js.map +1 -0
  36. package/dist/cli/file-collection.d.ts +2 -0
  37. package/dist/cli/file-collection.d.ts.map +1 -0
  38. package/dist/cli/file-collection.js +53 -0
  39. package/dist/cli/file-collection.js.map +1 -0
  40. package/dist/cli/ingest.d.ts +69 -0
  41. package/dist/cli/ingest.d.ts.map +1 -0
  42. package/dist/cli/ingest.js +323 -0
  43. package/dist/cli/ingest.js.map +1 -0
  44. package/dist/cli/list.d.ts +27 -0
  45. package/dist/cli/list.d.ts.map +1 -0
  46. package/dist/cli/list.js +207 -0
  47. package/dist/cli/list.js.map +1 -0
  48. package/dist/cli/options.d.ts +89 -0
  49. package/dist/cli/options.d.ts.map +1 -0
  50. package/dist/cli/options.js +244 -0
  51. package/dist/cli/options.js.map +1 -0
  52. package/dist/cli/query.d.ts +17 -0
  53. package/dist/cli/query.d.ts.map +1 -0
  54. package/dist/cli/query.js +194 -0
  55. package/dist/cli/query.js.map +1 -0
  56. package/dist/cli/read-neighbors.d.ts +3 -0
  57. package/dist/cli/read-neighbors.d.ts.map +1 -0
  58. package/dist/cli/read-neighbors.js +192 -0
  59. package/dist/cli/read-neighbors.js.map +1 -0
  60. package/dist/cli/status.d.ts +6 -0
  61. package/dist/cli/status.d.ts.map +1 -0
  62. package/dist/cli/status.js +78 -0
  63. package/dist/cli/status.js.map +1 -0
  64. package/dist/cli/sync.d.ts +6 -0
  65. package/dist/cli/sync.d.ts.map +1 -0
  66. package/dist/cli/sync.js +271 -0
  67. package/dist/cli/sync.js.map +1 -0
  68. package/dist/cli-main.d.ts +9 -0
  69. package/dist/cli-main.d.ts.map +1 -0
  70. package/dist/cli-main.js +60 -0
  71. package/dist/cli-main.js.map +1 -0
  72. package/dist/embedder/index.d.ts +143 -0
  73. package/dist/embedder/index.d.ts.map +1 -0
  74. package/dist/embedder/index.js +429 -0
  75. package/dist/embedder/index.js.map +1 -0
  76. package/dist/embedder/remote.d.ts +51 -0
  77. package/dist/embedder/remote.d.ts.map +1 -0
  78. package/dist/embedder/remote.js +182 -0
  79. package/dist/embedder/remote.js.map +1 -0
  80. package/dist/features/list.d.ts +37 -0
  81. package/dist/features/list.d.ts.map +1 -0
  82. package/dist/features/list.js +41 -0
  83. package/dist/features/list.js.map +1 -0
  84. package/dist/features/sync.d.ts +219 -0
  85. package/dist/features/sync.d.ts.map +1 -0
  86. package/dist/features/sync.js +461 -0
  87. package/dist/features/sync.js.map +1 -0
  88. package/dist/index.d.ts +3 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +56 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/ingest/compute.d.ts +63 -0
  93. package/dist/ingest/compute.d.ts.map +1 -0
  94. package/dist/ingest/compute.js +161 -0
  95. package/dist/ingest/compute.js.map +1 -0
  96. package/dist/ingest/file.d.ts +40 -0
  97. package/dist/ingest/file.d.ts.map +1 -0
  98. package/dist/ingest/file.js +74 -0
  99. package/dist/ingest/file.js.map +1 -0
  100. package/dist/ingest/visual.d.ts +52 -0
  101. package/dist/ingest/visual.d.ts.map +1 -0
  102. package/dist/ingest/visual.js +294 -0
  103. package/dist/ingest/visual.js.map +1 -0
  104. package/dist/parser/docx-parser.d.ts +12 -0
  105. package/dist/parser/docx-parser.d.ts.map +1 -0
  106. package/dist/parser/docx-parser.js +375 -0
  107. package/dist/parser/docx-parser.js.map +1 -0
  108. package/dist/parser/html-parser.d.ts +16 -0
  109. package/dist/parser/html-parser.d.ts.map +1 -0
  110. package/dist/parser/html-parser.js +119 -0
  111. package/dist/parser/html-parser.js.map +1 -0
  112. package/dist/parser/index.d.ts +125 -0
  113. package/dist/parser/index.d.ts.map +1 -0
  114. package/dist/parser/index.js +364 -0
  115. package/dist/parser/index.js.map +1 -0
  116. package/dist/parser/pdf-extract.d.ts +49 -0
  117. package/dist/parser/pdf-extract.d.ts.map +1 -0
  118. package/dist/parser/pdf-extract.js +114 -0
  119. package/dist/parser/pdf-extract.js.map +1 -0
  120. package/dist/parser/pdf-filter.d.ts +91 -0
  121. package/dist/parser/pdf-filter.d.ts.map +1 -0
  122. package/dist/parser/pdf-filter.js +522 -0
  123. package/dist/parser/pdf-filter.js.map +1 -0
  124. package/dist/parser/title-extractor.d.ts +28 -0
  125. package/dist/parser/title-extractor.d.ts.map +1 -0
  126. package/dist/parser/title-extractor.js +105 -0
  127. package/dist/parser/title-extractor.js.map +1 -0
  128. package/dist/pdf-visual/captioner.d.ts +11 -0
  129. package/dist/pdf-visual/captioner.d.ts.map +1 -0
  130. package/dist/pdf-visual/captioner.js +48 -0
  131. package/dist/pdf-visual/captioner.js.map +1 -0
  132. package/dist/pdf-visual/captioners/fast.d.ts +7 -0
  133. package/dist/pdf-visual/captioners/fast.d.ts.map +1 -0
  134. package/dist/pdf-visual/captioners/fast.js +108 -0
  135. package/dist/pdf-visual/captioners/fast.js.map +1 -0
  136. package/dist/pdf-visual/captioners/quality.d.ts +7 -0
  137. package/dist/pdf-visual/captioners/quality.d.ts.map +1 -0
  138. package/dist/pdf-visual/captioners/quality.js +101 -0
  139. package/dist/pdf-visual/captioners/quality.js.map +1 -0
  140. package/dist/pdf-visual/captioners/shared.d.ts +81 -0
  141. package/dist/pdf-visual/captioners/shared.d.ts.map +1 -0
  142. package/dist/pdf-visual/captioners/shared.js +156 -0
  143. package/dist/pdf-visual/captioners/shared.js.map +1 -0
  144. package/dist/pdf-visual/detector.d.ts +9 -0
  145. package/dist/pdf-visual/detector.d.ts.map +1 -0
  146. package/dist/pdf-visual/detector.js +269 -0
  147. package/dist/pdf-visual/detector.js.map +1 -0
  148. package/dist/pdf-visual/index.d.ts +13 -0
  149. package/dist/pdf-visual/index.d.ts.map +1 -0
  150. package/dist/pdf-visual/index.js +53 -0
  151. package/dist/pdf-visual/index.js.map +1 -0
  152. package/dist/pdf-visual/renderer.d.ts +9 -0
  153. package/dist/pdf-visual/renderer.d.ts.map +1 -0
  154. package/dist/pdf-visual/renderer.js +186 -0
  155. package/dist/pdf-visual/renderer.js.map +1 -0
  156. package/dist/pdf-visual/types.d.ts +53 -0
  157. package/dist/pdf-visual/types.d.ts.map +1 -0
  158. package/dist/pdf-visual/types.js +17 -0
  159. package/dist/pdf-visual/types.js.map +1 -0
  160. package/dist/server/error-utils.d.ts +63 -0
  161. package/dist/server/error-utils.d.ts.map +1 -0
  162. package/dist/server/error-utils.js +124 -0
  163. package/dist/server/error-utils.js.map +1 -0
  164. package/dist/server/index.d.ts +216 -0
  165. package/dist/server/index.d.ts.map +1 -0
  166. package/dist/server/index.js +1068 -0
  167. package/dist/server/index.js.map +1 -0
  168. package/dist/server/list-scanner.d.ts +30 -0
  169. package/dist/server/list-scanner.d.ts.map +1 -0
  170. package/dist/server/list-scanner.js +50 -0
  171. package/dist/server/list-scanner.js.map +1 -0
  172. package/dist/server/tool-definitions.d.ts +8 -0
  173. package/dist/server/tool-definitions.d.ts.map +1 -0
  174. package/dist/server/tool-definitions.js +181 -0
  175. package/dist/server/tool-definitions.js.map +1 -0
  176. package/dist/server/tool-input.d.ts +37 -0
  177. package/dist/server/tool-input.d.ts.map +1 -0
  178. package/dist/server/tool-input.js +211 -0
  179. package/dist/server/tool-input.js.map +1 -0
  180. package/dist/server/types.d.ts +307 -0
  181. package/dist/server/types.d.ts.map +1 -0
  182. package/dist/server/types.js +3 -0
  183. package/dist/server/types.js.map +1 -0
  184. package/dist/server-main.d.ts +40 -0
  185. package/dist/server-main.d.ts.map +1 -0
  186. package/dist/server-main.js +254 -0
  187. package/dist/server-main.js.map +1 -0
  188. package/dist/utils/base-dirs.d.ts +145 -0
  189. package/dist/utils/base-dirs.d.ts.map +1 -0
  190. package/dist/utils/base-dirs.js +344 -0
  191. package/dist/utils/base-dirs.js.map +1 -0
  192. package/dist/utils/errors.d.ts +32 -0
  193. package/dist/utils/errors.d.ts.map +1 -0
  194. package/dist/utils/errors.js +61 -0
  195. package/dist/utils/errors.js.map +1 -0
  196. package/dist/utils/limits.d.ts +26 -0
  197. package/dist/utils/limits.d.ts.map +1 -0
  198. package/dist/utils/limits.js +28 -0
  199. package/dist/utils/limits.js.map +1 -0
  200. package/dist/utils/list-sources.d.ts +38 -0
  201. package/dist/utils/list-sources.d.ts.map +1 -0
  202. package/dist/utils/list-sources.js +40 -0
  203. package/dist/utils/list-sources.js.map +1 -0
  204. package/dist/utils/raw-data-utils.d.ts +76 -0
  205. package/dist/utils/raw-data-utils.d.ts.map +1 -0
  206. package/dist/utils/raw-data-utils.js +202 -0
  207. package/dist/utils/raw-data-utils.js.map +1 -0
  208. package/dist/utils/scan.d.ts +114 -0
  209. package/dist/utils/scan.d.ts.map +1 -0
  210. package/dist/utils/scan.js +209 -0
  211. package/dist/utils/scan.js.map +1 -0
  212. package/dist/utils/scope-match.d.ts +38 -0
  213. package/dist/utils/scope-match.d.ts.map +1 -0
  214. package/dist/utils/scope-match.js +86 -0
  215. package/dist/utils/scope-match.js.map +1 -0
  216. package/dist/utils/sensitive-path.d.ts +9 -0
  217. package/dist/utils/sensitive-path.d.ts.map +1 -0
  218. package/dist/utils/sensitive-path.js +78 -0
  219. package/dist/utils/sensitive-path.js.map +1 -0
  220. package/dist/utils/sync-path-key.d.ts +14 -0
  221. package/dist/utils/sync-path-key.d.ts.map +1 -0
  222. package/dist/utils/sync-path-key.js +27 -0
  223. package/dist/utils/sync-path-key.js.map +1 -0
  224. package/dist/utils/type-guards.d.ts +18 -0
  225. package/dist/utils/type-guards.d.ts.map +1 -0
  226. package/dist/utils/type-guards.js +34 -0
  227. package/dist/utils/type-guards.js.map +1 -0
  228. package/dist/utils/visual-profile.d.ts +10 -0
  229. package/dist/utils/visual-profile.d.ts.map +1 -0
  230. package/dist/utils/visual-profile.js +15 -0
  231. package/dist/utils/visual-profile.js.map +1 -0
  232. package/dist/vectordb/index.d.ts +132 -0
  233. package/dist/vectordb/index.d.ts.map +1 -0
  234. package/dist/vectordb/index.js +617 -0
  235. package/dist/vectordb/index.js.map +1 -0
  236. package/dist/vectordb/search-filters.d.ts +15 -0
  237. package/dist/vectordb/search-filters.d.ts.map +1 -0
  238. package/dist/vectordb/search-filters.js +129 -0
  239. package/dist/vectordb/search-filters.js.map +1 -0
  240. package/dist/vectordb/types.d.ts +194 -0
  241. package/dist/vectordb/types.d.ts.map +1 -0
  242. package/dist/vectordb/types.js +237 -0
  243. package/dist/vectordb/types.js.map +1 -0
  244. package/package.json +108 -0
  245. package/skills/mcp-local-rag/SKILL.md +234 -0
  246. package/skills/mcp-local-rag/references/cli-reference.md +190 -0
  247. 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,3 @@
1
+ import type { GlobalOptions } from './options.js';
2
+ export declare function runReadNeighbors(args: string[], globalOptions?: GlobalOptions): Promise<void>;
3
+ //# sourceMappingURL=read-neighbors.d.ts.map
@@ -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,6 @@
1
+ import type { GlobalOptions } from './options.js';
2
+ /**
3
+ * Run the status CLI subcommand.
4
+ */
5
+ export declare function runStatus(args: string[], globalOptions?: GlobalOptions): Promise<void>;
6
+ //# sourceMappingURL=status.d.ts.map
@@ -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,6 @@
1
+ import type { GlobalOptions } from './options.js';
2
+ /**
3
+ * Run the sync CLI subcommand.
4
+ */
5
+ export declare function runSync(args: string[], globalOptions?: GlobalOptions): Promise<void>;
6
+ //# sourceMappingURL=sync.d.ts.map
@@ -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"}