@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.
Files changed (50) hide show
  1. package/README.md +134 -0
  2. package/dist/backend-client.d.ts +251 -0
  3. package/dist/backend-client.d.ts.map +1 -0
  4. package/dist/backend-client.js +269 -0
  5. package/dist/backend-client.js.map +1 -0
  6. package/dist/backend-handlers.d.ts +243 -0
  7. package/dist/backend-handlers.d.ts.map +1 -0
  8. package/dist/backend-handlers.js +1453 -0
  9. package/dist/backend-handlers.js.map +1 -0
  10. package/dist/config.d.ts +47 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +94 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/index.d.ts +3 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +344 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/project-detector.d.ts +42 -0
  19. package/dist/project-detector.d.ts.map +1 -0
  20. package/dist/project-detector.js +135 -0
  21. package/dist/project-detector.js.map +1 -0
  22. package/dist/utils/env-manager.d.ts +19 -0
  23. package/dist/utils/env-manager.d.ts.map +1 -0
  24. package/dist/utils/env-manager.js +99 -0
  25. package/dist/utils/env-manager.js.map +1 -0
  26. package/dist/utils.d.ts +10 -0
  27. package/dist/utils.d.ts.map +1 -0
  28. package/dist/utils.js +27 -0
  29. package/dist/utils.js.map +1 -0
  30. package/dist/watcher/file-watcher.d.ts +64 -0
  31. package/dist/watcher/file-watcher.d.ts.map +1 -0
  32. package/dist/watcher/file-watcher.js +263 -0
  33. package/dist/watcher/file-watcher.js.map +1 -0
  34. package/dist/watcher/incremental-indexer.d.ts +68 -0
  35. package/dist/watcher/incremental-indexer.d.ts.map +1 -0
  36. package/dist/watcher/incremental-indexer.js +254 -0
  37. package/dist/watcher/incremental-indexer.js.map +1 -0
  38. package/dist/watcher/index.d.ts +10 -0
  39. package/dist/watcher/index.d.ts.map +1 -0
  40. package/dist/watcher/index.js +10 -0
  41. package/dist/watcher/index.js.map +1 -0
  42. package/dist/watcher/processing-queue.d.ts +79 -0
  43. package/dist/watcher/processing-queue.d.ts.map +1 -0
  44. package/dist/watcher/processing-queue.js +150 -0
  45. package/dist/watcher/processing-queue.js.map +1 -0
  46. package/dist/watcher/syntax-guard.d.ts +59 -0
  47. package/dist/watcher/syntax-guard.d.ts.map +1 -0
  48. package/dist/watcher/syntax-guard.js +136 -0
  49. package/dist/watcher/syntax-guard.js.map +1 -0
  50. 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"}