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,216 @@
1
+ // Runtime validation for MCP tool arguments.
2
+ //
3
+ // MCP tool arguments arrive as `unknown` from the SDK: TypeScript types are
4
+ // erased at runtime, so the previous `as unknown as XxxInput` casts let
5
+ // malformed input flow into the handlers (non-string query, negative limit,
6
+ // missing metadata, enum-violating format). These validators reject malformed
7
+ // input at the entry boundary with `McpError(InvalidParams)` — the same
8
+ // structured failure shape `read_chunk_neighbors` already uses — without
9
+ // leaking internal diagnostics to the client.
10
+ import { isAbsolute } from 'node:path';
11
+ import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
12
+ import { QUALITY_PROFILES } from '../pdf-visual/types.js';
13
+ import { MAX_NEIGHBOR_COUNT, MAX_QUERY_LIMIT, MIN_QUERY_LIMIT } from '../utils/limits.js';
14
+ import { CONTENT_FORMATS } from '../utils/raw-data-utils.js';
15
+ const SCOPE_ERROR = 'scope must be a non-empty string or a non-empty array of non-empty strings';
16
+ /**
17
+ * Normalize the optional `scope` to a trimmed `string[]`, rejecting any other
18
+ * shape with `McpError(InvalidParams)`. Mirrors the `limit` boundary check.
19
+ */
20
+ function normalizeScope(scope) {
21
+ const isNonEmptyString = (value) => typeof value === 'string' && value.trim().length > 0;
22
+ // Trim so whitespace-padded prefixes don't silently match nothing.
23
+ if (isNonEmptyString(scope)) {
24
+ return [scope.trim()];
25
+ }
26
+ if (Array.isArray(scope) && scope.length > 0 && scope.every(isNonEmptyString)) {
27
+ return scope.map((value) => value.trim());
28
+ }
29
+ throw new McpError(ErrorCode.InvalidParams, SCOPE_ERROR);
30
+ }
31
+ function asRecord(raw, label) {
32
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
33
+ throw new McpError(ErrorCode.InvalidParams, `${label} arguments must be an object`);
34
+ }
35
+ return raw;
36
+ }
37
+ /**
38
+ * Validate `query_documents` arguments. `query` must be a non-empty string;
39
+ * `limit`, when provided, must be a positive integer (the handler defaults it
40
+ * to 10 when absent).
41
+ */
42
+ export function parseQueryDocumentsInput(raw) {
43
+ const obj = asRecord(raw, 'query_documents');
44
+ const { query, limit, scope } = obj;
45
+ if (typeof query !== 'string' || query.trim().length === 0) {
46
+ throw new McpError(ErrorCode.InvalidParams, 'query must be a non-empty string');
47
+ }
48
+ const input = { query };
49
+ if (limit !== undefined) {
50
+ // Bound to 1-20 at the entry boundary — the same range VectorStore.search
51
+ // enforces and the CLI `--limit` accepts. Rejecting here returns a clean
52
+ // McpError(InvalidParams) instead of letting an out-of-range value reach
53
+ // search() and surface as a DatabaseError.
54
+ if (typeof limit !== 'number' ||
55
+ !Number.isInteger(limit) ||
56
+ limit < MIN_QUERY_LIMIT ||
57
+ limit > MAX_QUERY_LIMIT) {
58
+ throw new McpError(ErrorCode.InvalidParams, 'limit must be an integer between 1 and 20');
59
+ }
60
+ input.limit = limit;
61
+ }
62
+ if (scope !== undefined) {
63
+ input.scope = normalizeScope(scope);
64
+ }
65
+ return input;
66
+ }
67
+ /**
68
+ * Validate `list_files` arguments. The tool historically takes no arguments, so
69
+ * an omitted `arguments` (`undefined`) or `{}` is accepted as "no scope". When
70
+ * `scope` is present, it is normalized the same way as `query_documents`.
71
+ */
72
+ export function parseListFilesInput(raw) {
73
+ // Preserve the no-argument contract: `asRecord` rejects `undefined`, so
74
+ // short-circuit before it to avoid a spurious McpError on no-arg calls.
75
+ if (raw === undefined) {
76
+ return {};
77
+ }
78
+ const { scope } = asRecord(raw, 'list_files');
79
+ if (scope === undefined) {
80
+ return {};
81
+ }
82
+ return { scope: normalizeScope(scope) };
83
+ }
84
+ /**
85
+ * Validate `ingest_data` arguments. `content` must be a non-empty string;
86
+ * `metadata` must be an object with a non-empty `source` string and a `format`
87
+ * in the supported set.
88
+ */
89
+ export function parseIngestDataInput(raw) {
90
+ const obj = asRecord(raw, 'ingest_data');
91
+ const { content, metadata } = obj;
92
+ if (typeof content !== 'string' || content.length === 0) {
93
+ throw new McpError(ErrorCode.InvalidParams, 'content must be a non-empty string');
94
+ }
95
+ const meta = asRecord(metadata, 'ingest_data metadata');
96
+ const { source, format } = meta;
97
+ if (typeof source !== 'string' || source.trim().length === 0) {
98
+ throw new McpError(ErrorCode.InvalidParams, 'metadata.source must be a non-empty string');
99
+ }
100
+ if (typeof format !== 'string' || !CONTENT_FORMATS.includes(format)) {
101
+ throw new McpError(ErrorCode.InvalidParams, `metadata.format must be one of: ${CONTENT_FORMATS.join(', ')}`);
102
+ }
103
+ return { content, metadata: { source, format: format } };
104
+ }
105
+ export function parseIngestFileInput(raw) {
106
+ const { filePath, visual, visualQuality } = asRecord(raw, 'ingest_file');
107
+ if (typeof filePath !== 'string' || filePath.trim().length === 0) {
108
+ throw new McpError(ErrorCode.InvalidParams, 'filePath must be a non-empty string');
109
+ }
110
+ if (visual !== undefined && typeof visual !== 'boolean') {
111
+ throw new McpError(ErrorCode.InvalidParams, "'visual' must be a boolean if provided");
112
+ }
113
+ if (visualQuality !== undefined &&
114
+ visualQuality !== '' &&
115
+ !QUALITY_PROFILES.includes(visualQuality)) {
116
+ throw new McpError(ErrorCode.InvalidParams, "'visualQuality' must be 'fast' or 'quality' if provided");
117
+ }
118
+ return {
119
+ filePath,
120
+ ...(visual !== undefined ? { visual } : {}),
121
+ ...(QUALITY_PROFILES.includes(visualQuality)
122
+ ? { visualQuality: visualQuality }
123
+ : {}),
124
+ };
125
+ }
126
+ function nonEmptyString(value) {
127
+ return typeof value === 'string' && value.trim().length > 0;
128
+ }
129
+ export function parseDeleteFileInput(raw) {
130
+ const { filePath, source } = asRecord(raw, 'delete_file');
131
+ const hasFilePath = nonEmptyString(filePath);
132
+ const hasSource = nonEmptyString(source);
133
+ if (hasFilePath === hasSource) {
134
+ throw new McpError(ErrorCode.InvalidParams, hasFilePath
135
+ ? 'Provide either filePath or source, not both'
136
+ : 'Either filePath or source must be provided');
137
+ }
138
+ return hasFilePath ? { filePath } : { source: source };
139
+ }
140
+ export function parseReadChunkNeighborsInput(raw) {
141
+ const { filePath, source, chunkIndex, before, after } = asRecord(raw, 'read_chunk_neighbors');
142
+ if (!Number.isInteger(chunkIndex) || chunkIndex < 0) {
143
+ throw new McpError(ErrorCode.InvalidParams, 'chunkIndex must be a non-negative integer');
144
+ }
145
+ for (const [label, value] of [
146
+ ['before', before],
147
+ ['after', after],
148
+ ]) {
149
+ if (value !== undefined && (!Number.isInteger(value) || value < 0)) {
150
+ throw new McpError(ErrorCode.InvalidParams, `${label} must be a non-negative integer`);
151
+ }
152
+ if (typeof value === 'number' && value > MAX_NEIGHBOR_COUNT) {
153
+ throw new McpError(ErrorCode.InvalidParams, `${label} must be between 0 and 50 (got ${value})`);
154
+ }
155
+ }
156
+ const ref = parseDeleteFileInput({ filePath, source });
157
+ return {
158
+ ...ref,
159
+ chunkIndex: chunkIndex,
160
+ ...(before !== undefined ? { before: before } : {}),
161
+ ...(after !== undefined ? { after: after } : {}),
162
+ };
163
+ }
164
+ /**
165
+ * Validate `sync_start` arguments. The tool is legitimately callable with no
166
+ * arguments — an omitted `path` means "every configured base directory" — so
167
+ * both `undefined` and `{}` are accepted, the same contract `list_files` has.
168
+ *
169
+ * Root containment is deliberately not checked here: the sync core owns that
170
+ * rule so the CLI and MCP surfaces cannot drift apart.
171
+ */
172
+ export function parseSyncStartInput(raw) {
173
+ if (raw === undefined) {
174
+ return {};
175
+ }
176
+ const { path } = asRecord(raw, 'sync_start');
177
+ if (path === undefined) {
178
+ return {};
179
+ }
180
+ if (!nonEmptyString(path)) {
181
+ throw new McpError(ErrorCode.InvalidParams, 'path must be a non-empty string');
182
+ }
183
+ // Trimmed for the same reason as `scope`: a whitespace-padded path would
184
+ // otherwise be resolved verbatim and silently match nothing on disk.
185
+ const trimmed = path.trim();
186
+ // A relative path would be resolved against the server process's working
187
+ // directory, which the caller cannot see. `ingest_file` and `delete_file`
188
+ // already require absolute paths, and the tool description promises one.
189
+ if (!isAbsolute(trimmed)) {
190
+ throw new McpError(ErrorCode.InvalidParams, 'path must be an absolute path');
191
+ }
192
+ return { path: trimmed };
193
+ }
194
+ /**
195
+ * A job id is a `randomUUID()` this server handed out: 36 characters of
196
+ * hexadecimal and dashes. The cap and the alphabet are enforced because the value
197
+ * is echoed into the "unknown sync job" message and into a stderr log line — an
198
+ * unbounded id with a newline in it would forge a log line for the operator.
199
+ */
200
+ const JOB_ID_PATTERN = /^[0-9a-fA-F-]{1,128}$/;
201
+ /**
202
+ * Validate `sync_status` arguments. `jobId` is required; an unknown but
203
+ * well-formed id is the handler's concern, not this boundary's.
204
+ */
205
+ export function parseSyncStatusInput(raw) {
206
+ const { jobId } = asRecord(raw, 'sync_status');
207
+ if (!nonEmptyString(jobId)) {
208
+ throw new McpError(ErrorCode.InvalidParams, 'jobId must be a non-empty string');
209
+ }
210
+ const trimmed = jobId.trim();
211
+ if (!JOB_ID_PATTERN.test(trimmed)) {
212
+ throw new McpError(ErrorCode.InvalidParams, 'jobId must be at most 128 characters of hexadecimal digits and dashes');
213
+ }
214
+ return { jobId: trimmed };
215
+ }
216
+ //# sourceMappingURL=tool-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-input.js","sourceRoot":"","sources":["../../src/server/tool-input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,331 @@
1
+ import type { QualityProfile } from '../pdf-visual/types.js';
2
+ import type { BaseDirsConfigError } from '../utils/base-dirs.js';
3
+ import type { ContentFormat } from '../utils/raw-data-utils.js';
4
+ import type { GroupingMode } from '../vectordb/index.js';
5
+ /**
6
+ * Fields shared by both `RAGServerConfig` shapes (legacy single-root and
7
+ * multi-root). Extracted so the union below only needs to describe the
8
+ * `baseDir` / `baseDirs` axis.
9
+ */
10
+ interface RAGServerConfigBase {
11
+ /** LanceDB database path */
12
+ dbPath: string;
13
+ /** Transformers.js model path */
14
+ modelName: string;
15
+ /** Model cache directory */
16
+ cacheDir: string;
17
+ /** Maximum file size (100MB) */
18
+ maxFileSize: number;
19
+ /** Compute device (cpu, webgpu, dml, etc) */
20
+ device?: string;
21
+ /** Embedding quantization dtype (fp32, fp16, q8, int8, ...). Unset → fp32. */
22
+ dtype?: string;
23
+ /** Maximum distance threshold for quality filtering (optional) */
24
+ maxDistance?: number;
25
+ /** Grouping mode for quality filtering (optional) */
26
+ grouping?: GroupingMode;
27
+ /** Hybrid search weight for BM25 (0.0 = vector only, 1.0 = BM25 only, default 0.6) */
28
+ hybridWeight?: number;
29
+ /** Maximum number of files to keep in search results (optional) */
30
+ maxFiles?: number;
31
+ /** Minimum chunk length in characters (optional, default: 50) */
32
+ chunkMinLength?: number;
33
+ /** Store bounded PDF regions and Mammoth-produced DOCX images. */
34
+ storeImages?: boolean;
35
+ /**
36
+ * Normal-path (resolve()) roots, index-aligned with the realpath'd `baseDirs`
37
+ * security boundary; used for user-facing `list_files` scan/display so paths
38
+ * match the resolve()-stored DB keys. From `BaseDirsConfig.rawBaseDirs` (see
39
+ * it for the path policy). Optional: legacy `{ baseDir }` callers fall back to
40
+ * `baseDirs`.
41
+ */
42
+ rawBaseDirs?: readonly string[];
43
+ /** Configuration validation warnings to surface to users via MCP annotations */
44
+ configWarnings?: string[];
45
+ /**
46
+ * Structured base-dirs resolution error. When present, the server is in
47
+ * degraded mode: `status` remains callable so the user can diagnose the
48
+ * problem via MCP, while root-dependent tools surface the error before
49
+ * doing DB or filesystem work. See `resolveBaseDirs` for the error
50
+ * semantics.
51
+ */
52
+ configError?: BaseDirsConfigError;
53
+ }
54
+ /**
55
+ * RAGServer configuration.
56
+ *
57
+ * Accepts either a single `baseDir` (legacy shape — preserved so existing
58
+ * direct callers and tests that pass `{ baseDir }` continue to work) or
59
+ * `baseDirs` (multi-root shape produced by `resolveBaseDirs`). Exactly one
60
+ * of the two MUST be supplied. The constructor normalizes both into a single
61
+ * `baseDirs: string[]` internally and derives the legacy `baseDir` accessor
62
+ * as `baseDirs[0]`.
63
+ */
64
+ export type RAGServerConfig = (RAGServerConfigBase & {
65
+ /** Document base directory (legacy single-root shape). */
66
+ baseDir: string;
67
+ baseDirs?: undefined;
68
+ }) | (RAGServerConfigBase & {
69
+ /** One or more allowed document base directories (multi-root shape). */
70
+ baseDirs: string[];
71
+ baseDir?: undefined;
72
+ });
73
+ /**
74
+ * query_documents tool input
75
+ */
76
+ export interface QueryDocumentsInput {
77
+ /** Natural language query */
78
+ query: string;
79
+ /** Number of results to retrieve (default 10) */
80
+ limit?: number;
81
+ /** Path prefix scope (one or a list); the parser normalizes to `string[]`. */
82
+ scope?: string | string[];
83
+ }
84
+ /**
85
+ * list_files tool input
86
+ */
87
+ export interface ListFilesInput {
88
+ /** Path prefix scope (one or a list); the parser normalizes to `string[]`. */
89
+ scope?: string | string[];
90
+ }
91
+ /**
92
+ * ingest_file tool input
93
+ */
94
+ export interface IngestFileInput {
95
+ /** File path */
96
+ filePath: string;
97
+ /**
98
+ * When true and `filePath` is a PDF, the visual enrichment path runs
99
+ * (VLM captioning of figure-heavy pages). For non-PDF files this flag is
100
+ * silently coerced to the default text-only path. The runtime check at the
101
+ * handler boundary stays in place because MCP arguments arrive as `unknown`
102
+ * from the SDK.
103
+ */
104
+ visual?: boolean;
105
+ /**
106
+ * Visual-quality profile when `visual` is true. Some MCP clients send the
107
+ * empty string for unspecified optional parameters; the transport decoder
108
+ * normalizes it before this type reaches the handler.
109
+ */
110
+ visualQuality?: QualityProfile;
111
+ }
112
+ /**
113
+ * ingest_data tool input metadata
114
+ */
115
+ interface IngestDataMetadata {
116
+ /** Source identifier: URL ("https://...") or custom ID ("clipboard://2024-12-30") */
117
+ source: string;
118
+ /** Content format */
119
+ format: ContentFormat;
120
+ }
121
+ /**
122
+ * ingest_data tool input
123
+ */
124
+ export interface IngestDataInput {
125
+ /** Content to ingest (text, HTML, or Markdown) */
126
+ content: string;
127
+ /** Content metadata */
128
+ metadata: IngestDataMetadata;
129
+ }
130
+ /**
131
+ * delete_file tool input
132
+ * Either filePath or source must be provided
133
+ */
134
+ export type DeleteFileInput = {
135
+ filePath: string;
136
+ source?: never;
137
+ } | {
138
+ source: string;
139
+ filePath?: never;
140
+ };
141
+ /**
142
+ * delete_file tool output
143
+ */
144
+ export interface DeleteFileResult {
145
+ /** Resolved file path used for the delete operation */
146
+ filePath: string;
147
+ /** True when the delete operation completed (idempotent; not "something was removed") */
148
+ deleted: true;
149
+ /** Number of vector chunks removed from the database */
150
+ removedChunks: number;
151
+ /** True when ingested chunks and/or raw-data artifacts existed before delete */
152
+ existed: boolean;
153
+ /** Timestamp */
154
+ timestamp: string;
155
+ }
156
+ /**
157
+ * ingest_file tool output
158
+ */
159
+ export interface IngestResult {
160
+ /** File path */
161
+ filePath: string;
162
+ /** Chunk count */
163
+ chunkCount: number;
164
+ /** Timestamp */
165
+ timestamp: string;
166
+ /** Document title extracted from file content (display-only, not used for scoring) */
167
+ fileTitle: string | null;
168
+ }
169
+ /**
170
+ * list_files tool output — entry for a file found under one of the effective
171
+ * base directories.
172
+ *
173
+ * `baseDir` identifies the producing root (one of `ListFilesResult.baseDirs`).
174
+ * Always present, including in single-root configurations — the field is
175
+ * additive over the legacy shape, so existing clients that ignore it continue
176
+ * to work.
177
+ */
178
+ export type FileEntry = {
179
+ filePath: string;
180
+ baseDir: string;
181
+ ingested: true;
182
+ chunkCount: number;
183
+ timestamp: string;
184
+ } | {
185
+ filePath: string;
186
+ baseDir: string;
187
+ ingested: false;
188
+ };
189
+ /**
190
+ * list_files tool output — entry for content ingested via ingest_data,
191
+ * or an orphaned DB entry whose file no longer exists on disk
192
+ */
193
+ export type SourceEntry = {
194
+ source: string;
195
+ chunkCount: number;
196
+ timestamp: string;
197
+ } | {
198
+ filePath: string;
199
+ chunkCount: number;
200
+ timestamp: string;
201
+ };
202
+ /**
203
+ * list_files tool output.
204
+ *
205
+ * Multi-root contract:
206
+ * - `baseDirs`: all effective roots (normal resolve() form, nested-root pruned).
207
+ * - `baseDir`: the first effective root (`baseDirs[0]`). Preserved as a
208
+ * legacy field so clients written against the single-root shape continue to
209
+ * work.
210
+ * - `files`: union across roots, each annotated with its producing `baseDir`.
211
+ * Exact duplicate paths across roots are de-duplicated (first occurrence
212
+ * wins, preserving root iteration order).
213
+ * - `sources`: raw-data entries (from `ingest_data`) and orphaned DB entries
214
+ * whose files no longer exist on disk. Sources are not produced by any
215
+ * root, so they carry no `baseDir` annotation.
216
+ */
217
+ export interface ListFilesResult {
218
+ baseDir: string;
219
+ baseDirs: string[];
220
+ files: FileEntry[];
221
+ sources: SourceEntry[];
222
+ }
223
+ /**
224
+ * query_documents tool output
225
+ */
226
+ export interface QueryResult {
227
+ /** File path */
228
+ filePath: string;
229
+ /** Chunk index */
230
+ chunkIndex: number;
231
+ /** Text */
232
+ text: string;
233
+ /** Similarity score */
234
+ score: number;
235
+ /** Original source (only for raw-data files, e.g., URLs ingested via ingest_data) */
236
+ source?: string;
237
+ /** Document title extracted from file content (display-only, not used for scoring) */
238
+ fileTitle: string | null;
239
+ }
240
+ /**
241
+ * read_chunk_neighbors tool input.
242
+ * Exactly one of filePath / source must be provided (XOR).
243
+ */
244
+ export type ReadChunkNeighborsInput = DeleteFileInput & {
245
+ /** Target chunk index (zero-based, required, non-negative integer). */
246
+ chunkIndex: number;
247
+ /** Number of chunks before the target to include (default 2, non-negative integer). */
248
+ before?: number;
249
+ /** Number of chunks after the target to include (default 2, non-negative integer). */
250
+ after?: number;
251
+ };
252
+ /**
253
+ * read_chunk_neighbors tool output item.
254
+ * Core fields are {filePath, chunkIndex, text}. `isTarget` is true only for
255
+ * the requested target when it exists, and `source` is present only on
256
+ * raw-data rows.
257
+ * fileTitle mirrors QueryResult for drop-in consistency with query_documents results.
258
+ */
259
+ export interface ReadChunkNeighborsResultItem {
260
+ /** File path */
261
+ filePath: string;
262
+ /** Chunk index */
263
+ chunkIndex: number;
264
+ /** Text */
265
+ text: string;
266
+ /** True iff this chunk's chunkIndex matches the requested target. */
267
+ isTarget: boolean;
268
+ /** Original source (only for raw-data files, e.g., URLs ingested via ingest_data). */
269
+ source?: string;
270
+ /** Document title extracted from file content (display-only, not used for scoring) */
271
+ fileTitle: string | null;
272
+ }
273
+ /**
274
+ * sync_start tool input
275
+ */
276
+ export interface SyncStartInput {
277
+ /** Absolute path inside a configured root. Omitted means every configured root. */
278
+ path?: string;
279
+ }
280
+ /**
281
+ * sync_status tool input
282
+ */
283
+ export interface SyncStatusInput {
284
+ /** Identifier returned by sync_start. */
285
+ jobId: string;
286
+ }
287
+ /**
288
+ * Lifecycle of the one process-local sync job the server retains. There is no
289
+ * cancelled, queued, or recovered state: the record lives only for the server
290
+ * process and a new job replaces a terminal one.
291
+ */
292
+ export type SyncJobState = 'running' | 'succeeded' | 'failed';
293
+ /**
294
+ * Per-file outcome counters of a sync job. Structurally identical to the sync
295
+ * core's counters, restated here because `server/` does not depend on
296
+ * `features/`.
297
+ */
298
+ export interface SyncSummary {
299
+ /** Files re-ingested because they were new, changed, or stored inconsistently. */
300
+ upserted: number;
301
+ /** Files whose stored content identity already matched the disk bytes. */
302
+ skipped: number;
303
+ /** Present files that produced zero chunks; their prior rows and hash are kept. */
304
+ empty: number;
305
+ /** Indexed files removed from the index. Counts files, not rows, and is outside `completed`. */
306
+ pruned: number;
307
+ }
308
+ /**
309
+ * sync_status tool output — the whole pollable record for one job.
310
+ *
311
+ * `total` stays `null` until scanning has counted the supported files on disk,
312
+ * and `completed` (`upserted + skipped + empty`) never exceeds a non-null
313
+ * `total`. `error` is `null` unless the job failed; a failed job carries one
314
+ * controlled message that names the file for a per-file failure. A job succeeds
315
+ * only when `error` is `null`.
316
+ */
317
+ export interface SyncStatusResult {
318
+ jobId: string;
319
+ state: SyncJobState;
320
+ total: number | null;
321
+ completed: number;
322
+ summary: SyncSummary;
323
+ /**
324
+ * Scanner coverage warnings, carried as JSON rather than as the content
325
+ * blocks `list_files` uses, because status is a single pollable record.
326
+ */
327
+ warnings: string[];
328
+ error: string | null;
329
+ }
330
+ export {};
331
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ // Type definitions for RAGServer
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA,iCAAiC"}
@@ -0,0 +1,46 @@
1
+ import { RAGServer } from './server/index.js';
2
+ import type { GroupingMode } from './vectordb/index.js';
3
+ /** Result of parsing an environment variable */
4
+ export interface ParseResult<T> {
5
+ value: T | undefined;
6
+ warning?: string;
7
+ }
8
+ /**
9
+ * Parse grouping mode from environment variable
10
+ */
11
+ export declare function parseGroupingMode(value: string | undefined): ParseResult<GroupingMode>;
12
+ /**
13
+ * Parse max distance from environment variable
14
+ */
15
+ export declare function parseMaxDistance(value: string | undefined): ParseResult<number>;
16
+ /**
17
+ * Parse max files from environment variable
18
+ */
19
+ export declare function parseMaxFiles(value: string | undefined): ParseResult<number>;
20
+ /**
21
+ * Parse hybrid weight from environment variable
22
+ */
23
+ export declare function parseHybridWeight(value: string | undefined): ParseResult<number>;
24
+ /**
25
+ * Parse chunk minimum length from environment variable
26
+ */
27
+ export declare function parseChunkMinLength(value: string | undefined): ParseResult<number>;
28
+ /** Parse the independent PDF image-storage toggle. */
29
+ export declare function parseStoreImages(value: string | undefined): ParseResult<boolean>;
30
+ /**
31
+ * Resolve the full RAGServer configuration from environment variables.
32
+ *
33
+ * Pure (no process.exit, no transport): `env` and `cwd` are passed in so the
34
+ * entry-point wiring can be exercised directly in tests instead of via a copy.
35
+ * Single source of truth for BASE_DIRS / BASE_DIR / cwd precedence, the
36
+ * sensitive-path policy on both raw and realpath-normalized roots, and the
37
+ * never-fall-back-to-cwd-on-error rule.
38
+ */
39
+ export declare function resolveServerConfig(env: NodeJS.ProcessEnv, cwd: string): Promise<ConstructorParameters<typeof RAGServer>[0]>;
40
+ /**
41
+ * Start the RAG MCP Server
42
+ * Configuration is read from environment variables only (no CLI flags).
43
+ * This ensures the bare `mcp-local-rag` launch is suitable for MCP clients.
44
+ */
45
+ export declare function startServer(): Promise<void>;
46
+ //# sourceMappingURL=server-main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-main.d.ts","sourceRoot":"","sources":["../src/server-main.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAI7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAMvD,gDAAgD;AAChD,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,KAAK,EAAE,CAAC,GAAG,SAAS,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC,YAAY,CAAC,CAQtF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAQ/E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAQ5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAQhF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAQlF;AAED,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,CAShF;AAMD;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,qBAAqB,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CA2GrD;AAED;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAqBjD"}