@sharc-code/mcp 0.2.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.
- package/README.md +134 -0
- package/dist/backend-client.d.ts +251 -0
- package/dist/backend-client.d.ts.map +1 -0
- package/dist/backend-client.js +269 -0
- package/dist/backend-client.js.map +1 -0
- package/dist/backend-handlers.d.ts +243 -0
- package/dist/backend-handlers.d.ts.map +1 -0
- package/dist/backend-handlers.js +1453 -0
- package/dist/backend-handlers.js.map +1 -0
- package/dist/config.d.ts +47 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +94 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +344 -0
- package/dist/index.js.map +1 -0
- package/dist/project-detector.d.ts +42 -0
- package/dist/project-detector.d.ts.map +1 -0
- package/dist/project-detector.js +135 -0
- package/dist/project-detector.js.map +1 -0
- package/dist/utils/env-manager.d.ts +19 -0
- package/dist/utils/env-manager.d.ts.map +1 -0
- package/dist/utils/env-manager.js +99 -0
- package/dist/utils/env-manager.js.map +1 -0
- package/dist/utils.d.ts +10 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +27 -0
- package/dist/utils.js.map +1 -0
- package/dist/watcher/file-watcher.d.ts +64 -0
- package/dist/watcher/file-watcher.d.ts.map +1 -0
- package/dist/watcher/file-watcher.js +263 -0
- package/dist/watcher/file-watcher.js.map +1 -0
- package/dist/watcher/incremental-indexer.d.ts +68 -0
- package/dist/watcher/incremental-indexer.d.ts.map +1 -0
- package/dist/watcher/incremental-indexer.js +254 -0
- package/dist/watcher/incremental-indexer.js.map +1 -0
- package/dist/watcher/index.d.ts +10 -0
- package/dist/watcher/index.d.ts.map +1 -0
- package/dist/watcher/index.js +10 -0
- package/dist/watcher/index.js.map +1 -0
- package/dist/watcher/processing-queue.d.ts +79 -0
- package/dist/watcher/processing-queue.d.ts.map +1 -0
- package/dist/watcher/processing-queue.js +150 -0
- package/dist/watcher/processing-queue.js.map +1 -0
- package/dist/watcher/syntax-guard.d.ts +59 -0
- package/dist/watcher/syntax-guard.d.ts.map +1 -0
- package/dist/watcher/syntax-guard.js +136 -0
- package/dist/watcher/syntax-guard.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Watcher Service
|
|
3
|
+
*
|
|
4
|
+
* Uses chokidar to watch for file changes in codebases.
|
|
5
|
+
* Features:
|
|
6
|
+
* - Debounced batch processing (2 seconds after last change)
|
|
7
|
+
* - Per-codebase isolation
|
|
8
|
+
* - Configurable ignore patterns
|
|
9
|
+
* - Rename handling (delete + add)
|
|
10
|
+
*/
|
|
11
|
+
import chokidar from 'chokidar';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
import { ProcessingQueue } from './processing-queue.js';
|
|
14
|
+
// Supported file extensions (from CHUNK_TIERS in backend-handlers.ts)
|
|
15
|
+
export const SUPPORTED_EXTENSIONS = new Set([
|
|
16
|
+
// Tier 1: Code (AST)
|
|
17
|
+
'.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
|
|
18
|
+
'.py', '.pyi',
|
|
19
|
+
'.go',
|
|
20
|
+
'.rs',
|
|
21
|
+
'.java',
|
|
22
|
+
'.cs',
|
|
23
|
+
'.cpp', '.cc', '.cxx', '.c', '.h', '.hpp',
|
|
24
|
+
'.scala',
|
|
25
|
+
// Tier 2: Docs
|
|
26
|
+
'.md', '.mdx', '.rst', '.txt',
|
|
27
|
+
// Tier 3: Config
|
|
28
|
+
'.json', '.yaml', '.yml', '.toml', '.xml',
|
|
29
|
+
// Tier 4: Other
|
|
30
|
+
'.rb', '.php', '.swift', '.kt', '.vue', '.svelte',
|
|
31
|
+
'.html', '.css', '.scss', '.less', '.sql',
|
|
32
|
+
]);
|
|
33
|
+
// Default ignore patterns
|
|
34
|
+
export const DEFAULT_IGNORE_PATTERNS = [
|
|
35
|
+
'**/node_modules/**',
|
|
36
|
+
'**/.git/**',
|
|
37
|
+
'**/dist/**',
|
|
38
|
+
'**/build/**',
|
|
39
|
+
'**/.next/**',
|
|
40
|
+
'**/coverage/**',
|
|
41
|
+
'**/__pycache__/**',
|
|
42
|
+
'**/venv/**',
|
|
43
|
+
'**/.env',
|
|
44
|
+
'**/.env.*',
|
|
45
|
+
'**/.vscode/**',
|
|
46
|
+
'**/.idea/**',
|
|
47
|
+
'**/*.log',
|
|
48
|
+
'**/package-lock.json',
|
|
49
|
+
'**/yarn.lock',
|
|
50
|
+
'**/pnpm-lock.yaml',
|
|
51
|
+
'**/*.min.js',
|
|
52
|
+
'**/*.min.css',
|
|
53
|
+
'**/*.bundle.js',
|
|
54
|
+
'**/*.chunk.js',
|
|
55
|
+
];
|
|
56
|
+
/**
|
|
57
|
+
* File Watcher Service
|
|
58
|
+
*
|
|
59
|
+
* Watches codebases for file changes and triggers incremental indexing.
|
|
60
|
+
* Each codebase has its own watcher instance with isolated state.
|
|
61
|
+
*/
|
|
62
|
+
export class FileWatcherService {
|
|
63
|
+
constructor(changeProcessor, config = {}) {
|
|
64
|
+
this.watchedCodebases = new Map();
|
|
65
|
+
this.restartAttempts = new Map();
|
|
66
|
+
this.changeProcessor = changeProcessor;
|
|
67
|
+
this.debounceMs = config.debounceMs ?? 2000;
|
|
68
|
+
this.ignorePatterns = config.ignorePatterns ?? DEFAULT_IGNORE_PATTERNS;
|
|
69
|
+
this.verbose = config.verbose ?? (process.env.DEBUG === 'true' || process.env.LOG_LEVEL === 'verbose');
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Start watching a codebase for file changes
|
|
73
|
+
*/
|
|
74
|
+
watchCodebase(codebasePath, collectionName) {
|
|
75
|
+
// Normalize path
|
|
76
|
+
const normalizedPath = path.resolve(codebasePath);
|
|
77
|
+
// Check if already watching
|
|
78
|
+
if (this.watchedCodebases.has(normalizedPath)) {
|
|
79
|
+
console.log(`[Watcher] Already watching: ${normalizedPath}`);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// Create processing queue for this codebase
|
|
83
|
+
const queue = new ProcessingQueue(this.changeProcessor, this.verbose);
|
|
84
|
+
// Create chokidar watcher
|
|
85
|
+
const watcher = chokidar.watch(normalizedPath, {
|
|
86
|
+
ignored: this.ignorePatterns,
|
|
87
|
+
persistent: true,
|
|
88
|
+
ignoreInitial: true, // Don't emit events for existing files
|
|
89
|
+
awaitWriteFinish: {
|
|
90
|
+
stabilityThreshold: 500, // Wait 500ms after last write
|
|
91
|
+
pollInterval: 100,
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
const watched = {
|
|
95
|
+
path: normalizedPath,
|
|
96
|
+
collectionName,
|
|
97
|
+
watcher,
|
|
98
|
+
pendingChanges: new Map(),
|
|
99
|
+
debounceTimer: null,
|
|
100
|
+
queue,
|
|
101
|
+
isShuttingDown: false,
|
|
102
|
+
};
|
|
103
|
+
// Set up event handlers
|
|
104
|
+
watcher.on('add', (filePath) => this.handleFileEvent(normalizedPath, 'add', filePath));
|
|
105
|
+
watcher.on('change', (filePath) => this.handleFileEvent(normalizedPath, 'modify', filePath));
|
|
106
|
+
watcher.on('unlink', (filePath) => this.handleFileEvent(normalizedPath, 'delete', filePath));
|
|
107
|
+
// Handle rename as delete + add (chokidar emits unlink + add)
|
|
108
|
+
// No special handling needed - chokidar automatically does this
|
|
109
|
+
watcher.on('error', (error) => {
|
|
110
|
+
console.error(`[Watcher] Error watching ${normalizedPath}:`, error);
|
|
111
|
+
// Track restart attempts to prevent infinite loop
|
|
112
|
+
const attempts = (this.restartAttempts.get(normalizedPath) || 0) + 1;
|
|
113
|
+
this.restartAttempts.set(normalizedPath, attempts);
|
|
114
|
+
if (attempts > FileWatcherService.MAX_RESTART_ATTEMPTS) {
|
|
115
|
+
console.error(`[Watcher] Max restart attempts (${FileWatcherService.MAX_RESTART_ATTEMPTS}) reached for ${normalizedPath}, giving up`);
|
|
116
|
+
this.unwatchCodebase(normalizedPath).catch(() => { });
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
// Exponential backoff: 5s, 10s, 15s
|
|
120
|
+
const delay = Math.min(5000 * attempts, 30000);
|
|
121
|
+
console.log(`[Watcher] Attempting restart ${attempts}/${FileWatcherService.MAX_RESTART_ATTEMPTS} in ${delay / 1000}s`);
|
|
122
|
+
setTimeout(() => {
|
|
123
|
+
this.unwatchCodebase(normalizedPath)
|
|
124
|
+
.then(() => this.watchCodebase(normalizedPath, collectionName))
|
|
125
|
+
.catch(err => console.error(`[Watcher] Restart failed:`, err));
|
|
126
|
+
}, delay);
|
|
127
|
+
});
|
|
128
|
+
watcher.on('ready', () => {
|
|
129
|
+
// Reset restart attempts on successful start
|
|
130
|
+
this.restartAttempts.delete(normalizedPath);
|
|
131
|
+
console.log(`[Watcher] Started watching: ${normalizedPath}`);
|
|
132
|
+
});
|
|
133
|
+
this.watchedCodebases.set(normalizedPath, watched);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Stop watching a codebase
|
|
137
|
+
*/
|
|
138
|
+
async unwatchCodebase(codebasePath) {
|
|
139
|
+
const normalizedPath = path.resolve(codebasePath);
|
|
140
|
+
const watched = this.watchedCodebases.get(normalizedPath);
|
|
141
|
+
if (!watched) {
|
|
142
|
+
console.log(`[Watcher] Not watching: ${normalizedPath}`);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
// Mark as shutting down to prevent new events from being processed
|
|
146
|
+
watched.isShuttingDown = true;
|
|
147
|
+
// Clear pending debounce timer
|
|
148
|
+
if (watched.debounceTimer) {
|
|
149
|
+
clearTimeout(watched.debounceTimer);
|
|
150
|
+
watched.debounceTimer = null;
|
|
151
|
+
}
|
|
152
|
+
// Clear pending changes
|
|
153
|
+
watched.pendingChanges.clear();
|
|
154
|
+
// Close watcher first to stop new events
|
|
155
|
+
try {
|
|
156
|
+
await watched.watcher.close();
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
console.warn(`[Watcher] Error closing watcher for ${normalizedPath}:`, error);
|
|
160
|
+
}
|
|
161
|
+
// Wait for queue to finish processing (with timeout)
|
|
162
|
+
const graceful = await watched.queue.waitForIdle(5000);
|
|
163
|
+
if (!graceful) {
|
|
164
|
+
console.warn(`[Watcher] Queue timeout for ${normalizedPath}, forcing clear`);
|
|
165
|
+
watched.queue.clear();
|
|
166
|
+
}
|
|
167
|
+
// Clean up restart attempts tracking
|
|
168
|
+
this.restartAttempts.delete(normalizedPath);
|
|
169
|
+
this.watchedCodebases.delete(normalizedPath);
|
|
170
|
+
console.log(`[Watcher] Stopped watching: ${normalizedPath}`);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get list of watched codebase paths
|
|
174
|
+
*/
|
|
175
|
+
getWatchedCodebases() {
|
|
176
|
+
return Array.from(this.watchedCodebases.keys());
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Check if a codebase is being watched
|
|
180
|
+
*/
|
|
181
|
+
isWatching(codebasePath) {
|
|
182
|
+
const normalizedPath = path.resolve(codebasePath);
|
|
183
|
+
return this.watchedCodebases.has(normalizedPath);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Handle a file event from chokidar
|
|
187
|
+
*/
|
|
188
|
+
handleFileEvent(codebasePath, eventType, filePath) {
|
|
189
|
+
const watched = this.watchedCodebases.get(codebasePath);
|
|
190
|
+
if (!watched || watched.isShuttingDown)
|
|
191
|
+
return;
|
|
192
|
+
// Check if file extension is supported
|
|
193
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
194
|
+
if (!SUPPORTED_EXTENSIONS.has(ext)) {
|
|
195
|
+
if (this.verbose) {
|
|
196
|
+
console.log(`[Watcher] Ignoring unsupported extension: ${filePath}`);
|
|
197
|
+
}
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const relativePath = path.relative(codebasePath, filePath);
|
|
201
|
+
if (this.verbose) {
|
|
202
|
+
console.log(`[Watcher] Detected ${eventType}: ${relativePath}`);
|
|
203
|
+
}
|
|
204
|
+
// Store change (overwrites previous for same file)
|
|
205
|
+
watched.pendingChanges.set(relativePath, {
|
|
206
|
+
type: eventType,
|
|
207
|
+
relativePath,
|
|
208
|
+
absolutePath: filePath,
|
|
209
|
+
});
|
|
210
|
+
// Reset debounce timer
|
|
211
|
+
if (watched.debounceTimer) {
|
|
212
|
+
clearTimeout(watched.debounceTimer);
|
|
213
|
+
}
|
|
214
|
+
// Wait for debounce period after last change
|
|
215
|
+
watched.debounceTimer = setTimeout(() => {
|
|
216
|
+
this.processBatchedChanges(codebasePath);
|
|
217
|
+
}, this.debounceMs);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Process all batched changes for a codebase
|
|
221
|
+
*/
|
|
222
|
+
processBatchedChanges(codebasePath) {
|
|
223
|
+
const watched = this.watchedCodebases.get(codebasePath);
|
|
224
|
+
if (!watched)
|
|
225
|
+
return;
|
|
226
|
+
const changes = Array.from(watched.pendingChanges.values());
|
|
227
|
+
watched.pendingChanges.clear();
|
|
228
|
+
watched.debounceTimer = null;
|
|
229
|
+
if (changes.length === 0)
|
|
230
|
+
return;
|
|
231
|
+
// Log summary
|
|
232
|
+
const adds = changes.filter(c => c.type === 'add').length;
|
|
233
|
+
const modifies = changes.filter(c => c.type === 'modify').length;
|
|
234
|
+
const deletes = changes.filter(c => c.type === 'delete').length;
|
|
235
|
+
if (!this.verbose) {
|
|
236
|
+
console.log(`[Watcher] Processing ${changes.length} changes (+${adds} ~${modifies} -${deletes})`);
|
|
237
|
+
}
|
|
238
|
+
// Enqueue all changes for processing
|
|
239
|
+
for (const change of changes) {
|
|
240
|
+
watched.queue.enqueue(change);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Graceful shutdown - stop all watchers
|
|
245
|
+
*/
|
|
246
|
+
async shutdown() {
|
|
247
|
+
console.log(`[Watcher] Shutting down ${this.watchedCodebases.size} watchers...`);
|
|
248
|
+
const results = await Promise.allSettled(Array.from(this.watchedCodebases.keys()).map(p => this.unwatchCodebase(p)));
|
|
249
|
+
const failed = results.filter(r => r.status === 'rejected');
|
|
250
|
+
if (failed.length > 0) {
|
|
251
|
+
console.warn(`[Watcher] ${failed.length} watchers failed to close gracefully`);
|
|
252
|
+
}
|
|
253
|
+
// Force clear any remaining
|
|
254
|
+
if (this.watchedCodebases.size > 0) {
|
|
255
|
+
console.warn(`[Watcher] Force clearing ${this.watchedCodebases.size} remaining watchers`);
|
|
256
|
+
this.watchedCodebases.clear();
|
|
257
|
+
}
|
|
258
|
+
this.restartAttempts.clear();
|
|
259
|
+
console.log('[Watcher] All watchers stopped');
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
FileWatcherService.MAX_RESTART_ATTEMPTS = 3;
|
|
263
|
+
//# sourceMappingURL=file-watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-watcher.js","sourceRoot":"","sources":["../../src/watcher/file-watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incremental Indexer
|
|
3
|
+
*
|
|
4
|
+
* Handles incremental updates to the vector database when files change.
|
|
5
|
+
* Features:
|
|
6
|
+
* - Hash check: Skip re-indexing if file content unchanged
|
|
7
|
+
* - 1MB limit: Skip large files (minified bundles, generated code)
|
|
8
|
+
* - Syntax guard: Keep old vectors if file has syntax errors
|
|
9
|
+
* - Batch processing: Efficient backend API usage
|
|
10
|
+
*/
|
|
11
|
+
import type { BackendClient, IndexChunk } from '../backend-client.js';
|
|
12
|
+
import type { FileChange, ProcessingResult } from './processing-queue.js';
|
|
13
|
+
export interface IncrementalIndexerConfig {
|
|
14
|
+
codebasePath: string;
|
|
15
|
+
collectionName: string;
|
|
16
|
+
backendClient: BackendClient;
|
|
17
|
+
chunkFile: (content: string, language: string, relativePath: string) => Promise<IndexChunk[]>;
|
|
18
|
+
checkSyntax?: (content: string, language: string) => {
|
|
19
|
+
hasErrors: boolean;
|
|
20
|
+
errorCount: number;
|
|
21
|
+
};
|
|
22
|
+
getLanguageFromExtension: (ext: string) => string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Incremental indexer that handles file changes
|
|
26
|
+
*
|
|
27
|
+
* Maintains a hash map of indexed files to skip unchanged content.
|
|
28
|
+
* Integrates syntax guard to protect vectors from broken code.
|
|
29
|
+
*/
|
|
30
|
+
export declare class IncrementalIndexer {
|
|
31
|
+
private config;
|
|
32
|
+
private fileHashes;
|
|
33
|
+
constructor(config: IncrementalIndexerConfig);
|
|
34
|
+
/**
|
|
35
|
+
* Initialize file hashes from existing indexed files
|
|
36
|
+
* Called after initial indexing to populate hash cache
|
|
37
|
+
*/
|
|
38
|
+
setFileHashes(hashes: Map<string, string>): void;
|
|
39
|
+
/**
|
|
40
|
+
* Process a single file change
|
|
41
|
+
*/
|
|
42
|
+
processChange(change: FileChange): Promise<ProcessingResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Handle file deletion
|
|
45
|
+
*/
|
|
46
|
+
private handleDelete;
|
|
47
|
+
/**
|
|
48
|
+
* Handle new file
|
|
49
|
+
*/
|
|
50
|
+
private handleAdd;
|
|
51
|
+
/**
|
|
52
|
+
* Handle modified file
|
|
53
|
+
*/
|
|
54
|
+
private handleModify;
|
|
55
|
+
/**
|
|
56
|
+
* Read file with size and encoding checks
|
|
57
|
+
*/
|
|
58
|
+
private readFileWithChecks;
|
|
59
|
+
/**
|
|
60
|
+
* Hash file content using SHA-256
|
|
61
|
+
*/
|
|
62
|
+
private hashContent;
|
|
63
|
+
/**
|
|
64
|
+
* Get current file hash cache (for persistence)
|
|
65
|
+
*/
|
|
66
|
+
getFileHashes(): Map<string, string>;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=incremental-indexer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental-indexer.d.ts","sourceRoot":"","sources":["../../src/watcher/incremental-indexer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQ1E,MAAM,WAAW,wBAAwB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9F,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAChG,wBAAwB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACrD;AAED;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,UAAU,CAAkC;gBAExC,MAAM,EAAE,wBAAwB;IAI5C;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAOhD;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqBlE;;OAEG;YACW,YAAY;IA6B1B;;OAEG;YACW,SAAS;IAmEvB;;OAEG;YACW,YAAY;IA2E1B;;OAEG;YACW,kBAAkB;IA0BhC;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;CAGvC"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incremental Indexer
|
|
3
|
+
*
|
|
4
|
+
* Handles incremental updates to the vector database when files change.
|
|
5
|
+
* Features:
|
|
6
|
+
* - Hash check: Skip re-indexing if file content unchanged
|
|
7
|
+
* - 1MB limit: Skip large files (minified bundles, generated code)
|
|
8
|
+
* - Syntax guard: Keep old vectors if file has syntax errors
|
|
9
|
+
* - Batch processing: Efficient backend API usage
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from 'fs/promises';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
import * as crypto from 'crypto';
|
|
14
|
+
// Maximum file size to index (1MB)
|
|
15
|
+
const MAX_FILE_SIZE = 1000000;
|
|
16
|
+
// Logging configuration
|
|
17
|
+
const verbose = process.env.DEBUG === 'true' || process.env.LOG_LEVEL === 'verbose';
|
|
18
|
+
/**
|
|
19
|
+
* Incremental indexer that handles file changes
|
|
20
|
+
*
|
|
21
|
+
* Maintains a hash map of indexed files to skip unchanged content.
|
|
22
|
+
* Integrates syntax guard to protect vectors from broken code.
|
|
23
|
+
*/
|
|
24
|
+
export class IncrementalIndexer {
|
|
25
|
+
constructor(config) {
|
|
26
|
+
this.fileHashes = new Map();
|
|
27
|
+
this.config = config;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Initialize file hashes from existing indexed files
|
|
31
|
+
* Called after initial indexing to populate hash cache
|
|
32
|
+
*/
|
|
33
|
+
setFileHashes(hashes) {
|
|
34
|
+
this.fileHashes = new Map(hashes);
|
|
35
|
+
if (verbose) {
|
|
36
|
+
console.log(`[Indexer] Initialized with ${this.fileHashes.size} file hashes`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Process a single file change
|
|
41
|
+
*/
|
|
42
|
+
async processChange(change) {
|
|
43
|
+
const { type, relativePath, absolutePath } = change;
|
|
44
|
+
try {
|
|
45
|
+
switch (type) {
|
|
46
|
+
case 'delete':
|
|
47
|
+
return await this.handleDelete(relativePath);
|
|
48
|
+
case 'add':
|
|
49
|
+
return await this.handleAdd(relativePath, absolutePath);
|
|
50
|
+
case 'modify':
|
|
51
|
+
return await this.handleModify(relativePath, absolutePath);
|
|
52
|
+
default:
|
|
53
|
+
return { success: false, chunksDeleted: 0, chunksIndexed: 0, error: `Unknown change type: ${type}` };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
58
|
+
console.error(`[Indexer] Error processing ${relativePath}:`, message);
|
|
59
|
+
return { success: false, chunksDeleted: 0, chunksIndexed: 0, error: message };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Handle file deletion
|
|
64
|
+
*/
|
|
65
|
+
async handleDelete(relativePath) {
|
|
66
|
+
if (verbose) {
|
|
67
|
+
console.log(`[Indexer] Deleting vectors for: ${relativePath}`);
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const response = await this.config.backendClient.deleteFileVectors(this.config.collectionName, relativePath);
|
|
71
|
+
// Remove from hash cache
|
|
72
|
+
this.fileHashes.delete(relativePath);
|
|
73
|
+
return {
|
|
74
|
+
success: true,
|
|
75
|
+
chunksDeleted: response.deletedCount,
|
|
76
|
+
chunksIndexed: 0,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
// If collection doesn't exist, treat as success
|
|
81
|
+
if (error instanceof Error && error.message.includes('not found')) {
|
|
82
|
+
this.fileHashes.delete(relativePath);
|
|
83
|
+
return { success: true, chunksDeleted: 0, chunksIndexed: 0 };
|
|
84
|
+
}
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Handle new file
|
|
90
|
+
*/
|
|
91
|
+
async handleAdd(relativePath, absolutePath) {
|
|
92
|
+
if (verbose) {
|
|
93
|
+
console.log(`[Indexer] Indexing new file: ${relativePath}`);
|
|
94
|
+
}
|
|
95
|
+
// Read file content
|
|
96
|
+
const content = await this.readFileWithChecks(absolutePath, relativePath);
|
|
97
|
+
if (!content) {
|
|
98
|
+
return { success: true, chunksDeleted: 0, chunksIndexed: 0, skipped: true };
|
|
99
|
+
}
|
|
100
|
+
// Check content hash - skip if already indexed
|
|
101
|
+
const hash = this.hashContent(content);
|
|
102
|
+
const existingHash = this.fileHashes.get(relativePath);
|
|
103
|
+
if (existingHash === hash) {
|
|
104
|
+
if (verbose) {
|
|
105
|
+
console.log(`[Indexer] Hash unchanged, skipping: ${relativePath}`);
|
|
106
|
+
}
|
|
107
|
+
return { success: true, chunksDeleted: 0, chunksIndexed: 0, skipped: true };
|
|
108
|
+
}
|
|
109
|
+
// Check syntax if guard is available
|
|
110
|
+
const ext = path.extname(absolutePath).toLowerCase();
|
|
111
|
+
const language = this.config.getLanguageFromExtension(ext);
|
|
112
|
+
if (this.config.checkSyntax) {
|
|
113
|
+
const syntaxResult = this.config.checkSyntax(content, language);
|
|
114
|
+
if (syntaxResult.hasErrors) {
|
|
115
|
+
console.log(`[Indexer] Syntax errors in ${relativePath} (${syntaxResult.errorCount} errors), skipping`);
|
|
116
|
+
return {
|
|
117
|
+
success: true,
|
|
118
|
+
chunksDeleted: 0,
|
|
119
|
+
chunksIndexed: 0,
|
|
120
|
+
skipped: true,
|
|
121
|
+
error: `Syntax errors: ${syntaxResult.errorCount}`,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Chunk the file
|
|
126
|
+
const chunks = await this.config.chunkFile(content, language, relativePath);
|
|
127
|
+
if (chunks.length === 0) {
|
|
128
|
+
if (verbose) {
|
|
129
|
+
console.log(`[Indexer] No chunks generated for: ${relativePath}`);
|
|
130
|
+
}
|
|
131
|
+
return { success: true, chunksDeleted: 0, chunksIndexed: 0, skipped: true };
|
|
132
|
+
}
|
|
133
|
+
// Index chunks
|
|
134
|
+
const response = await this.config.backendClient.indexChunks({
|
|
135
|
+
collection: this.config.collectionName,
|
|
136
|
+
chunks,
|
|
137
|
+
createIfNotExists: true,
|
|
138
|
+
finalize: false, // Don't rebuild HNSW for every file
|
|
139
|
+
});
|
|
140
|
+
// Update hash cache
|
|
141
|
+
this.fileHashes.set(relativePath, hash);
|
|
142
|
+
return {
|
|
143
|
+
success: true,
|
|
144
|
+
chunksDeleted: 0,
|
|
145
|
+
chunksIndexed: response.indexed,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Handle modified file
|
|
150
|
+
*/
|
|
151
|
+
async handleModify(relativePath, absolutePath) {
|
|
152
|
+
if (verbose) {
|
|
153
|
+
console.log(`[Indexer] Processing modified file: ${relativePath}`);
|
|
154
|
+
}
|
|
155
|
+
// Read file content
|
|
156
|
+
const content = await this.readFileWithChecks(absolutePath, relativePath);
|
|
157
|
+
if (!content) {
|
|
158
|
+
return { success: true, chunksDeleted: 0, chunksIndexed: 0, skipped: true };
|
|
159
|
+
}
|
|
160
|
+
// Check content hash - skip if unchanged
|
|
161
|
+
const hash = this.hashContent(content);
|
|
162
|
+
const existingHash = this.fileHashes.get(relativePath);
|
|
163
|
+
if (existingHash === hash) {
|
|
164
|
+
if (verbose) {
|
|
165
|
+
console.log(`[Indexer] Hash unchanged, skipping: ${relativePath}`);
|
|
166
|
+
}
|
|
167
|
+
return { success: true, chunksDeleted: 0, chunksIndexed: 0, skipped: true };
|
|
168
|
+
}
|
|
169
|
+
// Check syntax if guard is available
|
|
170
|
+
const ext = path.extname(absolutePath).toLowerCase();
|
|
171
|
+
const language = this.config.getLanguageFromExtension(ext);
|
|
172
|
+
if (this.config.checkSyntax) {
|
|
173
|
+
const syntaxResult = this.config.checkSyntax(content, language);
|
|
174
|
+
if (syntaxResult.hasErrors) {
|
|
175
|
+
console.log(`[Indexer] Syntax errors in ${relativePath} (${syntaxResult.errorCount} errors), keeping old vectors`);
|
|
176
|
+
return {
|
|
177
|
+
success: true,
|
|
178
|
+
chunksDeleted: 0,
|
|
179
|
+
chunksIndexed: 0,
|
|
180
|
+
skipped: true,
|
|
181
|
+
error: `Syntax errors: ${syntaxResult.errorCount}`,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Chunk the file
|
|
186
|
+
const chunks = await this.config.chunkFile(content, language, relativePath);
|
|
187
|
+
if (chunks.length === 0) {
|
|
188
|
+
// File produces no chunks - delete old vectors
|
|
189
|
+
const deleteResponse = await this.config.backendClient.deleteFileVectors(this.config.collectionName, relativePath);
|
|
190
|
+
this.fileHashes.delete(relativePath);
|
|
191
|
+
return {
|
|
192
|
+
success: true,
|
|
193
|
+
chunksDeleted: deleteResponse.deletedCount,
|
|
194
|
+
chunksIndexed: 0,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
// Use deleteFirst to atomically delete + insert
|
|
198
|
+
const response = await this.config.backendClient.indexChunks({
|
|
199
|
+
collection: this.config.collectionName,
|
|
200
|
+
chunks,
|
|
201
|
+
createIfNotExists: true,
|
|
202
|
+
finalize: false,
|
|
203
|
+
deleteFirst: [relativePath], // Delete old vectors first
|
|
204
|
+
});
|
|
205
|
+
// Update hash cache
|
|
206
|
+
this.fileHashes.set(relativePath, hash);
|
|
207
|
+
return {
|
|
208
|
+
success: true,
|
|
209
|
+
chunksDeleted: response.deleted || 0,
|
|
210
|
+
chunksIndexed: response.indexed,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Read file with size and encoding checks
|
|
215
|
+
*/
|
|
216
|
+
async readFileWithChecks(absolutePath, relativePath) {
|
|
217
|
+
try {
|
|
218
|
+
// Check file size
|
|
219
|
+
const stats = await fs.stat(absolutePath);
|
|
220
|
+
if (stats.size > MAX_FILE_SIZE) {
|
|
221
|
+
if (verbose) {
|
|
222
|
+
console.log(`[Indexer] Skipping large file (${Math.round(stats.size / 1024)}KB): ${relativePath}`);
|
|
223
|
+
}
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
// Read file
|
|
227
|
+
const content = await fs.readFile(absolutePath, 'utf-8');
|
|
228
|
+
return content;
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
if (error.code === 'ENOENT') {
|
|
232
|
+
// File was deleted between detection and read
|
|
233
|
+
if (verbose) {
|
|
234
|
+
console.log(`[Indexer] File no longer exists: ${relativePath}`);
|
|
235
|
+
}
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Hash file content using SHA-256
|
|
243
|
+
*/
|
|
244
|
+
hashContent(content) {
|
|
245
|
+
return crypto.createHash('sha256').update(content, 'utf8').digest('hex');
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Get current file hash cache (for persistence)
|
|
249
|
+
*/
|
|
250
|
+
getFileHashes() {
|
|
251
|
+
return new Map(this.fileHashes);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=incremental-indexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental-indexer.js","sourceRoot":"","sources":["../../src/watcher/incremental-indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Watcher Module
|
|
3
|
+
*
|
|
4
|
+
* Provides automatic incremental indexing when files change.
|
|
5
|
+
*/
|
|
6
|
+
export { FileWatcherService, type WatcherConfig } from './file-watcher.js';
|
|
7
|
+
export { ProcessingQueue, type FileChange, type ProcessingResult } from './processing-queue.js';
|
|
8
|
+
export { IncrementalIndexer, type IncrementalIndexerConfig } from './incremental-indexer.js';
|
|
9
|
+
export { SyntaxGuard, getSyntaxGuard, type SyntaxCheckResult } from './syntax-guard.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/watcher/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,KAAK,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,KAAK,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Watcher Module
|
|
3
|
+
*
|
|
4
|
+
* Provides automatic incremental indexing when files change.
|
|
5
|
+
*/
|
|
6
|
+
export { FileWatcherService } from './file-watcher.js';
|
|
7
|
+
export { ProcessingQueue } from './processing-queue.js';
|
|
8
|
+
export { IncrementalIndexer } from './incremental-indexer.js';
|
|
9
|
+
export { SyntaxGuard, getSyntaxGuard } from './syntax-guard.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/watcher/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAsB,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAA0C,MAAM,uBAAuB,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAiC,MAAM,0BAA0B,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,cAAc,EAA0B,MAAM,mBAAmB,CAAC"}
|