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,100 @@
1
+ /**
2
+ * Validate that a path is not a sensitive system directory.
3
+ * Delegates to the shared `checkSensitivePath` helper so the CLI and the
4
+ * MCP server entry point share one policy implementation.
5
+ *
6
+ * Returns an error message if invalid, or undefined if valid.
7
+ */
8
+ export declare function validatePath(value: string, flagName: string): string | undefined;
9
+ /**
10
+ * Validate model name against allowed pattern.
11
+ * Returns an error message if invalid, or undefined if valid.
12
+ */
13
+ export declare function validateModelName(value: string): string | undefined;
14
+ /**
15
+ * Validate max file size is within acceptable range.
16
+ * Returns an error message if invalid, or undefined if valid.
17
+ */
18
+ export declare function validateMaxFileSize(value: number): string | undefined;
19
+ /**
20
+ * Validate chunk minimum length is within acceptable range.
21
+ * Returns an error message if invalid, or undefined if valid.
22
+ */
23
+ export declare function validateChunkMinLength(value: number): string | undefined;
24
+ /**
25
+ * Consume the value that follows a `--base-dir` flag and append it to
26
+ * `collected`. Designed to be called from each subcommand's argv loop so
27
+ * `--base-dir <path>` can be provided one or more times, with the order
28
+ * preserved.
29
+ *
30
+ * `argv` is the full argv slice the loop is iterating; `flagIndex` is the
31
+ * index of the `--base-dir` token itself. On success returns the index of
32
+ * the value (so the caller can advance past it). On failure prints
33
+ * `Missing value for --base-dir` to stderr and calls `process.exit(1)` —
34
+ * matching the existing single-value error path so callers don't have to
35
+ * special-case the new shape.
36
+ *
37
+ * Why a shared helper: `ingest`, `list`, and `sync` parse `--base-dir` in
38
+ * identical fashion, so centralizing the accumulate-and-validate step keeps
39
+ * their argv loops in lockstep when the contract evolves.
40
+ */
41
+ export declare function consumeBaseDirArg(argv: string[], flagIndex: number, collected: string[]): number;
42
+ /**
43
+ * Read the required value that follows a value-taking flag at `argv[flagIndex]`.
44
+ * Centralizes the identical "missing value" guard every value flag used to
45
+ * inline (`--db-path`, `--cache-dir`, `--model-name`, `--max-file-size`,
46
+ * `--chunk-min-length`, `--limit`): when the next token is absent or is itself
47
+ * a flag, prints `Missing value for <flag>` and exits 1. The caller advances
48
+ * its index by 2 (flag + value). Numeric flags apply their own format/range
49
+ * validation to the returned string.
50
+ */
51
+ export declare function requireFlagValue(argv: string[], flagIndex: number, flag: string): string;
52
+ export interface GlobalOptions {
53
+ dbPath?: string | undefined;
54
+ cacheDir?: string | undefined;
55
+ modelName?: string | undefined;
56
+ }
57
+ export interface ParsedGlobalResult {
58
+ globalOptions: GlobalOptions;
59
+ remainingArgs: string[];
60
+ }
61
+ export interface ResolvedGlobalConfig {
62
+ dbPath: string;
63
+ cacheDir: string;
64
+ modelName: string;
65
+ }
66
+ export declare const GLOBAL_DEFAULTS: {
67
+ readonly dbPath: './lancedb/';
68
+ readonly cacheDir: './models/';
69
+ readonly modelName: 'Xenova/all-MiniLM-L6-v2';
70
+ };
71
+ export declare const ROOT_HELP_TEXT: string;
72
+ /**
73
+ * Extract global options (--db-path, --cache-dir, --model-name, -h/--help)
74
+ * from the argument list and return them along with the remaining args.
75
+ *
76
+ * Global options are only recognized BEFORE the first non-flag argument
77
+ * (the subcommand). After the subcommand, everything is forwarded as-is.
78
+ */
79
+ export declare function parseGlobalOptions(args: string[]): ParsedGlobalResult;
80
+ /**
81
+ * Resolve global config with priority: CLI flags > environment variables > defaults.
82
+ * Validates all resolved values before returning.
83
+ */
84
+ export declare function resolveGlobalConfig(options: GlobalOptions): ResolvedGlobalConfig;
85
+ /**
86
+ * Resolve RAG_DEVICE. The value is passed through to transformers.js — no
87
+ * allowlist is maintained here. Whitespace-only is treated as unset.
88
+ */
89
+ export declare function resolveDevice(value: string | undefined): string;
90
+ /**
91
+ * Resolve RAG_DTYPE. Like resolveDevice, the value is passed through to
92
+ * transformers.js with no allowlist. Unlike resolveDevice, unset/whitespace-only
93
+ * resolves to `undefined` (NOT a default dtype): the fp32 default literal lives
94
+ * solely in Embedder.initialize(), and `undefined` is the only signal that
95
+ * distinguishes "RAG_DTYPE unset" from an explicit "RAG_DTYPE=fp32". That
96
+ * distinction gates failure-path error enrichment, so it must not be collapsed
97
+ * into a default here.
98
+ */
99
+ export declare function resolveDtype(value: string | undefined): string | undefined;
100
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"AASA;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEhF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASnE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKxE;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAShG;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOxF;AAMD,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAA;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAMD,eAAO,MAAM,eAAe;aAC1B,MAAM,EAAE,YAAY;aACpB,QAAQ,EAAE,WAAW;aACrB,SAAS,EAAE,yBAAyB;CAC5B,CAAA;AAMV,eAAO,MAAM,cAAc,QAgBiC,CAAA;AAM5D;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAsDrE;AAMD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,oBAAoB,CA0BhF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAG/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAG1E"}
@@ -0,0 +1,241 @@
1
+ // Shared CLI global options — parsed before subcommand routing
2
+ import { MAX_CHUNK_MIN_LENGTH, MAX_FILE_SIZE_LIMIT } from '../utils/limits.js';
3
+ import { checkSensitivePath } from '../utils/sensitive-path.js';
4
+ // ============================================
5
+ // Validation Helpers
6
+ // ============================================
7
+ /**
8
+ * Validate that a path is not a sensitive system directory.
9
+ * Delegates to the shared `checkSensitivePath` helper so the CLI and the
10
+ * MCP server entry point share one policy implementation.
11
+ *
12
+ * Returns an error message if invalid, or undefined if valid.
13
+ */
14
+ export function validatePath(value, flagName) {
15
+ return checkSensitivePath(value, flagName);
16
+ }
17
+ /**
18
+ * Validate model name against allowed pattern.
19
+ * Returns an error message if invalid, or undefined if valid.
20
+ */
21
+ export function validateModelName(value) {
22
+ const pattern = /^[a-zA-Z0-9_\-./]+$/;
23
+ if (!pattern.test(value)) {
24
+ return `Invalid model name: ${value}. Only alphanumeric, '_', '-', '.', '/' allowed.`;
25
+ }
26
+ if (value.includes('..')) {
27
+ return `Invalid model name: ${value}. Path traversal ('..') is not allowed.`;
28
+ }
29
+ return undefined;
30
+ }
31
+ /**
32
+ * Validate max file size is within acceptable range.
33
+ * Returns an error message if invalid, or undefined if valid.
34
+ */
35
+ export function validateMaxFileSize(value) {
36
+ if (!Number.isFinite(value) || value < 1 || value > MAX_FILE_SIZE_LIMIT) {
37
+ return `--max-file-size must be between 1 and ${MAX_FILE_SIZE_LIMIT} (500MB)`;
38
+ }
39
+ return undefined;
40
+ }
41
+ /**
42
+ * Validate chunk minimum length is within acceptable range.
43
+ * Returns an error message if invalid, or undefined if valid.
44
+ */
45
+ export function validateChunkMinLength(value) {
46
+ if (!Number.isFinite(value) || value < 1 || value > MAX_CHUNK_MIN_LENGTH) {
47
+ return `--chunk-min-length must be between 1 and ${MAX_CHUNK_MIN_LENGTH}`;
48
+ }
49
+ return undefined;
50
+ }
51
+ // ============================================
52
+ // Repeatable --base-dir parsing
53
+ // ============================================
54
+ /**
55
+ * Consume the value that follows a `--base-dir` flag and append it to
56
+ * `collected`. Designed to be called from each subcommand's argv loop so
57
+ * `--base-dir <path>` can be provided one or more times, with the order
58
+ * preserved.
59
+ *
60
+ * `argv` is the full argv slice the loop is iterating; `flagIndex` is the
61
+ * index of the `--base-dir` token itself. On success returns the index of
62
+ * the value (so the caller can advance past it). On failure prints
63
+ * `Missing value for --base-dir` to stderr and calls `process.exit(1)` —
64
+ * matching the existing single-value error path so callers don't have to
65
+ * special-case the new shape.
66
+ *
67
+ * Why a shared helper: `ingest`, `list`, and `sync` parse `--base-dir` in
68
+ * identical fashion, so centralizing the accumulate-and-validate step keeps
69
+ * their argv loops in lockstep when the contract evolves.
70
+ */
71
+ export function consumeBaseDirArg(argv, flagIndex, collected) {
72
+ const valueIndex = flagIndex + 1;
73
+ const value = argv[valueIndex];
74
+ if (value === undefined || value.startsWith('-')) {
75
+ console.error('Missing value for --base-dir');
76
+ process.exit(1);
77
+ }
78
+ collected.push(value);
79
+ return valueIndex;
80
+ }
81
+ /**
82
+ * Read the required value that follows a value-taking flag at `argv[flagIndex]`.
83
+ * Centralizes the identical "missing value" guard every value flag used to
84
+ * inline (`--db-path`, `--cache-dir`, `--model-name`, `--max-file-size`,
85
+ * `--chunk-min-length`, `--limit`): when the next token is absent or is itself
86
+ * a flag, prints `Missing value for <flag>` and exits 1. The caller advances
87
+ * its index by 2 (flag + value). Numeric flags apply their own format/range
88
+ * validation to the returned string.
89
+ */
90
+ export function requireFlagValue(argv, flagIndex, flag) {
91
+ const value = argv[flagIndex + 1];
92
+ if (value === undefined || value.startsWith('-')) {
93
+ console.error(`Missing value for ${flag}`);
94
+ process.exit(1);
95
+ }
96
+ return value;
97
+ }
98
+ // ============================================
99
+ // Defaults
100
+ // ============================================
101
+ export const GLOBAL_DEFAULTS = {
102
+ dbPath: './lancedb/',
103
+ cacheDir: './models/',
104
+ modelName: 'Xenova/all-MiniLM-L6-v2',
105
+ };
106
+ // ============================================
107
+ // Help
108
+ // ============================================
109
+ export const ROOT_HELP_TEXT = `Usage: mcp-local-rag [options] <command>
110
+
111
+ Options:
112
+ --db-path <path> LanceDB database path (default: ${GLOBAL_DEFAULTS.dbPath})
113
+ --cache-dir <path> Model cache directory (default: ${GLOBAL_DEFAULTS.cacheDir})
114
+ --model-name <name> Embedding model (default: ${GLOBAL_DEFAULTS.modelName})
115
+ -h, --help Show this help
116
+
117
+ Commands:
118
+ ingest <path> Ingest files into the vector database
119
+ sync [path] Incrementally synchronize indexed files with disk
120
+ query <text> Search ingested documents
121
+ read-neighbors Read N chunks before and after a target chunk within the same document
122
+ list List files and ingestion status
123
+ status Show database status
124
+ delete <path> Delete ingested content
125
+ skills install Install Claude Code / Codex skills`;
126
+ // ============================================
127
+ // Global Option Parsing
128
+ // ============================================
129
+ /**
130
+ * Extract global options (--db-path, --cache-dir, --model-name, -h/--help)
131
+ * from the argument list and return them along with the remaining args.
132
+ *
133
+ * Global options are only recognized BEFORE the first non-flag argument
134
+ * (the subcommand). After the subcommand, everything is forwarded as-is.
135
+ */
136
+ export function parseGlobalOptions(args) {
137
+ const globalOptions = {};
138
+ let help = false;
139
+ let i = 0;
140
+ // Parse global flags until we hit a non-flag (subcommand) or end of args
141
+ while (i < args.length) {
142
+ const arg = args[i];
143
+ switch (arg) {
144
+ case '-h':
145
+ case '--help':
146
+ help = true;
147
+ i++;
148
+ break;
149
+ case '--db-path': {
150
+ globalOptions.dbPath = requireFlagValue(args, i, '--db-path');
151
+ i += 2;
152
+ break;
153
+ }
154
+ case '--cache-dir': {
155
+ globalOptions.cacheDir = requireFlagValue(args, i, '--cache-dir');
156
+ i += 2;
157
+ break;
158
+ }
159
+ case '--model-name': {
160
+ globalOptions.modelName = requireFlagValue(args, i, '--model-name');
161
+ i += 2;
162
+ break;
163
+ }
164
+ default:
165
+ // If arg starts with -, it's an unknown global flag
166
+ if (arg.startsWith('-')) {
167
+ console.error(`Unknown global option: ${arg}`);
168
+ console.error('Run "mcp-local-rag --help" for available options.');
169
+ process.exit(1);
170
+ }
171
+ // First non-global-flag token: treat as subcommand boundary.
172
+ // Everything from here onward is returned as remainingArgs.
173
+ if (help) {
174
+ // If --help was seen before subcommand, show root help
175
+ console.error(ROOT_HELP_TEXT);
176
+ process.exit(0);
177
+ }
178
+ return { globalOptions, remainingArgs: args.slice(i) };
179
+ }
180
+ }
181
+ // All args consumed (no subcommand found)
182
+ if (help) {
183
+ console.error(ROOT_HELP_TEXT);
184
+ process.exit(0);
185
+ }
186
+ return { globalOptions, remainingArgs: [] };
187
+ }
188
+ // ============================================
189
+ // Config Resolution
190
+ // ============================================
191
+ /**
192
+ * Resolve global config with priority: CLI flags > environment variables > defaults.
193
+ * Validates all resolved values before returning.
194
+ */
195
+ export function resolveGlobalConfig(options) {
196
+ const dbPath = options.dbPath ?? process.env['DB_PATH'] ?? GLOBAL_DEFAULTS.dbPath;
197
+ const cacheDir = options.cacheDir ?? process.env['CACHE_DIR'] ?? GLOBAL_DEFAULTS.cacheDir;
198
+ const modelName = options.modelName ?? process.env['MODEL_NAME'] ?? GLOBAL_DEFAULTS.modelName;
199
+ // Validate paths
200
+ const dbPathError = validatePath(dbPath, '--db-path');
201
+ if (dbPathError) {
202
+ console.error(dbPathError);
203
+ process.exit(1);
204
+ }
205
+ const cacheDirError = validatePath(cacheDir, '--cache-dir');
206
+ if (cacheDirError) {
207
+ console.error(cacheDirError);
208
+ process.exit(1);
209
+ }
210
+ // Validate model name
211
+ const modelNameError = validateModelName(modelName);
212
+ if (modelNameError) {
213
+ console.error(modelNameError);
214
+ process.exit(1);
215
+ }
216
+ return { dbPath, cacheDir, modelName };
217
+ }
218
+ /**
219
+ * Resolve RAG_DEVICE. The value is passed through to transformers.js — no
220
+ * allowlist is maintained here. Whitespace-only is treated as unset.
221
+ */
222
+ export function resolveDevice(value) {
223
+ if (!value || value.trim() === '')
224
+ return 'cpu';
225
+ return value.trim();
226
+ }
227
+ /**
228
+ * Resolve RAG_DTYPE. Like resolveDevice, the value is passed through to
229
+ * transformers.js with no allowlist. Unlike resolveDevice, unset/whitespace-only
230
+ * resolves to `undefined` (NOT a default dtype): the fp32 default literal lives
231
+ * solely in Embedder.initialize(), and `undefined` is the only signal that
232
+ * distinguishes "RAG_DTYPE unset" from an explicit "RAG_DTYPE=fp32". That
233
+ * distinction gates failure-path error enrichment, so it must not be collapsed
234
+ * into a default here.
235
+ */
236
+ export function resolveDtype(value) {
237
+ if (!value || value.trim() === '')
238
+ return undefined;
239
+ return value.trim();
240
+ }
241
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { GlobalOptions } from './options.js';
2
+ interface QueryCliOptions {
3
+ limit?: number | undefined;
4
+ scope?: string[] | undefined;
5
+ }
6
+ interface ParsedArgs {
7
+ queryText: string | undefined;
8
+ options: QueryCliOptions;
9
+ help: boolean;
10
+ }
11
+ /**
12
+ * Parse query-specific CLI arguments into options and a positional query text.
13
+ * Flags: --limit, --scope (repeatable), -h/--help
14
+ * Unknown flags (including global flags passed after subcommand) cause an error.
15
+ */
16
+ export declare function parseArgs(args: string[]): ParsedArgs;
17
+ /**
18
+ * Run the query CLI subcommand.
19
+ * @param args - Arguments after "query" (e.g., option flags and query text)
20
+ * @param globalOptions - Global options parsed before the subcommand
21
+ */
22
+ export declare function runQuery(args: string[], globalOptions?: GlobalOptions): Promise<void>;
23
+ export {};
24
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/cli/query.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAOjD,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;CAC7B;AAED,UAAU,UAAU;IAClB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,OAAO,EAAE,eAAe,CAAA;IACxB,IAAI,EAAE,OAAO,CAAA;CACd;AA8CD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAsDpD;AAuBD;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,aAAa,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8F/F"}
@@ -0,0 +1,191 @@
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
+ export function parseArgs(args) {
37
+ const options = {};
38
+ let queryText;
39
+ let help = false;
40
+ let i = 0;
41
+ while (i < args.length) {
42
+ const arg = args[i];
43
+ switch (arg) {
44
+ case '-h':
45
+ case '--help':
46
+ help = true;
47
+ i++;
48
+ break;
49
+ case '--limit': {
50
+ const value = requireFlagValue(args, i, '--limit');
51
+ if (!/^\d+$/.test(value)) {
52
+ console.error(`--limit must be between ${MIN_QUERY_LIMIT} and ${MAX_QUERY_LIMIT}`);
53
+ process.exit(1);
54
+ }
55
+ options.limit = Number.parseInt(value, 10);
56
+ i += 2;
57
+ break;
58
+ }
59
+ case '--scope': {
60
+ const value = requireFlagValue(args, i, '--scope').trim();
61
+ if (value.length === 0) {
62
+ console.error('--scope value must not be empty');
63
+ process.exit(1);
64
+ }
65
+ const scope = options.scope ?? [];
66
+ scope.push(value);
67
+ options.scope = scope;
68
+ i += 2;
69
+ break;
70
+ }
71
+ default:
72
+ if (arg.startsWith('-')) {
73
+ console.error(`Unknown option: ${arg}`);
74
+ console.error(HELP_TEXT);
75
+ process.exit(1);
76
+ }
77
+ if (queryText !== undefined) {
78
+ console.error(`Unexpected argument: ${arg}`);
79
+ console.error('Only one query text argument is accepted.');
80
+ process.exit(1);
81
+ }
82
+ queryText = arg;
83
+ i++;
84
+ break;
85
+ }
86
+ }
87
+ return { queryText, options, help };
88
+ }
89
+ // ============================================
90
+ // Limit Validation
91
+ // ============================================
92
+ /**
93
+ * Validate and resolve the limit value.
94
+ * Returns the validated limit or exits with error.
95
+ */
96
+ function resolveLimit(rawLimit) {
97
+ const limit = rawLimit ?? QUERY_DEFAULTS.limit;
98
+ if (!Number.isFinite(limit) || limit < MIN_QUERY_LIMIT || limit > MAX_QUERY_LIMIT) {
99
+ console.error(`--limit must be between ${MIN_QUERY_LIMIT} and ${MAX_QUERY_LIMIT}`);
100
+ process.exit(1);
101
+ }
102
+ return limit;
103
+ }
104
+ // ============================================
105
+ // Main Entry Point
106
+ // ============================================
107
+ /**
108
+ * Run the query CLI subcommand.
109
+ * @param args - Arguments after "query" (e.g., option flags and query text)
110
+ * @param globalOptions - Global options parsed before the subcommand
111
+ */
112
+ export async function runQuery(args, globalOptions = {}) {
113
+ // Parse CLI options
114
+ const { queryText, options, help } = parseArgs(args);
115
+ // Handle --help
116
+ if (help) {
117
+ console.error(HELP_TEXT);
118
+ process.exit(0);
119
+ }
120
+ // Validate positional argument
121
+ if (!queryText) {
122
+ console.error('Usage: mcp-local-rag query [options] <query-text>');
123
+ console.error(' Search ingested documents.');
124
+ console.error(' Run with --help for all options.');
125
+ process.exit(1);
126
+ }
127
+ // Validate limit
128
+ const limit = resolveLimit(options.limit);
129
+ // Resolve global config
130
+ const globalConfig = resolveGlobalConfig(globalOptions);
131
+ // Initialize components
132
+ const vectorStore = createVectorStore(globalConfig);
133
+ const embedder = createEmbedder(globalConfig);
134
+ await vectorStore.initialize();
135
+ try {
136
+ // Generate query embedding
137
+ const embeddings = await embedder.embedBatch([queryText]);
138
+ const queryVector = embeddings[0];
139
+ if (!queryVector) {
140
+ throw new Error('Failed to generate query embedding');
141
+ }
142
+ // Hybrid search (vector + BM25). Thread scope only when present so the
143
+ // scope-absent call shape stays identical to the pre-flag behavior.
144
+ const searchResults = await vectorStore.search(queryVector, {
145
+ queryText,
146
+ limit,
147
+ ...(options.scope ? { scope: options.scope } : {}),
148
+ });
149
+ let attachmentsByIdentity = new Map();
150
+ try {
151
+ const hydration = await vectorStore.hydrateVisualAttachments(searchResults);
152
+ attachmentsByIdentity = new Map(hydration.rows.map((row) => [row.id, row.attachments]));
153
+ if (hydration.omittedCount > 0) {
154
+ console.error(`Warning: omitted ${hydration.omittedCount} unavailable or malformed image attachment(s) from query results`);
155
+ }
156
+ }
157
+ catch {
158
+ console.error('Warning: image attachments could not be loaded; returning text results only');
159
+ }
160
+ // Format results with source restoration for raw-data files
161
+ const results = searchResults.map((result) => {
162
+ const output = {
163
+ filePath: result.filePath,
164
+ chunkIndex: result.chunkIndex,
165
+ text: result.text,
166
+ score: result.score,
167
+ fileTitle: result.fileTitle ?? null,
168
+ images: attachmentsByIdentity.get(result.id) ?? [],
169
+ };
170
+ if (isManagedRawDataPath(result.filePath, globalConfig.dbPath)) {
171
+ const source = extractSourceFromPath(result.filePath);
172
+ if (source) {
173
+ output.source = source;
174
+ }
175
+ }
176
+ return output;
177
+ });
178
+ // Output JSON to stdout
179
+ process.stdout.write(JSON.stringify(results, null, 2));
180
+ }
181
+ catch (error) {
182
+ const reason = formatCliError(error);
183
+ console.error(`Error: ${reason}`);
184
+ process.exit(1);
185
+ }
186
+ finally {
187
+ await embedder.dispose();
188
+ await vectorStore.close();
189
+ }
190
+ }
191
+ //# 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,11 @@
1
+ import type { GlobalOptions } from './options.js';
2
+ /**
3
+ * Run the read-neighbors CLI subcommand.
4
+ * Reads chunks adjacent to a target chunkIndex within a single document.
5
+ * Does NOT perform any search; this is an index-adjacent retrieval utility.
6
+ *
7
+ * @param args - Arguments after "read-neighbors"
8
+ * @param globalOptions - Global options parsed before the subcommand
9
+ */
10
+ export declare function runReadNeighbors(args: string[], globalOptions?: GlobalOptions): Promise<void>;
11
+ //# 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;AAqIjD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EAAE,EACd,aAAa,GAAE,aAAkB,GAChC,OAAO,CAAC,IAAI,CAAC,CAqGf"}