grepmind-config 0.1.0-alpha

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/dist/loader.js ADDED
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Config file loader and saver.
3
+ *
4
+ * Handles loading, saving, finding, and creating grepmind.json files.
5
+ */
6
+ import fs from 'node:fs/promises';
7
+ import path from 'node:path';
8
+ import { z } from 'zod';
9
+ import { RAGConfigSchema } from './schema.js';
10
+ import { DEFAULT_CONFIG } from './defaults.js';
11
+ import { isRemoteDbPath } from './path-utils.js';
12
+ /**
13
+ * Config file name.
14
+ */
15
+ export const CONFIG_FILE_NAME = 'grepmind.json';
16
+ /**
17
+ * Legacy config file names (for migration).
18
+ */
19
+ export const LEGACY_CONFIG_FILE_NAMES = ['RAG.config.json', 'indexmcp.json', '.indexmcp.json'];
20
+ /**
21
+ * All recognized config file names (new + legacy).
22
+ */
23
+ export const ALL_CONFIG_FILE_NAMES = [CONFIG_FILE_NAME, ...LEGACY_CONFIG_FILE_NAMES];
24
+ /**
25
+ * Load RAG config from a file path.
26
+ *
27
+ * @param configPath - Absolute path to config file
28
+ * @returns Parsed and validated config
29
+ * @throws Error if file not found or invalid
30
+ */
31
+ export async function loadRAGConfig(configPath) {
32
+ try {
33
+ const content = await fs.readFile(configPath, 'utf-8');
34
+ const rawConfig = JSON.parse(content);
35
+ return RAGConfigSchema.parse(rawConfig);
36
+ }
37
+ catch (error) {
38
+ if (error.code === 'ENOENT') {
39
+ throw new Error(`Config file not found: ${configPath}`);
40
+ }
41
+ if (error instanceof z.ZodError) {
42
+ throw new Error(`Invalid config: ${error.message}`);
43
+ }
44
+ if (error instanceof SyntaxError) {
45
+ throw new Error(`Invalid JSON in config file: ${error.message}`);
46
+ }
47
+ throw error;
48
+ }
49
+ }
50
+ /**
51
+ * Save RAG config to a file path.
52
+ *
53
+ * @param configPath - Absolute path to config file
54
+ * @param config - Config to save
55
+ */
56
+ export async function saveRAGConfig(configPath, config) {
57
+ // Validate before saving
58
+ const validated = RAGConfigSchema.parse(config);
59
+ await fs.writeFile(configPath, JSON.stringify(validated, null, 2));
60
+ }
61
+ /**
62
+ * Find config file in a directory.
63
+ * Searches for grepmind.json first, then legacy names.
64
+ *
65
+ * @param dir - Directory to search in
66
+ * @returns Path to config file or null if not found
67
+ */
68
+ export async function findRAGConfig(dir) {
69
+ for (const fileName of ALL_CONFIG_FILE_NAMES) {
70
+ const configPath = path.join(dir, fileName);
71
+ try {
72
+ await fs.access(configPath);
73
+ return configPath;
74
+ }
75
+ catch {
76
+ // File doesn't exist, try next
77
+ }
78
+ }
79
+ return null;
80
+ }
81
+ /**
82
+ * Check if a directory has a RAG config file.
83
+ *
84
+ * @param dir - Directory to check
85
+ * @returns True if config file exists
86
+ */
87
+ export async function hasRAGConfig(dir) {
88
+ return (await findRAGConfig(dir)) !== null;
89
+ }
90
+ /**
91
+ * Create a new project with grepmind.json.
92
+ *
93
+ * @param projectPath - Directory for the new project
94
+ * @param options - Project configuration options
95
+ * @returns Path to created config file
96
+ */
97
+ export async function createProject(projectPath, options = {}) {
98
+ const absolutePath = path.resolve(projectPath);
99
+ // Check if config already exists
100
+ const existingConfig = await findRAGConfig(absolutePath);
101
+ if (existingConfig) {
102
+ throw new Error(`Project already exists at ${absolutePath}`);
103
+ }
104
+ // Create directory if needed
105
+ await fs.mkdir(absolutePath, { recursive: true });
106
+ // Build config with defaults
107
+ const config = {
108
+ name: options.name || path.basename(absolutePath),
109
+ vaultPaths: options.vaultPaths || DEFAULT_CONFIG.vaultPaths,
110
+ lancedb: {
111
+ dbPath: options.lancedb?.dbPath || DEFAULT_CONFIG.lancedb.dbPath,
112
+ storageOptions: options.lancedb?.storageOptions || DEFAULT_CONFIG.lancedb.storageOptions,
113
+ },
114
+ embedding: {
115
+ provider: options.embedding?.provider || DEFAULT_CONFIG.embedding.provider,
116
+ model: options.embedding?.model,
117
+ // dimensions auto-detected from MODEL_DIMENSIONS map
118
+ voyageModel: options.embedding?.voyageModel,
119
+ localaiBaseUrl: options.embedding?.localaiBaseUrl || DEFAULT_CONFIG.embedding.localaiBaseUrl,
120
+ localaiModel: options.embedding?.localaiModel || DEFAULT_CONFIG.embedding.localaiModel,
121
+ },
122
+ reranking: {
123
+ enabled: options.reranking?.enabled ?? DEFAULT_CONFIG.reranking.enabled,
124
+ provider: options.reranking?.provider ?? DEFAULT_CONFIG.reranking.provider,
125
+ topK: options.reranking?.topK ?? DEFAULT_CONFIG.reranking.topK,
126
+ prerankThreshold: options.reranking?.prerankThreshold ?? DEFAULT_CONFIG.reranking.prerankThreshold,
127
+ maxDocumentLength: options.reranking?.maxDocumentLength ?? DEFAULT_CONFIG.reranking.maxDocumentLength,
128
+ batchSize: options.reranking?.batchSize ?? DEFAULT_CONFIG.reranking.batchSize,
129
+ wasmModel: options.reranking?.wasmModel ?? DEFAULT_CONFIG.reranking.wasmModel,
130
+ voyageModel: options.reranking?.voyageModel ?? DEFAULT_CONFIG.reranking.voyageModel,
131
+ localaiBaseUrl: options.reranking?.localaiBaseUrl ?? DEFAULT_CONFIG.reranking.localaiBaseUrl,
132
+ localaiRerankModel: options.reranking?.localaiRerankModel ?? DEFAULT_CONFIG.reranking.localaiRerankModel,
133
+ },
134
+ code: {
135
+ enabled: options.code?.enabled ?? DEFAULT_CONFIG.code.enabled,
136
+ include: options.code?.include || DEFAULT_CONFIG.code.include,
137
+ exclude: options.code?.exclude || DEFAULT_CONFIG.code.exclude,
138
+ graph: options.code?.graph ?? DEFAULT_CONFIG.code.graph,
139
+ tree: options.code?.tree ?? DEFAULT_CONFIG.code.tree,
140
+ },
141
+ notesFts: {
142
+ enabled: options.notesFts?.enabled ?? DEFAULT_CONFIG.notesFts.enabled,
143
+ stem: options.notesFts?.stem ?? DEFAULT_CONFIG.notesFts.stem,
144
+ language: options.notesFts?.language ?? DEFAULT_CONFIG.notesFts.language,
145
+ withPosition: options.notesFts?.withPosition ?? DEFAULT_CONFIG.notesFts.withPosition,
146
+ removeStopWords: options.notesFts?.removeStopWords ?? DEFAULT_CONFIG.notesFts.removeStopWords,
147
+ baseTokenizer: options.notesFts?.baseTokenizer ?? DEFAULT_CONFIG.notesFts.baseTokenizer,
148
+ lowercase: options.notesFts?.lowercase ?? DEFAULT_CONFIG.notesFts.lowercase,
149
+ asciiFolding: options.notesFts?.asciiFolding ?? DEFAULT_CONFIG.notesFts.asciiFolding,
150
+ maxTokenLength: options.notesFts?.maxTokenLength ?? DEFAULT_CONFIG.notesFts.maxTokenLength,
151
+ },
152
+ codeFts: {
153
+ enabled: options.codeFts?.enabled ?? DEFAULT_CONFIG.codeFts.enabled,
154
+ stem: options.codeFts?.stem ?? DEFAULT_CONFIG.codeFts.stem,
155
+ withPosition: options.codeFts?.withPosition ?? DEFAULT_CONFIG.codeFts.withPosition,
156
+ removeStopWords: options.codeFts?.removeStopWords ?? DEFAULT_CONFIG.codeFts.removeStopWords,
157
+ baseTokenizer: options.codeFts?.baseTokenizer ?? DEFAULT_CONFIG.codeFts.baseTokenizer,
158
+ ngramMinLength: options.codeFts?.ngramMinLength ?? DEFAULT_CONFIG.codeFts.ngramMinLength,
159
+ ngramMaxLength: options.codeFts?.ngramMaxLength ?? DEFAULT_CONFIG.codeFts.ngramMaxLength,
160
+ prefixOnly: options.codeFts?.prefixOnly ?? DEFAULT_CONFIG.codeFts.prefixOnly,
161
+ normalizeIdentifiers: options.codeFts?.normalizeIdentifiers ?? DEFAULT_CONFIG.codeFts.normalizeIdentifiers,
162
+ },
163
+ gitSync: {
164
+ enabled: options.gitSync?.enabled ?? DEFAULT_CONFIG.gitSync.enabled,
165
+ autoSyncOnStartup: options.gitSync?.autoSyncOnStartup ?? DEFAULT_CONFIG.gitSync.autoSyncOnStartup,
166
+ },
167
+ };
168
+ // Validate
169
+ const validated = RAGConfigSchema.parse(config);
170
+ // Create vault directories
171
+ for (const vaultDir of validated.vaultPaths) {
172
+ const vaultPath = path.resolve(absolutePath, vaultDir);
173
+ await fs.mkdir(vaultPath, { recursive: true });
174
+ }
175
+ // Create local LanceDB directory (for local db paths only)
176
+ if (!isRemoteDbPath(validated.lancedb.dbPath)) {
177
+ const lancedbPath = path.resolve(absolutePath, validated.lancedb.dbPath);
178
+ await fs.mkdir(lancedbPath, { recursive: true });
179
+ }
180
+ // Write config file
181
+ const configPath = path.join(absolutePath, CONFIG_FILE_NAME);
182
+ await saveRAGConfig(configPath, validated);
183
+ // Create .gitignore
184
+ if (!isRemoteDbPath(validated.lancedb.dbPath)) {
185
+ const gitignorePath = path.join(absolutePath, '.gitignore');
186
+ const dbPathForGitignore = validated.lancedb.dbPath.replace(/\\/g, '/').replace(/^\.\//, '');
187
+ const dbDirLine = dbPathForGitignore.endsWith('/') ? dbPathForGitignore : `${dbPathForGitignore}/`;
188
+ const gitignoreContent = `# RAG Index
189
+ ${dbDirLine}
190
+ *.lock
191
+ `;
192
+ try {
193
+ await fs.access(gitignorePath);
194
+ // .gitignore exists, append if needed
195
+ const existingContent = await fs.readFile(gitignorePath, 'utf-8');
196
+ if (!existingContent.includes(dbDirLine)) {
197
+ await fs.appendFile(gitignorePath, '\n' + gitignoreContent);
198
+ }
199
+ }
200
+ catch {
201
+ // .gitignore doesn't exist, create it
202
+ await fs.writeFile(gitignorePath, gitignoreContent);
203
+ }
204
+ }
205
+ return configPath;
206
+ }
207
+ /**
208
+ * Migrate a legacy config file to the new format.
209
+ * Creates a new grepmind.json and optionally deletes the old file.
210
+ *
211
+ * @param projectPath - Project directory
212
+ * @param deleteOld - Whether to delete the old config file
213
+ * @returns Path to new config file
214
+ */
215
+ export async function migrateConfig(projectPath, deleteOld = false) {
216
+ const configPath = await findRAGConfig(projectPath);
217
+ if (!configPath) {
218
+ throw new Error(`No config file found in ${projectPath}`);
219
+ }
220
+ const fileName = path.basename(configPath);
221
+ if (fileName === CONFIG_FILE_NAME) {
222
+ // Already using new format
223
+ return configPath;
224
+ }
225
+ // Load and convert
226
+ const config = await loadRAGConfig(configPath);
227
+ // Save to new location
228
+ const newConfigPath = path.join(projectPath, CONFIG_FILE_NAME);
229
+ await saveRAGConfig(newConfigPath, config);
230
+ // Optionally delete old file
231
+ if (deleteOld) {
232
+ await fs.unlink(configPath);
233
+ }
234
+ return newConfigPath;
235
+ }
236
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Secrets } from './types.js';
2
+ /**
3
+ * Returns true when db path is a URI (e.g. s3://bucket/path).
4
+ */
5
+ export declare function isRemoteDbPath(dbPath: string): boolean;
6
+ /**
7
+ * Resolve db path relative to project when it's local. Keep URI paths unchanged.
8
+ */
9
+ export declare function resolveDbPath(projectPath: string, dbPath: string): string;
10
+ /**
11
+ * Local directory for runtime state (WAL/locks/meta) when db is remote.
12
+ */
13
+ export declare function getLocalStateDir(projectPath: string, dbPath: string): string;
14
+ /**
15
+ * Build LanceDB storage options by merging config + runtime secrets.
16
+ */
17
+ export declare function buildLanceStorageOptions(configStorageOptions: Record<string, string> | undefined, secrets: Secrets): Record<string, string> | undefined;
18
+ //# sourceMappingURL=path-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../src/path-utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAKzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAM5E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACxD,OAAO,EAAE,OAAO,GACf,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAsBpC"}
@@ -0,0 +1,52 @@
1
+ import crypto from 'node:crypto';
2
+ import path from 'node:path';
3
+ /**
4
+ * Returns true when db path is a URI (e.g. s3://bucket/path).
5
+ */
6
+ export function isRemoteDbPath(dbPath) {
7
+ return /^[a-z][a-z0-9+.-]*:\/\//i.test(dbPath);
8
+ }
9
+ /**
10
+ * Resolve db path relative to project when it's local. Keep URI paths unchanged.
11
+ */
12
+ export function resolveDbPath(projectPath, dbPath) {
13
+ if (isRemoteDbPath(dbPath)) {
14
+ return dbPath;
15
+ }
16
+ return path.resolve(projectPath, dbPath);
17
+ }
18
+ /**
19
+ * Local directory for runtime state (WAL/locks/meta) when db is remote.
20
+ */
21
+ export function getLocalStateDir(projectPath, dbPath) {
22
+ if (!isRemoteDbPath(dbPath)) {
23
+ return path.resolve(projectPath, dbPath);
24
+ }
25
+ const hash = crypto.createHash('sha1').update(dbPath).digest('hex').slice(0, 12);
26
+ return path.resolve(projectPath, '.lancedb-state', hash);
27
+ }
28
+ /**
29
+ * Build LanceDB storage options by merging config + runtime secrets.
30
+ */
31
+ export function buildLanceStorageOptions(configStorageOptions, secrets) {
32
+ const storageOptions = {
33
+ ...(configStorageOptions || {}),
34
+ };
35
+ if (secrets.s3AccessKeyId) {
36
+ storageOptions.aws_access_key_id = secrets.s3AccessKeyId;
37
+ }
38
+ if (secrets.s3SecretAccessKey) {
39
+ storageOptions.aws_secret_access_key = secrets.s3SecretAccessKey;
40
+ }
41
+ if (secrets.s3SessionToken) {
42
+ storageOptions.aws_session_token = secrets.s3SessionToken;
43
+ }
44
+ if (secrets.s3Region) {
45
+ storageOptions.region = secrets.s3Region;
46
+ }
47
+ if (secrets.s3Endpoint) {
48
+ storageOptions.endpoint = secrets.s3Endpoint;
49
+ }
50
+ return Object.keys(storageOptions).length > 0 ? storageOptions : undefined;
51
+ }
52
+ //# sourceMappingURL=path-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../src/path-utils.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB,EAAE,MAAc;IAC/D,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB,EAAE,MAAc;IAClE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjF,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,oBAAwD,EACxD,OAAgB;IAEhB,MAAM,cAAc,GAA2B;QAC7C,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC;KAChC,CAAC;IAEF,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,cAAc,CAAC,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC;IAC3D,CAAC;IACD,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAC9B,cAAc,CAAC,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IACnE,CAAC;IACD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,cAAc,CAAC,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAC5D,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,cAAc,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC3C,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,cAAc,CAAC,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;IAC/C,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7E,CAAC"}