abb-opencode-local-rag 0.1.0

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 (233) hide show
  1. package/LICENSE +21 -0
  2. package/README.de.md +416 -0
  3. package/README.es.md +416 -0
  4. package/README.fr.md +416 -0
  5. package/README.md +491 -0
  6. package/README.pt-BR.md +416 -0
  7. package/README.zh-CN.md +416 -0
  8. package/dist/bin/install-skills.d.ts +20 -0
  9. package/dist/bin/install-skills.d.ts.map +1 -0
  10. package/dist/bin/install-skills.js +195 -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 +97 -0
  17. package/dist/chunker/semantic-chunker.d.ts.map +1 -0
  18. package/dist/chunker/semantic-chunker.js +294 -0
  19. package/dist/chunker/semantic-chunker.js.map +1 -0
  20. package/dist/chunker/sentence-splitter.d.ts +28 -0
  21. package/dist/chunker/sentence-splitter.d.ts.map +1 -0
  22. package/dist/chunker/sentence-splitter.js +219 -0
  23. package/dist/chunker/sentence-splitter.js.map +1 -0
  24. package/dist/cli/common.d.ts +65 -0
  25. package/dist/cli/common.d.ts.map +1 -0
  26. package/dist/cli/common.js +138 -0
  27. package/dist/cli/common.js.map +1 -0
  28. package/dist/cli/delete.d.ts +8 -0
  29. package/dist/cli/delete.d.ts.map +1 -0
  30. package/dist/cli/delete.js +173 -0
  31. package/dist/cli/delete.js.map +1 -0
  32. package/dist/cli/file-collection.d.ts +2 -0
  33. package/dist/cli/file-collection.d.ts.map +1 -0
  34. package/dist/cli/file-collection.js +53 -0
  35. package/dist/cli/file-collection.js.map +1 -0
  36. package/dist/cli/ingest.d.ts +100 -0
  37. package/dist/cli/ingest.d.ts.map +1 -0
  38. package/dist/cli/ingest.js +363 -0
  39. package/dist/cli/ingest.js.map +1 -0
  40. package/dist/cli/list.d.ts +35 -0
  41. package/dist/cli/list.d.ts.map +1 -0
  42. package/dist/cli/list.js +210 -0
  43. package/dist/cli/list.js.map +1 -0
  44. package/dist/cli/options.d.ts +100 -0
  45. package/dist/cli/options.d.ts.map +1 -0
  46. package/dist/cli/options.js +241 -0
  47. package/dist/cli/options.js.map +1 -0
  48. package/dist/cli/query.d.ts +24 -0
  49. package/dist/cli/query.d.ts.map +1 -0
  50. package/dist/cli/query.js +191 -0
  51. package/dist/cli/query.js.map +1 -0
  52. package/dist/cli/read-neighbors.d.ts +11 -0
  53. package/dist/cli/read-neighbors.d.ts.map +1 -0
  54. package/dist/cli/read-neighbors.js +224 -0
  55. package/dist/cli/read-neighbors.js.map +1 -0
  56. package/dist/cli/status.d.ts +8 -0
  57. package/dist/cli/status.d.ts.map +1 -0
  58. package/dist/cli/status.js +80 -0
  59. package/dist/cli/status.js.map +1 -0
  60. package/dist/cli/sync.d.ts +8 -0
  61. package/dist/cli/sync.d.ts.map +1 -0
  62. package/dist/cli/sync.js +244 -0
  63. package/dist/cli/sync.js.map +1 -0
  64. package/dist/cli-main.d.ts +12 -0
  65. package/dist/cli-main.d.ts.map +1 -0
  66. package/dist/cli-main.js +63 -0
  67. package/dist/cli-main.js.map +1 -0
  68. package/dist/embedder/index.d.ts +85 -0
  69. package/dist/embedder/index.d.ts.map +1 -0
  70. package/dist/embedder/index.js +284 -0
  71. package/dist/embedder/index.js.map +1 -0
  72. package/dist/features/list.d.ts +37 -0
  73. package/dist/features/list.d.ts.map +1 -0
  74. package/dist/features/list.js +40 -0
  75. package/dist/features/list.js.map +1 -0
  76. package/dist/features/sync.d.ts +207 -0
  77. package/dist/features/sync.d.ts.map +1 -0
  78. package/dist/features/sync.js +380 -0
  79. package/dist/features/sync.js.map +1 -0
  80. package/dist/index.d.ts +3 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +53 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/ingest/compute.d.ts +86 -0
  85. package/dist/ingest/compute.d.ts.map +1 -0
  86. package/dist/ingest/compute.js +177 -0
  87. package/dist/ingest/compute.js.map +1 -0
  88. package/dist/ingest/file.d.ts +27 -0
  89. package/dist/ingest/file.d.ts.map +1 -0
  90. package/dist/ingest/file.js +67 -0
  91. package/dist/ingest/file.js.map +1 -0
  92. package/dist/ingest/visual.d.ts +45 -0
  93. package/dist/ingest/visual.d.ts.map +1 -0
  94. package/dist/ingest/visual.js +234 -0
  95. package/dist/ingest/visual.js.map +1 -0
  96. package/dist/parser/docx-parser.d.ts +12 -0
  97. package/dist/parser/docx-parser.d.ts.map +1 -0
  98. package/dist/parser/docx-parser.js +328 -0
  99. package/dist/parser/docx-parser.js.map +1 -0
  100. package/dist/parser/html-parser.d.ts +18 -0
  101. package/dist/parser/html-parser.d.ts.map +1 -0
  102. package/dist/parser/html-parser.js +102 -0
  103. package/dist/parser/html-parser.js.map +1 -0
  104. package/dist/parser/index.d.ts +214 -0
  105. package/dist/parser/index.d.ts.map +1 -0
  106. package/dist/parser/index.js +454 -0
  107. package/dist/parser/index.js.map +1 -0
  108. package/dist/parser/pdf-extract.d.ts +81 -0
  109. package/dist/parser/pdf-extract.d.ts.map +1 -0
  110. package/dist/parser/pdf-extract.js +112 -0
  111. package/dist/parser/pdf-extract.js.map +1 -0
  112. package/dist/parser/pdf-filter.d.ts +117 -0
  113. package/dist/parser/pdf-filter.d.ts.map +1 -0
  114. package/dist/parser/pdf-filter.js +528 -0
  115. package/dist/parser/pdf-filter.js.map +1 -0
  116. package/dist/parser/title-extractor.d.ts +69 -0
  117. package/dist/parser/title-extractor.d.ts.map +1 -0
  118. package/dist/parser/title-extractor.js +145 -0
  119. package/dist/parser/title-extractor.js.map +1 -0
  120. package/dist/pdf-visual/captioner.d.ts +16 -0
  121. package/dist/pdf-visual/captioner.d.ts.map +1 -0
  122. package/dist/pdf-visual/captioner.js +63 -0
  123. package/dist/pdf-visual/captioner.js.map +1 -0
  124. package/dist/pdf-visual/captioners/fast.d.ts +7 -0
  125. package/dist/pdf-visual/captioners/fast.d.ts.map +1 -0
  126. package/dist/pdf-visual/captioners/fast.js +103 -0
  127. package/dist/pdf-visual/captioners/fast.js.map +1 -0
  128. package/dist/pdf-visual/captioners/quality.d.ts +7 -0
  129. package/dist/pdf-visual/captioners/quality.d.ts.map +1 -0
  130. package/dist/pdf-visual/captioners/quality.js +127 -0
  131. package/dist/pdf-visual/captioners/quality.js.map +1 -0
  132. package/dist/pdf-visual/captioners/shared.d.ts +44 -0
  133. package/dist/pdf-visual/captioners/shared.d.ts.map +1 -0
  134. package/dist/pdf-visual/captioners/shared.js +104 -0
  135. package/dist/pdf-visual/captioners/shared.js.map +1 -0
  136. package/dist/pdf-visual/detector.d.ts +9 -0
  137. package/dist/pdf-visual/detector.d.ts.map +1 -0
  138. package/dist/pdf-visual/detector.js +234 -0
  139. package/dist/pdf-visual/detector.js.map +1 -0
  140. package/dist/pdf-visual/index.d.ts +13 -0
  141. package/dist/pdf-visual/index.d.ts.map +1 -0
  142. package/dist/pdf-visual/index.js +45 -0
  143. package/dist/pdf-visual/index.js.map +1 -0
  144. package/dist/pdf-visual/renderer.d.ts +9 -0
  145. package/dist/pdf-visual/renderer.d.ts.map +1 -0
  146. package/dist/pdf-visual/renderer.js +177 -0
  147. package/dist/pdf-visual/renderer.js.map +1 -0
  148. package/dist/pdf-visual/types.d.ts +62 -0
  149. package/dist/pdf-visual/types.d.ts.map +1 -0
  150. package/dist/pdf-visual/types.js +32 -0
  151. package/dist/pdf-visual/types.js.map +1 -0
  152. package/dist/server/error-utils.d.ts +79 -0
  153. package/dist/server/error-utils.d.ts.map +1 -0
  154. package/dist/server/error-utils.js +148 -0
  155. package/dist/server/error-utils.js.map +1 -0
  156. package/dist/server/index.d.ts +258 -0
  157. package/dist/server/index.d.ts.map +1 -0
  158. package/dist/server/index.js +1104 -0
  159. package/dist/server/index.js.map +1 -0
  160. package/dist/server/list-scanner.d.ts +52 -0
  161. package/dist/server/list-scanner.d.ts.map +1 -0
  162. package/dist/server/list-scanner.js +72 -0
  163. package/dist/server/list-scanner.js.map +1 -0
  164. package/dist/server/tool-definitions.d.ts +8 -0
  165. package/dist/server/tool-definitions.d.ts.map +1 -0
  166. package/dist/server/tool-definitions.js +181 -0
  167. package/dist/server/tool-definitions.js.map +1 -0
  168. package/dist/server/tool-input.d.ts +37 -0
  169. package/dist/server/tool-input.d.ts.map +1 -0
  170. package/dist/server/tool-input.js +216 -0
  171. package/dist/server/tool-input.js.map +1 -0
  172. package/dist/server/types.d.ts +331 -0
  173. package/dist/server/types.d.ts.map +1 -0
  174. package/dist/server/types.js +3 -0
  175. package/dist/server/types.js.map +1 -0
  176. package/dist/server-main.d.ts +46 -0
  177. package/dist/server-main.d.ts.map +1 -0
  178. package/dist/server-main.js +242 -0
  179. package/dist/server-main.js.map +1 -0
  180. package/dist/utils/base-dirs.d.ts +212 -0
  181. package/dist/utils/base-dirs.d.ts.map +1 -0
  182. package/dist/utils/base-dirs.js +422 -0
  183. package/dist/utils/base-dirs.js.map +1 -0
  184. package/dist/utils/errors.d.ts +24 -0
  185. package/dist/utils/errors.d.ts.map +1 -0
  186. package/dist/utils/errors.js +53 -0
  187. package/dist/utils/errors.js.map +1 -0
  188. package/dist/utils/limits.d.ts +26 -0
  189. package/dist/utils/limits.d.ts.map +1 -0
  190. package/dist/utils/limits.js +28 -0
  191. package/dist/utils/limits.js.map +1 -0
  192. package/dist/utils/list-sources.d.ts +47 -0
  193. package/dist/utils/list-sources.d.ts.map +1 -0
  194. package/dist/utils/list-sources.js +50 -0
  195. package/dist/utils/list-sources.js.map +1 -0
  196. package/dist/utils/raw-data-utils.d.ts +131 -0
  197. package/dist/utils/raw-data-utils.d.ts.map +1 -0
  198. package/dist/utils/raw-data-utils.js +255 -0
  199. package/dist/utils/raw-data-utils.js.map +1 -0
  200. package/dist/utils/scan.d.ts +126 -0
  201. package/dist/utils/scan.d.ts.map +1 -0
  202. package/dist/utils/scan.js +221 -0
  203. package/dist/utils/scan.js.map +1 -0
  204. package/dist/utils/scope-match.d.ts +43 -0
  205. package/dist/utils/scope-match.d.ts.map +1 -0
  206. package/dist/utils/scope-match.js +87 -0
  207. package/dist/utils/scope-match.js.map +1 -0
  208. package/dist/utils/sensitive-path.d.ts +23 -0
  209. package/dist/utils/sensitive-path.d.ts.map +1 -0
  210. package/dist/utils/sensitive-path.js +91 -0
  211. package/dist/utils/sensitive-path.js.map +1 -0
  212. package/dist/utils/sync-path-key.d.ts +20 -0
  213. package/dist/utils/sync-path-key.d.ts.map +1 -0
  214. package/dist/utils/sync-path-key.js +33 -0
  215. package/dist/utils/sync-path-key.js.map +1 -0
  216. package/dist/vectordb/index.d.ts +168 -0
  217. package/dist/vectordb/index.d.ts.map +1 -0
  218. package/dist/vectordb/index.js +619 -0
  219. package/dist/vectordb/index.js.map +1 -0
  220. package/dist/vectordb/search-filters.d.ts +39 -0
  221. package/dist/vectordb/search-filters.d.ts.map +1 -0
  222. package/dist/vectordb/search-filters.js +136 -0
  223. package/dist/vectordb/search-filters.js.map +1 -0
  224. package/dist/vectordb/types.d.ts +196 -0
  225. package/dist/vectordb/types.d.ts.map +1 -0
  226. package/dist/vectordb/types.js +224 -0
  227. package/dist/vectordb/types.js.map +1 -0
  228. package/package.json +105 -0
  229. package/skills/mcp-local-rag/SKILL.md +308 -0
  230. package/skills/mcp-local-rag/references/cli-reference.md +175 -0
  231. package/skills/mcp-local-rag/references/html-ingestion.md +78 -0
  232. package/skills/mcp-local-rag/references/query-optimization.md +57 -0
  233. package/skills/mcp-local-rag/references/result-refinement.md +56 -0
@@ -0,0 +1,224 @@
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
+ function parseArgs(args) {
62
+ let help = false;
63
+ let filePath;
64
+ let source;
65
+ let chunkIndex;
66
+ let before;
67
+ let after;
68
+ let i = 0;
69
+ while (i < args.length) {
70
+ const arg = args[i];
71
+ if (arg === '-h' || arg === '--help') {
72
+ help = true;
73
+ i++;
74
+ }
75
+ else if (arg === '--file-path') {
76
+ const value = args[++i];
77
+ if (value === undefined || value.startsWith('-')) {
78
+ throw new Error('Missing value for --file-path');
79
+ }
80
+ filePath = value;
81
+ i++;
82
+ }
83
+ else if (arg === '--source') {
84
+ const value = args[++i];
85
+ if (value === undefined || value.startsWith('-')) {
86
+ throw new Error('Missing value for --source');
87
+ }
88
+ source = value;
89
+ i++;
90
+ }
91
+ else if (arg === '--chunk-index') {
92
+ chunkIndex = parseNonNegativeInteger('--chunk-index', args[++i]);
93
+ i++;
94
+ }
95
+ else if (arg === '--before') {
96
+ before = parseNonNegativeInteger('--before', args[++i]);
97
+ i++;
98
+ }
99
+ else if (arg === '--after') {
100
+ after = parseNonNegativeInteger('--after', args[++i]);
101
+ i++;
102
+ }
103
+ else if (arg.startsWith('-')) {
104
+ throw new Error(`Unknown option: ${arg}`);
105
+ }
106
+ else {
107
+ throw new Error(`Unexpected argument: ${arg}`);
108
+ }
109
+ }
110
+ const result = { help };
111
+ if (filePath !== undefined)
112
+ result.filePath = filePath;
113
+ if (source !== undefined)
114
+ result.source = source;
115
+ if (chunkIndex !== undefined)
116
+ result.chunkIndex = chunkIndex;
117
+ if (before !== undefined)
118
+ result.before = before;
119
+ if (after !== undefined)
120
+ result.after = after;
121
+ return result;
122
+ }
123
+ // ============================================
124
+ // Main Entry Point
125
+ // ============================================
126
+ /**
127
+ * Run the read-neighbors CLI subcommand.
128
+ * Reads chunks adjacent to a target chunkIndex within a single document.
129
+ * Does NOT perform any search; this is an index-adjacent retrieval utility.
130
+ *
131
+ * @param args - Arguments after "read-neighbors"
132
+ * @param globalOptions - Global options parsed before the subcommand
133
+ */
134
+ export async function runReadNeighbors(args, globalOptions = {}) {
135
+ // Parse CLI options (parse errors are caught and converted to exit(1) below).
136
+ let parsed;
137
+ try {
138
+ parsed = parseArgs(args);
139
+ }
140
+ catch (error) {
141
+ const reason = formatCliError(error);
142
+ console.error(`Error: ${reason}`);
143
+ process.exit(1);
144
+ }
145
+ // Handle --help OUTSIDE the main try/catch so exit(0) is not converted to exit(1).
146
+ // Mirrors src/cli/delete.ts and src/cli/query.ts.
147
+ if (parsed.help) {
148
+ console.error(HELP_TEXT);
149
+ process.exit(0);
150
+ }
151
+ try {
152
+ // Validation order matches the MCP handler: chunkIndex → before → after → XOR.
153
+ if (parsed.chunkIndex === undefined) {
154
+ throw new Error('--chunk-index is required and must be a non-negative integer');
155
+ }
156
+ const chunkIndex = parsed.chunkIndex;
157
+ const before = parsed.before ?? READ_NEIGHBORS_DEFAULTS.before;
158
+ if (before > MAX_NEIGHBOR_COUNT) {
159
+ throw new Error(`before must be between 0 and ${MAX_NEIGHBOR_COUNT} (got ${before})`);
160
+ }
161
+ const after = parsed.after ?? READ_NEIGHBORS_DEFAULTS.after;
162
+ if (after > MAX_NEIGHBOR_COUNT) {
163
+ throw new Error(`after must be between 0 and ${MAX_NEIGHBOR_COUNT} (got ${after})`);
164
+ }
165
+ // XOR: exactly one of --file-path / --source
166
+ const hasFilePath = parsed.filePath !== undefined;
167
+ const hasSource = parsed.source !== undefined;
168
+ if (!hasFilePath && !hasSource) {
169
+ throw new Error('Either --file-path or --source is required');
170
+ }
171
+ if (hasFilePath && hasSource) {
172
+ throw new Error('Cannot specify both --file-path and --source');
173
+ }
174
+ // Resolve global config
175
+ const globalConfig = resolveGlobalConfig(globalOptions);
176
+ // Determine target file path (dual-input resolution).
177
+ let targetPath;
178
+ if (parsed.source !== undefined) {
179
+ // Generate raw-data path from source identifier.
180
+ targetPath = generateRawDataPath(globalConfig.dbPath, parsed.source);
181
+ }
182
+ else {
183
+ // DB key is the resolve()'d ingest path, so look up by resolve() (never
184
+ // realpath); validate below (mirrors runDelete; realpath stays there).
185
+ targetPath = resolve(parsed.filePath);
186
+ const pathError = validatePath(targetPath, '--file-path');
187
+ if (pathError) {
188
+ console.error(pathError);
189
+ process.exit(1);
190
+ }
191
+ }
192
+ const vectorStore = createVectorStore(globalConfig);
193
+ try {
194
+ await vectorStore.initialize();
195
+ const minIdx = Math.max(0, chunkIndex - before);
196
+ const maxIdx = chunkIndex + after;
197
+ const rows = await vectorStore.getChunksByRange(targetPath, minIdx, maxIdx);
198
+ const isRaw = isManagedRawDataPath(targetPath, globalConfig.dbPath);
199
+ const sourceForAll = isRaw ? extractSourceFromPath(targetPath) : null;
200
+ const items = rows.map((row) => {
201
+ const item = {
202
+ filePath: row.filePath,
203
+ chunkIndex: row.chunkIndex,
204
+ text: row.text,
205
+ isTarget: row.chunkIndex === chunkIndex,
206
+ fileTitle: row.fileTitle ?? null,
207
+ };
208
+ if (sourceForAll)
209
+ item.source = sourceForAll;
210
+ return item;
211
+ });
212
+ process.stdout.write(`${JSON.stringify(items, null, 2)}\n`);
213
+ }
214
+ finally {
215
+ await vectorStore.close();
216
+ }
217
+ }
218
+ catch (error) {
219
+ const reason = formatCliError(error);
220
+ console.error(`Error: ${reason}`);
221
+ process.exitCode = 1;
222
+ }
223
+ }
224
+ //# 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,8 @@
1
+ import type { GlobalOptions } from './options.js';
2
+ /**
3
+ * Run the status CLI subcommand.
4
+ * @param args - Arguments after "status" (should be empty or --help)
5
+ * @param globalOptions - Global options parsed before the subcommand
6
+ */
7
+ export declare function runStatus(args: string[], globalOptions?: GlobalOptions): Promise<void>;
8
+ //# 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;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,aAAa,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BhG"}
@@ -0,0 +1,80 @@
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
+ * @param args - Arguments after "status" (should be empty or --help)
51
+ * @param globalOptions - Global options parsed before the subcommand
52
+ */
53
+ export async function runStatus(args, globalOptions = {}) {
54
+ // Parse CLI options
55
+ const { help } = parseArgs(args);
56
+ // Handle --help
57
+ if (help) {
58
+ console.error(HELP_TEXT);
59
+ process.exit(0);
60
+ }
61
+ // Resolve global config
62
+ const globalConfig = resolveGlobalConfig(globalOptions);
63
+ const vectorStore = createVectorStore(globalConfig);
64
+ try {
65
+ await vectorStore.initialize();
66
+ // Get status
67
+ const status = await vectorStore.getStatus();
68
+ // Output JSON to stdout
69
+ process.stdout.write(JSON.stringify(status));
70
+ }
71
+ catch (error) {
72
+ const reason = formatCliError(error);
73
+ console.error(`Error: ${reason}`);
74
+ process.exitCode = 1;
75
+ }
76
+ finally {
77
+ await vectorStore.close();
78
+ }
79
+ }
80
+ //# 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;;;;GAIG;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,8 @@
1
+ import type { GlobalOptions } from './options.js';
2
+ /**
3
+ * Run the sync CLI subcommand.
4
+ * @param args - Arguments after "sync"
5
+ * @param globalOptions - Global options parsed before the subcommand
6
+ */
7
+ export declare function runSync(args: string[], globalOptions?: GlobalOptions): Promise<void>;
8
+ //# 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;AAgIjD;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,aAAa,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6I9F"}
@@ -0,0 +1,244 @@
1
+ // CLI sync subcommand — foreground incremental reconciliation of the index.
2
+ //
3
+ // Composition root for `src/features/sync.ts`: this file supplies the real
4
+ // collaborators (filesystem, scanner, hasher, store, ingestion) and renders the
5
+ // result. Planning, prune eligibility, execution order, and the stop-on-first-
6
+ // error policy all live in the core and are not reproduced here — including the
7
+ // "inside a configured root" check, which the core answers by composing
8
+ // `toSyncPathKey` with the unchanged `isUnderOrEqual`.
9
+ //
10
+ // The run stays attached to the process until it completes: backgrounding and
11
+ // polling belong to the caller (SYNC-005), so there is no daemon, poller, or
12
+ // watchdog here.
13
+ import { readFile, stat } from 'node:fs/promises';
14
+ import { resolve, sep } from 'node:path';
15
+ import { SemanticChunker } from '../chunker/index.js';
16
+ import { formatSyncError, runSync as runSyncCore, } from '../features/sync.js';
17
+ import { computeContentHash } from '../ingest/compute.js';
18
+ import { DocumentParser } from '../parser/index.js';
19
+ import { MAX_SCAN_DEPTH } from '../utils/limits.js';
20
+ import { bfsCollectSupportedFiles, canonicalizeRequestedPath, classifyRequestedPath, } from '../utils/scan.js';
21
+ import { createEmbedder, createVectorStore, formatCliError } from './common.js';
22
+ import { ingestSingleFile, resolveConfig } from './ingest.js';
23
+ import { consumeBaseDirArg, resolveGlobalConfig } from './options.js';
24
+ // ============================================
25
+ // Help
26
+ // ============================================
27
+ const HELP_TEXT = `Usage: mcp-local-rag [global-options] sync [options] [path]
28
+
29
+ Reconcile the index with the files on disk: ingest new and changed files, leave
30
+ unchanged files alone, and remove index entries for files that are gone.
31
+
32
+ Runs in the foreground until it finishes. Use your shell to run it in the
33
+ background.
34
+
35
+ Arguments:
36
+ <path> File or directory inside a configured base directory
37
+ (default: every configured base directory)
38
+
39
+ Options:
40
+ --base-dir <path> Document root (repeatable; overrides environment roots)
41
+ --images Store images for new/changed PDF and DOCX files
42
+ -h, --help Show this help
43
+
44
+ Without --base-dir, roots come from BASE_DIRS / BASE_DIR (default: current directory).
45
+
46
+ Global options (must appear before "sync"):
47
+ --db-path <path> LanceDB database path
48
+ --cache-dir <path> Model cache directory
49
+ --model-name <name> Embedding model`;
50
+ /**
51
+ * Parse sync-specific CLI arguments: repeatable roots, at most one positional
52
+ * path, and -h/--help. Unknown flags still print the usage and exit 1.
53
+ */
54
+ function parseArgs(args) {
55
+ let help = false;
56
+ const baseDirs = [];
57
+ let path;
58
+ let images = false;
59
+ let index = 0;
60
+ while (index < args.length) {
61
+ const arg = args[index];
62
+ switch (arg) {
63
+ case '-h':
64
+ case '--help':
65
+ help = true;
66
+ index++;
67
+ break;
68
+ case '--base-dir': {
69
+ const valueIndex = consumeBaseDirArg(args, index, baseDirs);
70
+ index = valueIndex + 1;
71
+ break;
72
+ }
73
+ case '--images':
74
+ images = true;
75
+ index++;
76
+ break;
77
+ default:
78
+ if (arg.startsWith('-')) {
79
+ console.error(`Unknown option: ${arg}`);
80
+ console.error(HELP_TEXT);
81
+ process.exit(1);
82
+ }
83
+ if (path !== undefined) {
84
+ console.error(`Unexpected argument: ${arg}`);
85
+ console.error('Only one path is accepted. Omit it to sync every configured base directory.');
86
+ process.exit(1);
87
+ }
88
+ path = arg;
89
+ index++;
90
+ break;
91
+ }
92
+ }
93
+ const parsed = { help, baseDirs, images };
94
+ if (path !== undefined)
95
+ parsed.path = path;
96
+ return parsed;
97
+ }
98
+ // ============================================
99
+ // Reporting
100
+ // ============================================
101
+ /**
102
+ * Render the scanner's coverage facts as operator warnings. Each unobserved
103
+ * region is why prune was withheld there, so the path is named; the wording
104
+ * itself is not a contract.
105
+ */
106
+ function coverageWarnings(coverage, maxFileSize) {
107
+ return [
108
+ ...coverage.unreadableDirs.map(({ dirPath, code }) => `Warning: cannot read directory (${code}), so its indexed files were kept: ${dirPath}`),
109
+ ...coverage.depthLimitedDirs.map((dirPath) => `Warning: not scanned because it exceeds the maximum depth (${MAX_SCAN_DEPTH}), so its indexed files were kept: ${dirPath}`),
110
+ ...coverage.skippedSymlinks.map((linkPath) => `Warning: symbolic link not followed, so its indexed files were kept: ${linkPath}`),
111
+ ...coverage.oversizedFiles.map((filePath) => `Warning: not read because it exceeds the maximum file size (${maxFileSize} bytes), so its indexed chunks were kept: ${filePath}`),
112
+ ];
113
+ }
114
+ // ============================================
115
+ // Main Entry Point
116
+ // ============================================
117
+ /**
118
+ * Run the sync CLI subcommand.
119
+ * @param args - Arguments after "sync"
120
+ * @param globalOptions - Global options parsed before the subcommand
121
+ */
122
+ export async function runSync(args, globalOptions = {}) {
123
+ const parsed = parseArgs(args);
124
+ if (parsed.help) {
125
+ console.error(HELP_TEXT);
126
+ process.exit(0);
127
+ }
128
+ const globalConfig = resolveGlobalConfig(globalOptions);
129
+ // Shared with `ingest`: CLI roots replace BASE_DIRS / BASE_DIR / cwd; an empty
130
+ // array preserves that environment fallback. Size/chunk settings share the
131
+ // same resolution and validation path.
132
+ const config = await resolveConfig(globalConfig, { baseDirs: parsed.baseDirs });
133
+ for (const warning of config.baseDirsWarnings) {
134
+ console.error(warning.message);
135
+ }
136
+ const excludePaths = [`${resolve(config.dbPath)}${sep}`, `${resolve(config.cacheDir)}${sep}`];
137
+ const vectorStore = createVectorStore(globalConfig);
138
+ // The parser's realpath check is the security boundary, so it takes the
139
+ // realpath'd roots; scanning uses the resolve()-only `rawBaseDirs` so scanned
140
+ // paths match the resolve()-stored DB keys (same split as `list`).
141
+ const parser = new DocumentParser({
142
+ baseDirs: config.baseDirs.baseDirs,
143
+ maxFileSize: config.maxFileSize,
144
+ });
145
+ const chunker = new SemanticChunker(config.chunkMinLength !== undefined ? { minChunkLength: config.chunkMinLength } : {});
146
+ // Built on the first upsert only: a run with nothing to ingest must not pay
147
+ // for the embedding model.
148
+ let embedder;
149
+ const ensureEmbedder = () => {
150
+ embedder ??= createEmbedder(globalConfig);
151
+ return embedder;
152
+ };
153
+ const collaborators = {
154
+ // The containment boundary for a requested path: the core compares this
155
+ // canonical form against the realpath'd roots, which is the only way to see
156
+ // that an intermediate component is a symbolic link out of the root.
157
+ canonicalizeRequestedPath,
158
+ // The walker's own predicates, so an explicitly requested path is subject to
159
+ // the same rules as a discovered one and is refused before it is read.
160
+ classifyPath: async (path) => await classifyRequestedPath(path, excludePaths),
161
+ // No `scope` argument, on purpose: a scope-pruned directory appears in none
162
+ // of the coverage arrays, which would hide an unobserved region and make
163
+ // prune unsafe.
164
+ scanDir: async (rootPath) => await bfsCollectSupportedFiles(rootPath, excludePaths, MAX_SCAN_DEPTH),
165
+ // Size first, bytes second: `MAX_FILE_SIZE` is otherwise enforced inside the
166
+ // parser, which runs long after the whole file would already be in memory
167
+ // here. Declining (`null`) keeps the rest of the run usable instead of
168
+ // aborting every future sync of the whole root on one oversized file.
169
+ //
170
+ // The bound holds only against a non-racing filesystem: a writer that grows
171
+ // the file, or replaces it with a FIFO, between the `stat` and the `readFile`
172
+ // restores the unbounded read or an indefinite block. That actor needs local
173
+ // write access as this same user and can already reach the database directly,
174
+ // so this is a recorded limitation rather than a defended boundary — as with
175
+ // the watchdog limitation noted on `requestedPathRejection`.
176
+ hashFile: async (filePath) => {
177
+ if ((await stat(filePath)).size > config.maxFileSize)
178
+ return null;
179
+ return computeContentHash(await readFile(filePath));
180
+ },
181
+ loadDbManifest: async () => await vectorStore.listChunkHashes(),
182
+ // Named as it happens, so a long run shows which file it is on and the
183
+ // counters alone are not the only record of what changed. A zero-chunk file
184
+ // already reports itself from inside `ingestSingleFile`.
185
+ ingestFile: async (filePath, images) => {
186
+ const ingestOptions = images
187
+ ? { visual: false, images: true }
188
+ : { visual: false, images: false };
189
+ const chunkCount = await ingestSingleFile(filePath, parser, chunker, ensureEmbedder(), vectorStore, ingestOptions);
190
+ if (chunkCount > 0)
191
+ console.error(`upserted ${filePath} (${chunkCount} chunks)`);
192
+ return chunkCount;
193
+ },
194
+ deleteExactPath: async (filePath) => await vectorStore.deleteChunks(filePath),
195
+ optimize: async () => {
196
+ await vectorStore.optimize();
197
+ },
198
+ };
199
+ try {
200
+ await vectorStore.initialize();
201
+ const result = await runSyncCore({
202
+ roots: config.baseDirs.rawBaseDirs,
203
+ // The realpath'd counterpart of the same roots, which is what the core
204
+ // decides requested-path containment in (the parser's boundary domain).
205
+ canonicalRoots: config.baseDirs.baseDirs,
206
+ dbPath: config.dbPath,
207
+ excludePaths,
208
+ platform: process.platform,
209
+ // resolve() (never realpath) so the requested path is spelled like the
210
+ // stored DB keys; the core validates it against the configured roots.
211
+ ...(parsed.path === undefined ? {} : { requestedPath: resolve(parsed.path) }),
212
+ ...(parsed.images ? { images: true } : {}),
213
+ collaborators,
214
+ });
215
+ for (const prunedPath of result.prunedPaths) {
216
+ console.error(`pruned ${prunedPath}`);
217
+ }
218
+ for (const warning of coverageWarnings(result.coverage, config.maxFileSize)) {
219
+ console.error(warning);
220
+ }
221
+ if (result.error !== null) {
222
+ console.error(`Error: ${formatSyncError(result.error)}`);
223
+ process.exitCode = 1;
224
+ return;
225
+ }
226
+ process.stdout.write(JSON.stringify({
227
+ upserted: result.upserted,
228
+ skipped: result.skipped,
229
+ empty: result.empty,
230
+ pruned: result.pruned,
231
+ }));
232
+ }
233
+ catch (error) {
234
+ console.error(`Error: ${formatCliError(error)}`);
235
+ process.exitCode = 1;
236
+ }
237
+ finally {
238
+ if (embedder !== undefined) {
239
+ await embedder.dispose();
240
+ }
241
+ await vectorStore.close();
242
+ }
243
+ }
244
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/cli/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { GlobalOptions } from './cli/options.js';
2
+ export declare const SUBCOMMANDS: readonly ['skills', 'ingest', 'list', 'query', 'status', 'delete', 'read-neighbors', 'sync'];
3
+ export type Subcommand = (typeof SUBCOMMANDS)[number];
4
+ /**
5
+ * Handle CLI subcommands. The caller is expected to have already validated
6
+ * `subcommand` against `SUBCOMMANDS`; the union type makes the switch exhaustive.
7
+ * @param subcommand - The validated subcommand name
8
+ * @param args - Arguments following the subcommand (subcommand itself excluded)
9
+ * @param globalOptions - Global options parsed before the subcommand
10
+ */
11
+ export declare function handleCli(subcommand: Subcommand, args: string[], globalOptions?: GlobalOptions): Promise<void>;
12
+ //# sourceMappingURL=cli-main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-main.d.ts","sourceRoot":"","sources":["../src/cli-main.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAMrD,eAAO,MAAM,WAAW,YACtB,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,MAAM,CACE,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAErD;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,MAAM,EAAE,EACd,aAAa,GAAE,aAAkB,GAChC,OAAO,CAAC,IAAI,CAAC,CA2Cf"}