@ssmeo/mcp-local-rag 0.18.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.de.md +441 -0
- package/README.es.md +441 -0
- package/README.fr.md +441 -0
- package/README.md +530 -0
- package/README.pt-BR.md +441 -0
- package/README.zh-CN.md +441 -0
- package/dist/bin/install-skills.d.ts +19 -0
- package/dist/bin/install-skills.d.ts.map +1 -0
- package/dist/bin/install-skills.js +218 -0
- package/dist/bin/install-skills.js.map +1 -0
- package/dist/chunker/index.d.ts +24 -0
- package/dist/chunker/index.d.ts.map +1 -0
- package/dist/chunker/index.js +2 -0
- package/dist/chunker/index.js.map +1 -0
- package/dist/chunker/semantic-chunker.d.ts +96 -0
- package/dist/chunker/semantic-chunker.d.ts.map +1 -0
- package/dist/chunker/semantic-chunker.js +362 -0
- package/dist/chunker/semantic-chunker.js.map +1 -0
- package/dist/chunker/sentence-splitter.d.ts +32 -0
- package/dist/chunker/sentence-splitter.d.ts.map +1 -0
- package/dist/chunker/sentence-splitter.js +231 -0
- package/dist/chunker/sentence-splitter.js.map +1 -0
- package/dist/chunker/token-containment.d.ts +39 -0
- package/dist/chunker/token-containment.d.ts.map +1 -0
- package/dist/chunker/token-containment.js +83 -0
- package/dist/chunker/token-containment.js.map +1 -0
- package/dist/cli/common.d.ts +34 -0
- package/dist/cli/common.d.ts.map +1 -0
- package/dist/cli/common.js +121 -0
- package/dist/cli/common.js.map +1 -0
- package/dist/cli/delete.d.ts +3 -0
- package/dist/cli/delete.d.ts.map +1 -0
- package/dist/cli/delete.js +169 -0
- package/dist/cli/delete.js.map +1 -0
- package/dist/cli/file-collection.d.ts +2 -0
- package/dist/cli/file-collection.d.ts.map +1 -0
- package/dist/cli/file-collection.js +53 -0
- package/dist/cli/file-collection.js.map +1 -0
- package/dist/cli/ingest.d.ts +69 -0
- package/dist/cli/ingest.d.ts.map +1 -0
- package/dist/cli/ingest.js +323 -0
- package/dist/cli/ingest.js.map +1 -0
- package/dist/cli/list.d.ts +27 -0
- package/dist/cli/list.d.ts.map +1 -0
- package/dist/cli/list.js +207 -0
- package/dist/cli/list.js.map +1 -0
- package/dist/cli/options.d.ts +89 -0
- package/dist/cli/options.d.ts.map +1 -0
- package/dist/cli/options.js +244 -0
- package/dist/cli/options.js.map +1 -0
- package/dist/cli/query.d.ts +17 -0
- package/dist/cli/query.d.ts.map +1 -0
- package/dist/cli/query.js +194 -0
- package/dist/cli/query.js.map +1 -0
- package/dist/cli/read-neighbors.d.ts +3 -0
- package/dist/cli/read-neighbors.d.ts.map +1 -0
- package/dist/cli/read-neighbors.js +192 -0
- package/dist/cli/read-neighbors.js.map +1 -0
- package/dist/cli/status.d.ts +6 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +78 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/sync.d.ts +6 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +271 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/cli-main.d.ts +9 -0
- package/dist/cli-main.d.ts.map +1 -0
- package/dist/cli-main.js +60 -0
- package/dist/cli-main.js.map +1 -0
- package/dist/embedder/index.d.ts +143 -0
- package/dist/embedder/index.d.ts.map +1 -0
- package/dist/embedder/index.js +429 -0
- package/dist/embedder/index.js.map +1 -0
- package/dist/embedder/remote.d.ts +51 -0
- package/dist/embedder/remote.d.ts.map +1 -0
- package/dist/embedder/remote.js +182 -0
- package/dist/embedder/remote.js.map +1 -0
- package/dist/features/list.d.ts +37 -0
- package/dist/features/list.d.ts.map +1 -0
- package/dist/features/list.js +41 -0
- package/dist/features/list.js.map +1 -0
- package/dist/features/sync.d.ts +219 -0
- package/dist/features/sync.d.ts.map +1 -0
- package/dist/features/sync.js +461 -0
- package/dist/features/sync.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/compute.d.ts +63 -0
- package/dist/ingest/compute.d.ts.map +1 -0
- package/dist/ingest/compute.js +161 -0
- package/dist/ingest/compute.js.map +1 -0
- package/dist/ingest/file.d.ts +40 -0
- package/dist/ingest/file.d.ts.map +1 -0
- package/dist/ingest/file.js +74 -0
- package/dist/ingest/file.js.map +1 -0
- package/dist/ingest/visual.d.ts +52 -0
- package/dist/ingest/visual.d.ts.map +1 -0
- package/dist/ingest/visual.js +294 -0
- package/dist/ingest/visual.js.map +1 -0
- package/dist/parser/docx-parser.d.ts +12 -0
- package/dist/parser/docx-parser.d.ts.map +1 -0
- package/dist/parser/docx-parser.js +375 -0
- package/dist/parser/docx-parser.js.map +1 -0
- package/dist/parser/html-parser.d.ts +16 -0
- package/dist/parser/html-parser.d.ts.map +1 -0
- package/dist/parser/html-parser.js +119 -0
- package/dist/parser/html-parser.js.map +1 -0
- package/dist/parser/index.d.ts +125 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +364 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/pdf-extract.d.ts +49 -0
- package/dist/parser/pdf-extract.d.ts.map +1 -0
- package/dist/parser/pdf-extract.js +114 -0
- package/dist/parser/pdf-extract.js.map +1 -0
- package/dist/parser/pdf-filter.d.ts +91 -0
- package/dist/parser/pdf-filter.d.ts.map +1 -0
- package/dist/parser/pdf-filter.js +522 -0
- package/dist/parser/pdf-filter.js.map +1 -0
- package/dist/parser/title-extractor.d.ts +28 -0
- package/dist/parser/title-extractor.d.ts.map +1 -0
- package/dist/parser/title-extractor.js +105 -0
- package/dist/parser/title-extractor.js.map +1 -0
- package/dist/pdf-visual/captioner.d.ts +11 -0
- package/dist/pdf-visual/captioner.d.ts.map +1 -0
- package/dist/pdf-visual/captioner.js +48 -0
- package/dist/pdf-visual/captioner.js.map +1 -0
- package/dist/pdf-visual/captioners/fast.d.ts +7 -0
- package/dist/pdf-visual/captioners/fast.d.ts.map +1 -0
- package/dist/pdf-visual/captioners/fast.js +108 -0
- package/dist/pdf-visual/captioners/fast.js.map +1 -0
- package/dist/pdf-visual/captioners/quality.d.ts +7 -0
- package/dist/pdf-visual/captioners/quality.d.ts.map +1 -0
- package/dist/pdf-visual/captioners/quality.js +101 -0
- package/dist/pdf-visual/captioners/quality.js.map +1 -0
- package/dist/pdf-visual/captioners/shared.d.ts +81 -0
- package/dist/pdf-visual/captioners/shared.d.ts.map +1 -0
- package/dist/pdf-visual/captioners/shared.js +156 -0
- package/dist/pdf-visual/captioners/shared.js.map +1 -0
- package/dist/pdf-visual/detector.d.ts +9 -0
- package/dist/pdf-visual/detector.d.ts.map +1 -0
- package/dist/pdf-visual/detector.js +269 -0
- package/dist/pdf-visual/detector.js.map +1 -0
- package/dist/pdf-visual/index.d.ts +13 -0
- package/dist/pdf-visual/index.d.ts.map +1 -0
- package/dist/pdf-visual/index.js +53 -0
- package/dist/pdf-visual/index.js.map +1 -0
- package/dist/pdf-visual/renderer.d.ts +9 -0
- package/dist/pdf-visual/renderer.d.ts.map +1 -0
- package/dist/pdf-visual/renderer.js +186 -0
- package/dist/pdf-visual/renderer.js.map +1 -0
- package/dist/pdf-visual/types.d.ts +53 -0
- package/dist/pdf-visual/types.d.ts.map +1 -0
- package/dist/pdf-visual/types.js +17 -0
- package/dist/pdf-visual/types.js.map +1 -0
- package/dist/server/error-utils.d.ts +63 -0
- package/dist/server/error-utils.d.ts.map +1 -0
- package/dist/server/error-utils.js +124 -0
- package/dist/server/error-utils.js.map +1 -0
- package/dist/server/index.d.ts +216 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +1068 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/list-scanner.d.ts +30 -0
- package/dist/server/list-scanner.d.ts.map +1 -0
- package/dist/server/list-scanner.js +50 -0
- package/dist/server/list-scanner.js.map +1 -0
- package/dist/server/tool-definitions.d.ts +8 -0
- package/dist/server/tool-definitions.d.ts.map +1 -0
- package/dist/server/tool-definitions.js +181 -0
- package/dist/server/tool-definitions.js.map +1 -0
- package/dist/server/tool-input.d.ts +37 -0
- package/dist/server/tool-input.d.ts.map +1 -0
- package/dist/server/tool-input.js +211 -0
- package/dist/server/tool-input.js.map +1 -0
- package/dist/server/types.d.ts +307 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +3 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server-main.d.ts +40 -0
- package/dist/server-main.d.ts.map +1 -0
- package/dist/server-main.js +254 -0
- package/dist/server-main.js.map +1 -0
- package/dist/utils/base-dirs.d.ts +145 -0
- package/dist/utils/base-dirs.d.ts.map +1 -0
- package/dist/utils/base-dirs.js +344 -0
- package/dist/utils/base-dirs.js.map +1 -0
- package/dist/utils/errors.d.ts +32 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +61 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/limits.d.ts +26 -0
- package/dist/utils/limits.d.ts.map +1 -0
- package/dist/utils/limits.js +28 -0
- package/dist/utils/limits.js.map +1 -0
- package/dist/utils/list-sources.d.ts +38 -0
- package/dist/utils/list-sources.d.ts.map +1 -0
- package/dist/utils/list-sources.js +40 -0
- package/dist/utils/list-sources.js.map +1 -0
- package/dist/utils/raw-data-utils.d.ts +76 -0
- package/dist/utils/raw-data-utils.d.ts.map +1 -0
- package/dist/utils/raw-data-utils.js +202 -0
- package/dist/utils/raw-data-utils.js.map +1 -0
- package/dist/utils/scan.d.ts +114 -0
- package/dist/utils/scan.d.ts.map +1 -0
- package/dist/utils/scan.js +209 -0
- package/dist/utils/scan.js.map +1 -0
- package/dist/utils/scope-match.d.ts +38 -0
- package/dist/utils/scope-match.d.ts.map +1 -0
- package/dist/utils/scope-match.js +86 -0
- package/dist/utils/scope-match.js.map +1 -0
- package/dist/utils/sensitive-path.d.ts +9 -0
- package/dist/utils/sensitive-path.d.ts.map +1 -0
- package/dist/utils/sensitive-path.js +78 -0
- package/dist/utils/sensitive-path.js.map +1 -0
- package/dist/utils/sync-path-key.d.ts +14 -0
- package/dist/utils/sync-path-key.d.ts.map +1 -0
- package/dist/utils/sync-path-key.js +27 -0
- package/dist/utils/sync-path-key.js.map +1 -0
- package/dist/utils/type-guards.d.ts +18 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +34 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/dist/utils/visual-profile.d.ts +10 -0
- package/dist/utils/visual-profile.d.ts.map +1 -0
- package/dist/utils/visual-profile.js +15 -0
- package/dist/utils/visual-profile.js.map +1 -0
- package/dist/vectordb/index.d.ts +132 -0
- package/dist/vectordb/index.d.ts.map +1 -0
- package/dist/vectordb/index.js +617 -0
- package/dist/vectordb/index.js.map +1 -0
- package/dist/vectordb/search-filters.d.ts +15 -0
- package/dist/vectordb/search-filters.d.ts.map +1 -0
- package/dist/vectordb/search-filters.js +129 -0
- package/dist/vectordb/search-filters.js.map +1 -0
- package/dist/vectordb/types.d.ts +194 -0
- package/dist/vectordb/types.d.ts.map +1 -0
- package/dist/vectordb/types.js +237 -0
- package/dist/vectordb/types.js.map +1 -0
- package/package.json +108 -0
- package/skills/mcp-local-rag/SKILL.md +234 -0
- package/skills/mcp-local-rag/references/cli-reference.md +190 -0
- package/skills/mcp-local-rag/references/html-ingestion.md +78 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import type { BaseDirsConfigError } from '../utils/base-dirs.js';
|
|
2
|
+
import type { ContentFormat } from '../utils/raw-data-utils.js';
|
|
3
|
+
import type { QualityProfile } from '../utils/visual-profile.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
|
+
/** Remote embedding server base URL (TEI-compatible /embed). Unset → local Transformers.js. */
|
|
24
|
+
embeddingServerUrl?: string;
|
|
25
|
+
/** Maximum distance threshold for quality filtering (optional) */
|
|
26
|
+
maxDistance?: number;
|
|
27
|
+
/** Grouping mode for quality filtering (optional) */
|
|
28
|
+
grouping?: GroupingMode;
|
|
29
|
+
/** Hybrid search weight for BM25 (0.0 = vector only, 1.0 = BM25 only, default 0.6) */
|
|
30
|
+
hybridWeight?: number;
|
|
31
|
+
/** Maximum number of files to keep in search results (optional) */
|
|
32
|
+
maxFiles?: number;
|
|
33
|
+
/** Minimum chunk length in characters (optional, default: 50) */
|
|
34
|
+
chunkMinLength?: number;
|
|
35
|
+
/** Store bounded PDF regions and Mammoth-produced DOCX images. */
|
|
36
|
+
storeImages?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Normal-path roots, index-aligned with the realpath'd `baseDirs` boundary,
|
|
39
|
+
* used for user-facing scan and display so paths match the stored DB keys.
|
|
40
|
+
* Legacy `{ baseDir }` callers fall back to `baseDirs`.
|
|
41
|
+
*/
|
|
42
|
+
rawBaseDirs?: readonly string[];
|
|
43
|
+
/** Configuration validation warnings to surface to users via MCP annotations */
|
|
44
|
+
configWarnings?: string[];
|
|
45
|
+
/**
|
|
46
|
+
* When present the server is in degraded mode: `status` stays callable for
|
|
47
|
+
* diagnosis, while root-dependent tools surface this first.
|
|
48
|
+
*/
|
|
49
|
+
configError?: BaseDirsConfigError;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* RAGServer configuration. Exactly one of `baseDir` (legacy) or `baseDirs`
|
|
53
|
+
* must be supplied; the constructor normalizes both to `baseDirs` and derives
|
|
54
|
+
* the legacy accessor as `baseDirs[0]`.
|
|
55
|
+
*/
|
|
56
|
+
export type RAGServerConfig = (RAGServerConfigBase & {
|
|
57
|
+
/** Document base directory (legacy single-root shape). */
|
|
58
|
+
baseDir: string;
|
|
59
|
+
baseDirs?: undefined;
|
|
60
|
+
}) | (RAGServerConfigBase & {
|
|
61
|
+
/** One or more allowed document base directories (multi-root shape). */
|
|
62
|
+
baseDirs: string[];
|
|
63
|
+
baseDir?: undefined;
|
|
64
|
+
});
|
|
65
|
+
/**
|
|
66
|
+
* query_documents tool input
|
|
67
|
+
*/
|
|
68
|
+
export interface QueryDocumentsInput {
|
|
69
|
+
/** Natural language query */
|
|
70
|
+
query: string;
|
|
71
|
+
/** Number of results to retrieve (default 10) */
|
|
72
|
+
limit?: number;
|
|
73
|
+
/** Path prefix scope (one or a list); the parser normalizes to `string[]`. */
|
|
74
|
+
scope?: string | string[];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* list_files tool input
|
|
78
|
+
*/
|
|
79
|
+
export interface ListFilesInput {
|
|
80
|
+
/** Path prefix scope (one or a list); the parser normalizes to `string[]`. */
|
|
81
|
+
scope?: string | string[];
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* ingest_file tool input
|
|
85
|
+
*/
|
|
86
|
+
export interface IngestFileInput {
|
|
87
|
+
/** File path */
|
|
88
|
+
filePath: string;
|
|
89
|
+
/**
|
|
90
|
+
* When true and `filePath` is a PDF, VLM captioning runs. Silently coerced to
|
|
91
|
+
* text-only for non-PDFs. The handler still checks at runtime, because MCP
|
|
92
|
+
* arguments arrive as `unknown`.
|
|
93
|
+
*/
|
|
94
|
+
visual?: boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Visual-quality profile when `visual` is true. Some MCP clients send the
|
|
97
|
+
* empty string for unspecified optional parameters; the transport decoder
|
|
98
|
+
* normalizes it before this type reaches the handler.
|
|
99
|
+
*/
|
|
100
|
+
visualQuality?: QualityProfile;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* ingest_data tool input metadata
|
|
104
|
+
*/
|
|
105
|
+
interface IngestDataMetadata {
|
|
106
|
+
/** Source identifier: URL ("https://...") or custom ID ("clipboard://2024-12-30") */
|
|
107
|
+
source: string;
|
|
108
|
+
/** Content format */
|
|
109
|
+
format: ContentFormat;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* ingest_data tool input
|
|
113
|
+
*/
|
|
114
|
+
export interface IngestDataInput {
|
|
115
|
+
/** Content to ingest (text, HTML, or Markdown) */
|
|
116
|
+
content: string;
|
|
117
|
+
/** Content metadata */
|
|
118
|
+
metadata: IngestDataMetadata;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* delete_file tool input
|
|
122
|
+
* Either filePath or source must be provided
|
|
123
|
+
*/
|
|
124
|
+
export type DeleteFileInput = {
|
|
125
|
+
filePath: string;
|
|
126
|
+
source?: never;
|
|
127
|
+
} | {
|
|
128
|
+
source: string;
|
|
129
|
+
filePath?: never;
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* delete_file tool output
|
|
133
|
+
*/
|
|
134
|
+
export interface DeleteFileResult {
|
|
135
|
+
/** Resolved file path used for the delete operation */
|
|
136
|
+
filePath: string;
|
|
137
|
+
/** True when the delete operation completed (idempotent; not "something was removed") */
|
|
138
|
+
deleted: true;
|
|
139
|
+
/** Number of vector chunks removed from the database */
|
|
140
|
+
removedChunks: number;
|
|
141
|
+
/** True when ingested chunks and/or raw-data artifacts existed before delete */
|
|
142
|
+
existed: boolean;
|
|
143
|
+
/** Timestamp */
|
|
144
|
+
timestamp: string;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* ingest_file tool output
|
|
148
|
+
*/
|
|
149
|
+
export interface IngestResult {
|
|
150
|
+
/** File path */
|
|
151
|
+
filePath: string;
|
|
152
|
+
/** Chunk count */
|
|
153
|
+
chunkCount: number;
|
|
154
|
+
/** Timestamp */
|
|
155
|
+
timestamp: string;
|
|
156
|
+
/** Document title extracted from file content (display-only, not used for scoring) */
|
|
157
|
+
fileTitle: string | null;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* One file found under an effective base directory. `baseDir` is always
|
|
161
|
+
* present, including single-root configs — additive over the legacy shape, so
|
|
162
|
+
* clients that ignore it keep working.
|
|
163
|
+
*/
|
|
164
|
+
export type FileEntry = {
|
|
165
|
+
filePath: string;
|
|
166
|
+
baseDir: string;
|
|
167
|
+
ingested: true;
|
|
168
|
+
chunkCount: number;
|
|
169
|
+
timestamp: string;
|
|
170
|
+
} | {
|
|
171
|
+
filePath: string;
|
|
172
|
+
baseDir: string;
|
|
173
|
+
ingested: false;
|
|
174
|
+
};
|
|
175
|
+
/**
|
|
176
|
+
* list_files tool output — entry for content ingested via ingest_data,
|
|
177
|
+
* or an orphaned DB entry whose file no longer exists on disk
|
|
178
|
+
*/
|
|
179
|
+
export type SourceEntry = {
|
|
180
|
+
source: string;
|
|
181
|
+
chunkCount: number;
|
|
182
|
+
timestamp: string;
|
|
183
|
+
} | {
|
|
184
|
+
filePath: string;
|
|
185
|
+
chunkCount: number;
|
|
186
|
+
timestamp: string;
|
|
187
|
+
};
|
|
188
|
+
/**
|
|
189
|
+
* list_files output.
|
|
190
|
+
*
|
|
191
|
+
* `baseDir` remains as `baseDirs[0]` for clients written against the
|
|
192
|
+
* single-root shape. Duplicate paths across roots collapse to the first
|
|
193
|
+
* occurrence in root order. `sources` holds raw-data and orphaned DB entries,
|
|
194
|
+
* which no root produced and so carry no `baseDir`.
|
|
195
|
+
*/
|
|
196
|
+
export interface ListFilesResult {
|
|
197
|
+
baseDir: string;
|
|
198
|
+
baseDirs: string[];
|
|
199
|
+
files: FileEntry[];
|
|
200
|
+
sources: SourceEntry[];
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* query_documents tool output
|
|
204
|
+
*/
|
|
205
|
+
export interface QueryResult {
|
|
206
|
+
/** File path */
|
|
207
|
+
filePath: string;
|
|
208
|
+
/** Chunk index */
|
|
209
|
+
chunkIndex: number;
|
|
210
|
+
/** Text */
|
|
211
|
+
text: string;
|
|
212
|
+
/** Similarity score */
|
|
213
|
+
score: number;
|
|
214
|
+
/** Original source (only for raw-data files, e.g., URLs ingested via ingest_data) */
|
|
215
|
+
source?: string;
|
|
216
|
+
/** Document title extracted from file content (display-only, not used for scoring) */
|
|
217
|
+
fileTitle: string | null;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* read_chunk_neighbors tool input.
|
|
221
|
+
* Exactly one of filePath / source must be provided (XOR).
|
|
222
|
+
*/
|
|
223
|
+
export type ReadChunkNeighborsInput = DeleteFileInput & {
|
|
224
|
+
/** Target chunk index (zero-based, required, non-negative integer). */
|
|
225
|
+
chunkIndex: number;
|
|
226
|
+
/** Number of chunks before the target to include (default 2, non-negative integer). */
|
|
227
|
+
before?: number;
|
|
228
|
+
/** Number of chunks after the target to include (default 2, non-negative integer). */
|
|
229
|
+
after?: number;
|
|
230
|
+
};
|
|
231
|
+
/**
|
|
232
|
+
* read_chunk_neighbors output item. `isTarget` is true only for the requested
|
|
233
|
+
* target when it exists; `source` appears only on raw-data rows. `fileTitle`
|
|
234
|
+
* mirrors `QueryResult` so results are drop-in with query_documents.
|
|
235
|
+
*/
|
|
236
|
+
export interface ReadChunkNeighborsResultItem {
|
|
237
|
+
/** File path */
|
|
238
|
+
filePath: string;
|
|
239
|
+
/** Chunk index */
|
|
240
|
+
chunkIndex: number;
|
|
241
|
+
/** Text */
|
|
242
|
+
text: string;
|
|
243
|
+
/** True iff this chunk's chunkIndex matches the requested target. */
|
|
244
|
+
isTarget: boolean;
|
|
245
|
+
/** Original source (only for raw-data files, e.g., URLs ingested via ingest_data). */
|
|
246
|
+
source?: string;
|
|
247
|
+
/** Document title extracted from file content (display-only, not used for scoring) */
|
|
248
|
+
fileTitle: string | null;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* sync_start tool input
|
|
252
|
+
*/
|
|
253
|
+
export interface SyncStartInput {
|
|
254
|
+
/** Absolute path inside a configured root. Omitted means every configured root. */
|
|
255
|
+
path?: string;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* sync_status tool input
|
|
259
|
+
*/
|
|
260
|
+
export interface SyncStatusInput {
|
|
261
|
+
/** Identifier returned by sync_start. */
|
|
262
|
+
jobId: string;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Lifecycle of the one process-local sync job the server retains. There is no
|
|
266
|
+
* cancelled, queued, or recovered state: the record lives only for the server
|
|
267
|
+
* process and a new job replaces a terminal one.
|
|
268
|
+
*/
|
|
269
|
+
export type SyncJobState = 'running' | 'succeeded' | 'failed';
|
|
270
|
+
/**
|
|
271
|
+
* Per-file outcome counters of a sync job. Structurally identical to the sync
|
|
272
|
+
* core's counters, restated here because `server/` does not depend on
|
|
273
|
+
* `features/`.
|
|
274
|
+
*/
|
|
275
|
+
export interface SyncSummary {
|
|
276
|
+
/** Files re-ingested because they were new, changed, or stored inconsistently. */
|
|
277
|
+
upserted: number;
|
|
278
|
+
/** Files whose stored content identity already matched the disk bytes. */
|
|
279
|
+
skipped: number;
|
|
280
|
+
/** Present files that produced zero chunks; their prior rows and hash are kept. */
|
|
281
|
+
empty: number;
|
|
282
|
+
/** Indexed files removed from the index. Counts files, not rows, and is outside `completed`. */
|
|
283
|
+
pruned: number;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* sync_status output — the whole pollable record for one job.
|
|
287
|
+
*
|
|
288
|
+
* `total` stays `null` until the scan has counted the disk files, and
|
|
289
|
+
* `completed` never exceeds a non-null `total`. A job succeeds only when
|
|
290
|
+
* `error` is `null`; a failure carries one message, naming the file when
|
|
291
|
+
* the failure was per-file.
|
|
292
|
+
*/
|
|
293
|
+
export interface SyncStatusResult {
|
|
294
|
+
jobId: string;
|
|
295
|
+
state: SyncJobState;
|
|
296
|
+
total: number | null;
|
|
297
|
+
completed: number;
|
|
298
|
+
summary: SyncSummary;
|
|
299
|
+
/**
|
|
300
|
+
* Scanner coverage warnings, carried as JSON rather than as the content
|
|
301
|
+
* blocks `list_files` uses, because status is a single pollable record.
|
|
302
|
+
*/
|
|
303
|
+
warnings: string[];
|
|
304
|
+
error: string | null;
|
|
305
|
+
}
|
|
306
|
+
export {};
|
|
307
|
+
//# 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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA,iCAAiC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
/** Resolved server config type, named so helpers can share it. */
|
|
31
|
+
type ServerConfig = ConstructorParameters<typeof RAGServer>[0];
|
|
32
|
+
/**
|
|
33
|
+
* Single source of truth for BASE_DIRS / BASE_DIR / cwd precedence. A resolver
|
|
34
|
+
* error never falls back to cwd.
|
|
35
|
+
*/
|
|
36
|
+
export declare function resolveServerConfig(env: NodeJS.ProcessEnv, cwd: string): Promise<ServerConfig>;
|
|
37
|
+
/** Env-only configuration, so a bare `mcp-local-rag` launch suits MCP clients. */
|
|
38
|
+
export declare function startServer(): Promise<void>;
|
|
39
|
+
export {};
|
|
40
|
+
//# 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,CAUtF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAU/E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAU5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAUhF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAUlF;AAED,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,CAehF;AAMD,kEAAkE;AAClE,KAAK,YAAY,GAAG,qBAAqB,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;AA4H9D;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,YAAY,CAAC,CAoCvB;AAED,kFAAkF;AAClF,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAqBjD"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
// MCP Server entry point
|
|
2
|
+
import { resolveDevice, resolveDtype } from './cli/options.js';
|
|
3
|
+
import { RAGServer } from './server/index.js';
|
|
4
|
+
import { BaseDirsConfigError, parseBaseDirsEnv, resolveBaseDirs } from './utils/base-dirs.js';
|
|
5
|
+
import { DEFAULT_MAX_FILE_SIZE, MAX_CHUNK_MIN_LENGTH, MAX_FILE_SIZE_LIMIT } from './utils/limits.js';
|
|
6
|
+
import { checkSensitivePath } from './utils/sensitive-path.js';
|
|
7
|
+
/**
|
|
8
|
+
* Parse grouping mode from environment variable
|
|
9
|
+
*/
|
|
10
|
+
export function parseGroupingMode(value) {
|
|
11
|
+
if (!value) {
|
|
12
|
+
return { value: undefined };
|
|
13
|
+
}
|
|
14
|
+
const normalized = value.toLowerCase().trim();
|
|
15
|
+
if (normalized === 'similar' || normalized === 'related') {
|
|
16
|
+
return { value: normalized };
|
|
17
|
+
}
|
|
18
|
+
const warning = `Invalid RAG_GROUPING value: "${value.slice(0, 100)}". Expected "similar" or "related". Ignoring.`;
|
|
19
|
+
return { value: undefined, warning };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Parse max distance from environment variable
|
|
23
|
+
*/
|
|
24
|
+
export function parseMaxDistance(value) {
|
|
25
|
+
if (!value) {
|
|
26
|
+
return { value: undefined };
|
|
27
|
+
}
|
|
28
|
+
const parsed = Number.parseFloat(value);
|
|
29
|
+
if (Number.isNaN(parsed) || parsed <= 0 || !Number.isFinite(parsed)) {
|
|
30
|
+
const warning = `Invalid RAG_MAX_DISTANCE value: "${value.slice(0, 100)}". Expected positive number. Ignoring.`;
|
|
31
|
+
return { value: undefined, warning };
|
|
32
|
+
}
|
|
33
|
+
return { value: parsed };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Parse max files from environment variable
|
|
37
|
+
*/
|
|
38
|
+
export function parseMaxFiles(value) {
|
|
39
|
+
if (!value) {
|
|
40
|
+
return { value: undefined };
|
|
41
|
+
}
|
|
42
|
+
const parsed = Number.parseInt(value, 10);
|
|
43
|
+
if (Number.isNaN(parsed) || parsed < 1) {
|
|
44
|
+
const warning = `Invalid RAG_MAX_FILES value: "${value.slice(0, 100)}". Expected positive integer (>= 1). Ignoring.`;
|
|
45
|
+
return { value: undefined, warning };
|
|
46
|
+
}
|
|
47
|
+
return { value: parsed };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Parse hybrid weight from environment variable
|
|
51
|
+
*/
|
|
52
|
+
export function parseHybridWeight(value) {
|
|
53
|
+
if (!value) {
|
|
54
|
+
return { value: undefined };
|
|
55
|
+
}
|
|
56
|
+
const parsed = Number.parseFloat(value);
|
|
57
|
+
if (Number.isNaN(parsed) || parsed < 0 || parsed > 1) {
|
|
58
|
+
const warning = `Invalid RAG_HYBRID_WEIGHT value: "${value.slice(0, 100)}". Expected 0.0-1.0. Using default (0.6).`;
|
|
59
|
+
return { value: undefined, warning };
|
|
60
|
+
}
|
|
61
|
+
return { value: parsed };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Parse chunk minimum length from environment variable
|
|
65
|
+
*/
|
|
66
|
+
export function parseChunkMinLength(value) {
|
|
67
|
+
if (!value) {
|
|
68
|
+
return { value: undefined };
|
|
69
|
+
}
|
|
70
|
+
const parsed = Number.parseInt(value, 10);
|
|
71
|
+
if (Number.isNaN(parsed) || parsed < 1 || parsed > MAX_CHUNK_MIN_LENGTH) {
|
|
72
|
+
const warning = `Invalid CHUNK_MIN_LENGTH value: "${value.slice(0, 100)}". Expected integer between 1 and ${MAX_CHUNK_MIN_LENGTH}. Ignoring.`;
|
|
73
|
+
return { value: undefined, warning };
|
|
74
|
+
}
|
|
75
|
+
return { value: parsed };
|
|
76
|
+
}
|
|
77
|
+
/** Parse the independent PDF image-storage toggle. */
|
|
78
|
+
export function parseStoreImages(value) {
|
|
79
|
+
const normalized = value?.trim().toLowerCase() ?? '';
|
|
80
|
+
if (normalized.length === 0) {
|
|
81
|
+
return { value: false };
|
|
82
|
+
}
|
|
83
|
+
if (['1', 'true', 'yes', 'on'].includes(normalized)) {
|
|
84
|
+
return { value: true };
|
|
85
|
+
}
|
|
86
|
+
if (['0', 'false', 'no', 'off'].includes(normalized)) {
|
|
87
|
+
return { value: false };
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
value: false,
|
|
91
|
+
warning: `Invalid STORE_IMAGES value: "${value?.slice(0, 100)}". Expected one of 1, true, yes, on, 0, false, no, or off. Using false.`,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/** Checked before realpath, which would turn `/etc` into `/private/etc`. */
|
|
95
|
+
function collectRawSensitiveErrors(env) {
|
|
96
|
+
const errors = [];
|
|
97
|
+
const baseDirs = env['BASE_DIRS'];
|
|
98
|
+
if (baseDirs !== undefined && baseDirs.length > 0) {
|
|
99
|
+
const parsed = parseBaseDirsEnv(baseDirs);
|
|
100
|
+
if (!parsed.ok) {
|
|
101
|
+
return errors;
|
|
102
|
+
}
|
|
103
|
+
for (const raw of parsed.value) {
|
|
104
|
+
const sensitive = checkSensitivePath(raw, 'BASE_DIRS');
|
|
105
|
+
if (sensitive) {
|
|
106
|
+
errors.push(sensitive);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return errors;
|
|
110
|
+
}
|
|
111
|
+
const baseDir = env['BASE_DIR'];
|
|
112
|
+
if (baseDir !== undefined && baseDir.trim().length > 0) {
|
|
113
|
+
const sensitive = checkSensitivePath(baseDir, 'BASE_DIR');
|
|
114
|
+
if (sensitive) {
|
|
115
|
+
errors.push(sensitive);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return errors;
|
|
119
|
+
}
|
|
120
|
+
/** No usable root: every tool that needs one fails closed with `error`. */
|
|
121
|
+
function noRoots(error) {
|
|
122
|
+
return { baseDirs: [], rawBaseDirs: [], configError: error, warnings: [error.message] };
|
|
123
|
+
}
|
|
124
|
+
async function resolveRoots(env, cwd) {
|
|
125
|
+
// Raw sensitive-path matches take precedence over resolver errors.
|
|
126
|
+
const rawSensitiveErrors = collectRawSensitiveErrors(env);
|
|
127
|
+
if (rawSensitiveErrors.length > 0) {
|
|
128
|
+
return noRoots(new BaseDirsConfigError([...new Set(rawSensitiveErrors)].join('; ')));
|
|
129
|
+
}
|
|
130
|
+
const result = await resolveBaseDirs({
|
|
131
|
+
envBaseDirs: env['BASE_DIRS'],
|
|
132
|
+
envBaseDir: env['BASE_DIR'],
|
|
133
|
+
cwd,
|
|
134
|
+
});
|
|
135
|
+
if (!result.ok) {
|
|
136
|
+
return noRoots(result.error);
|
|
137
|
+
}
|
|
138
|
+
const baseDirs = env['BASE_DIRS'];
|
|
139
|
+
const sourceFlag = baseDirs !== undefined && baseDirs.length > 0 ? 'BASE_DIRS' : 'BASE_DIR';
|
|
140
|
+
const sensitiveErrors = [];
|
|
141
|
+
for (const root of result.config.baseDirs) {
|
|
142
|
+
const sensitive = checkSensitivePath(root, sourceFlag);
|
|
143
|
+
if (sensitive) {
|
|
144
|
+
sensitiveErrors.push(sensitive);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (sensitiveErrors.length > 0) {
|
|
148
|
+
return noRoots(new BaseDirsConfigError([...new Set(sensitiveErrors)].join('; ')));
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
baseDirs: result.config.baseDirs,
|
|
152
|
+
rawBaseDirs: result.config.rawBaseDirs,
|
|
153
|
+
warnings: result.warnings.map((warning) => warning.message),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function resolveMaxFileSize(env) {
|
|
157
|
+
const raw = env['MAX_FILE_SIZE'];
|
|
158
|
+
const parsed = raw ? Number(raw) : DEFAULT_MAX_FILE_SIZE;
|
|
159
|
+
if (!Number.isInteger(parsed) || parsed < 1 || parsed > MAX_FILE_SIZE_LIMIT) {
|
|
160
|
+
return {
|
|
161
|
+
value: DEFAULT_MAX_FILE_SIZE,
|
|
162
|
+
warning: `Invalid MAX_FILE_SIZE value: "${raw?.slice(0, 100)}". Expected integer between 1 and ${MAX_FILE_SIZE_LIMIT}. Using default (${DEFAULT_MAX_FILE_SIZE}).`,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
return { value: parsed };
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Apply the quality-filter settings that are only set when defined, so an unset
|
|
169
|
+
* variable keeps meaning "use the downstream default". Returns their warnings.
|
|
170
|
+
*/
|
|
171
|
+
function applyOptionalSettings(config, env) {
|
|
172
|
+
const maxDistance = parseMaxDistance(env['RAG_MAX_DISTANCE']);
|
|
173
|
+
const grouping = parseGroupingMode(env['RAG_GROUPING']);
|
|
174
|
+
const maxFiles = parseMaxFiles(env['RAG_MAX_FILES']);
|
|
175
|
+
const hybridWeight = parseHybridWeight(env['RAG_HYBRID_WEIGHT']);
|
|
176
|
+
const chunkMinLength = parseChunkMinLength(env['CHUNK_MIN_LENGTH']);
|
|
177
|
+
const storeImages = parseStoreImages(env['STORE_IMAGES']);
|
|
178
|
+
if (maxDistance.value !== undefined) {
|
|
179
|
+
config.maxDistance = maxDistance.value;
|
|
180
|
+
}
|
|
181
|
+
if (grouping.value !== undefined) {
|
|
182
|
+
config.grouping = grouping.value;
|
|
183
|
+
}
|
|
184
|
+
if (maxFiles.value !== undefined) {
|
|
185
|
+
config.maxFiles = maxFiles.value;
|
|
186
|
+
}
|
|
187
|
+
if (hybridWeight.value !== undefined) {
|
|
188
|
+
config.hybridWeight = hybridWeight.value;
|
|
189
|
+
}
|
|
190
|
+
if (chunkMinLength.value !== undefined) {
|
|
191
|
+
config.chunkMinLength = chunkMinLength.value;
|
|
192
|
+
}
|
|
193
|
+
config.storeImages = storeImages.value ?? false;
|
|
194
|
+
return [maxDistance, grouping, maxFiles, hybridWeight, chunkMinLength, storeImages]
|
|
195
|
+
.map((parsed) => parsed.warning)
|
|
196
|
+
.filter((warning) => warning !== undefined);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Single source of truth for BASE_DIRS / BASE_DIR / cwd precedence. A resolver
|
|
200
|
+
* error never falls back to cwd.
|
|
201
|
+
*/
|
|
202
|
+
export async function resolveServerConfig(env, cwd) {
|
|
203
|
+
const roots = await resolveRoots(env, cwd);
|
|
204
|
+
const maxFileSize = resolveMaxFileSize(env);
|
|
205
|
+
const configWarnings = [...roots.warnings];
|
|
206
|
+
if (maxFileSize.warning !== undefined) {
|
|
207
|
+
configWarnings.push(maxFileSize.warning);
|
|
208
|
+
}
|
|
209
|
+
const config = {
|
|
210
|
+
dbPath: env['DB_PATH'] || './lancedb/',
|
|
211
|
+
modelName: env['MODEL_NAME'] || 'Xenova/all-MiniLM-L6-v2',
|
|
212
|
+
cacheDir: env['CACHE_DIR'] || './models/',
|
|
213
|
+
baseDirs: roots.baseDirs,
|
|
214
|
+
rawBaseDirs: roots.rawBaseDirs,
|
|
215
|
+
maxFileSize: maxFileSize.value,
|
|
216
|
+
device: resolveDevice(env['RAG_DEVICE']),
|
|
217
|
+
storeImages: false,
|
|
218
|
+
};
|
|
219
|
+
configWarnings.push(...applyOptionalSettings(config, env));
|
|
220
|
+
// Set dtype only when defined, so config.dtype === undefined keeps meaning
|
|
221
|
+
// "RAG_DTYPE unset" (the embedder then applies its fp32 default).
|
|
222
|
+
const dtype = resolveDtype(env['RAG_DTYPE']);
|
|
223
|
+
if (dtype !== undefined) {
|
|
224
|
+
config.dtype = dtype;
|
|
225
|
+
}
|
|
226
|
+
if (configWarnings.length > 0) {
|
|
227
|
+
config.configWarnings = configWarnings;
|
|
228
|
+
}
|
|
229
|
+
if (roots.configError !== undefined) {
|
|
230
|
+
config.configError = roots.configError;
|
|
231
|
+
}
|
|
232
|
+
return config;
|
|
233
|
+
}
|
|
234
|
+
/** Env-only configuration, so a bare `mcp-local-rag` launch suits MCP clients. */
|
|
235
|
+
export async function startServer() {
|
|
236
|
+
try {
|
|
237
|
+
const config = await resolveServerConfig(process.env, process.cwd());
|
|
238
|
+
if (config.configWarnings && config.configWarnings.length > 0) {
|
|
239
|
+
console.error('Configuration warnings:', config.configWarnings.join(' | '));
|
|
240
|
+
}
|
|
241
|
+
console.error('Starting RAG MCP Server...');
|
|
242
|
+
console.error('Configuration:', config);
|
|
243
|
+
// Start RAGServer
|
|
244
|
+
const server = new RAGServer(config);
|
|
245
|
+
await server.initialize();
|
|
246
|
+
await server.run();
|
|
247
|
+
console.error('RAG MCP Server started successfully');
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
console.error('Failed to start RAG MCP Server:', error);
|
|
251
|
+
process.exit(1);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=server-main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-main.js","sourceRoot":"","sources":["../src/server-main.ts"],"names":[],"mappings":"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"}
|