mcp-code-context 3.5.3 → 3.6.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 (79) hide show
  1. package/CHANGELOG.md +57 -3
  2. package/INSTRUCTIONS.md +274 -0
  3. package/README.md +59 -6
  4. package/SECURITY.md +14 -14
  5. package/dist/src/core/cacheManager.d.ts +44 -0
  6. package/dist/src/core/cacheManager.js +255 -0
  7. package/dist/src/core/cacheManager.js.map +1 -0
  8. package/dist/src/core/engine.d.ts +1 -1
  9. package/dist/src/core/engine.js +1 -1
  10. package/dist/src/core/validator.d.ts +1 -1
  11. package/dist/src/core/validator.js +19 -7
  12. package/dist/src/core/validator.js.map +1 -1
  13. package/dist/src/index.d.ts +6 -1
  14. package/dist/src/index.js +197 -20
  15. package/dist/src/index.js.map +1 -1
  16. package/dist/src/operations/compress.d.ts +3 -1
  17. package/dist/src/operations/compress.js +47 -48
  18. package/dist/src/operations/compress.js.map +1 -1
  19. package/dist/src/operations/confirmationStore.d.ts +1 -1
  20. package/dist/src/operations/confirmationStore.js +1 -1
  21. package/dist/src/operations/read.d.ts +5 -1
  22. package/dist/src/operations/read.js +125 -64
  23. package/dist/src/operations/read.js.map +1 -1
  24. package/dist/src/operations/write.d.ts +2 -2
  25. package/dist/src/operations/write.js +83 -59
  26. package/dist/src/operations/write.js.map +1 -1
  27. package/dist/src/parsers/base.d.ts +1 -1
  28. package/dist/src/parsers/base.js +1 -1
  29. package/dist/src/parsers/dartTreeSitter.d.ts +1 -1
  30. package/dist/src/parsers/dartTreeSitter.js +1 -1
  31. package/dist/src/parsers/php.d.ts +1 -1
  32. package/dist/src/parsers/php.js +1 -1
  33. package/dist/src/parsers/python.d.ts +1 -1
  34. package/dist/src/parsers/python.js +1 -1
  35. package/dist/src/parsers/registry.d.ts +1 -1
  36. package/dist/src/parsers/registry.js +1 -1
  37. package/dist/src/parsers/typescript.d.ts +1 -1
  38. package/dist/src/parsers/typescript.js +1 -1
  39. package/dist/src/utils/auditLogger.d.ts +1 -1
  40. package/dist/src/utils/auditLogger.js +3 -2
  41. package/dist/src/utils/auditLogger.js.map +1 -1
  42. package/dist/src/utils/backupManager.d.ts +30 -9
  43. package/dist/src/utils/backupManager.js +75 -33
  44. package/dist/src/utils/backupManager.js.map +1 -1
  45. package/dist/src/utils/constants.d.ts +13 -2
  46. package/dist/src/utils/constants.js +21 -2
  47. package/dist/src/utils/constants.js.map +1 -1
  48. package/dist/src/utils/diff.d.ts +37 -7
  49. package/dist/src/utils/diff.js +91 -101
  50. package/dist/src/utils/diff.js.map +1 -1
  51. package/dist/src/utils/fileLock.d.ts +25 -50
  52. package/dist/src/utils/fileLock.js +66 -100
  53. package/dist/src/utils/fileLock.js.map +1 -1
  54. package/dist/src/utils/fileWalker.d.ts +28 -0
  55. package/dist/src/utils/fileWalker.js +57 -0
  56. package/dist/src/utils/fileWalker.js.map +1 -0
  57. package/dist/src/utils/fileWatcher.d.ts +23 -0
  58. package/dist/src/utils/fileWatcher.js +80 -0
  59. package/dist/src/utils/fileWatcher.js.map +1 -0
  60. package/dist/src/utils/fuzzySearch.d.ts +22 -0
  61. package/dist/src/utils/fuzzySearch.js +36 -0
  62. package/dist/src/utils/fuzzySearch.js.map +1 -0
  63. package/dist/src/utils/logger.d.ts +19 -0
  64. package/dist/src/utils/logger.js +50 -0
  65. package/dist/src/utils/logger.js.map +1 -0
  66. package/dist/src/utils/rateLimiter.d.ts +1 -1
  67. package/dist/src/utils/rateLimiter.js +1 -1
  68. package/dist/src/utils/safeRegex.d.ts +1 -1
  69. package/dist/src/utils/safeRegex.js +1 -1
  70. package/dist/src/utils/searchTools.d.ts +14 -0
  71. package/dist/src/utils/searchTools.js +94 -0
  72. package/dist/src/utils/searchTools.js.map +1 -0
  73. package/dist/src/utils/streaming.d.ts +1 -1
  74. package/dist/src/utils/streaming.js +1 -1
  75. package/dist/src/utils/telemetry.d.ts +1 -1
  76. package/dist/src/utils/telemetry.js +1 -1
  77. package/llms.txt +5 -5
  78. package/package.json +28 -10
  79. package/vitest.config.ts +37 -0
@@ -0,0 +1,255 @@
1
+ /**
2
+ * Cache Manager - v3.6.0
3
+ * WASM SQLite cache with debounced persistence
4
+ */
5
+ import initSqlJs from 'sql.js';
6
+ import * as fs from 'node:fs/promises';
7
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
8
+ import * as path from 'path';
9
+ import * as crypto from 'node:crypto';
10
+ import { tmpdir } from 'os';
11
+ import { logger } from '../utils/logger.js';
12
+ import { FileWatcher } from '../utils/fileWatcher.js';
13
+ export class CacheManager {
14
+ db = null;
15
+ dbPath;
16
+ cacheDir;
17
+ isDirty = false;
18
+ persistTimer = null;
19
+ initPromise;
20
+ watcher = null;
21
+ projectRoot;
22
+ constructor(projectRoot) {
23
+ this.projectRoot = projectRoot;
24
+ const projectHash = crypto.createHash('md5')
25
+ .update(projectRoot)
26
+ .digest('hex')
27
+ .substring(0, 8);
28
+ this.cacheDir = path.join(tmpdir(), 'mcp-cache', projectHash);
29
+ this.dbPath = path.join(this.cacheDir, 'cache.db');
30
+ // Initialize on construction
31
+ this.initPromise = this.init();
32
+ // Persist on process exit
33
+ process.on('SIGINT', () => this.persistSync());
34
+ process.on('SIGTERM', () => this.persistSync());
35
+ process.on('exit', () => this.persistSync());
36
+ }
37
+ async init() {
38
+ try {
39
+ // Ensure cache directory exists (OS cleanup recovery)
40
+ if (!existsSync(this.cacheDir)) {
41
+ logger.warn({ cacheDir: this.cacheDir }, 'Cache directory deleted by OS, recreating');
42
+ mkdirSync(this.cacheDir, { recursive: true });
43
+ }
44
+ const SQL = await initSqlJs();
45
+ // Load existing database or create new
46
+ if (existsSync(this.dbPath)) {
47
+ const buffer = readFileSync(this.dbPath);
48
+ this.db = new SQL.Database(buffer);
49
+ logger.debug({ dbPath: this.dbPath }, 'Loaded existing cache database');
50
+ }
51
+ else {
52
+ this.db = new SQL.Database();
53
+ this.initSchema();
54
+ logger.info({ dbPath: this.dbPath }, 'Created new cache database');
55
+ }
56
+ }
57
+ catch (error) {
58
+ logger.error({ error }, 'Failed to initialize cache');
59
+ throw error;
60
+ }
61
+ }
62
+ initSchema() {
63
+ if (!this.db)
64
+ return;
65
+ this.db.run(`
66
+ CREATE TABLE IF NOT EXISTS file_cache (
67
+ file_path TEXT PRIMARY KEY,
68
+ hash TEXT NOT NULL,
69
+ symbols TEXT NOT NULL,
70
+ last_modified INTEGER NOT NULL,
71
+ cached_at INTEGER NOT NULL
72
+ )
73
+ `);
74
+ this.db.run(`
75
+ CREATE INDEX IF NOT EXISTS idx_cached_at ON file_cache(cached_at)
76
+ `);
77
+ }
78
+ async get(filePath, currentHash) {
79
+ await this.initPromise;
80
+ if (!this.db)
81
+ return null;
82
+ try {
83
+ const stmt = this.db.prepare('SELECT * FROM file_cache WHERE file_path = ? AND hash = ?');
84
+ stmt.bind([filePath, currentHash]);
85
+ if (stmt.step()) {
86
+ const row = stmt.getAsObject();
87
+ stmt.free();
88
+ return {
89
+ filePath: row.file_path,
90
+ hash: row.hash,
91
+ symbols: JSON.parse(row.symbols),
92
+ lastModified: row.last_modified,
93
+ cachedAt: row.cached_at,
94
+ };
95
+ }
96
+ stmt.free();
97
+ return null;
98
+ }
99
+ catch (error) {
100
+ logger.error({ error, filePath }, 'Cache get failed');
101
+ return null;
102
+ }
103
+ }
104
+ async set(file) {
105
+ await this.initPromise;
106
+ if (!this.db)
107
+ return;
108
+ try {
109
+ this.db.run(`INSERT OR REPLACE INTO file_cache
110
+ (file_path, hash, symbols, last_modified, cached_at)
111
+ VALUES (?, ?, ?, ?, ?)`, [
112
+ file.filePath,
113
+ file.hash,
114
+ JSON.stringify(file.symbols),
115
+ file.lastModified,
116
+ file.cachedAt,
117
+ ]);
118
+ this.isDirty = true;
119
+ this.schedulePersist();
120
+ }
121
+ catch (error) {
122
+ logger.error({ error, filePath: file.filePath }, 'Cache set failed');
123
+ }
124
+ }
125
+ async invalidate(filePath) {
126
+ await this.initPromise;
127
+ if (!this.db)
128
+ return;
129
+ try {
130
+ this.db.run('DELETE FROM file_cache WHERE file_path = ?', [filePath]);
131
+ this.isDirty = true;
132
+ this.schedulePersist();
133
+ }
134
+ catch (error) {
135
+ logger.error({ error, filePath }, 'Cache invalidate failed');
136
+ }
137
+ }
138
+ async clear() {
139
+ await this.initPromise;
140
+ if (!this.db)
141
+ return;
142
+ try {
143
+ this.db.run('DELETE FROM file_cache');
144
+ this.isDirty = true;
145
+ await this.persist();
146
+ logger.info('Cache cleared');
147
+ }
148
+ catch (error) {
149
+ logger.error({ error }, 'Cache clear failed');
150
+ }
151
+ }
152
+ async getStats() {
153
+ await this.initPromise;
154
+ if (!this.db) {
155
+ return { totalEntries: 0, totalSize: 0, oldestEntry: null, newestEntry: null };
156
+ }
157
+ try {
158
+ const stmt = this.db.prepare(`
159
+ SELECT
160
+ COUNT(*) as count,
161
+ MIN(cached_at) as oldest,
162
+ MAX(cached_at) as newest
163
+ FROM file_cache
164
+ `);
165
+ stmt.step();
166
+ const row = stmt.getAsObject();
167
+ stmt.free();
168
+ const totalSize = existsSync(this.dbPath)
169
+ ? (await fs.stat(this.dbPath)).size
170
+ : 0;
171
+ return {
172
+ totalEntries: row.count,
173
+ totalSize,
174
+ oldestEntry: row.oldest,
175
+ newestEntry: row.newest,
176
+ };
177
+ }
178
+ catch (error) {
179
+ logger.error({ error }, 'Failed to get cache stats');
180
+ return { totalEntries: 0, totalSize: 0, oldestEntry: null, newestEntry: null };
181
+ }
182
+ }
183
+ schedulePersist() {
184
+ if (this.persistTimer)
185
+ clearTimeout(this.persistTimer);
186
+ this.persistTimer = setTimeout(() => this.persist(), 5000);
187
+ }
188
+ async persist() {
189
+ if (!this.isDirty || !this.db)
190
+ return;
191
+ try {
192
+ const data = this.db.export();
193
+ const buffer = Buffer.from(data);
194
+ await fs.writeFile(this.dbPath, buffer);
195
+ this.isDirty = false;
196
+ logger.debug({ dbPath: this.dbPath, size: buffer.length }, 'Cache persisted');
197
+ }
198
+ catch (error) {
199
+ logger.error({ error }, 'Failed to persist cache');
200
+ }
201
+ }
202
+ persistSync() {
203
+ if (!this.isDirty || !this.db)
204
+ return;
205
+ try {
206
+ const data = this.db.export();
207
+ const buffer = Buffer.from(data);
208
+ writeFileSync(this.dbPath, buffer);
209
+ this.isDirty = false;
210
+ }
211
+ catch (error) {
212
+ console.error('Failed to persist cache on exit:', error);
213
+ }
214
+ }
215
+ async close() {
216
+ if (this.watcher) {
217
+ this.watcher.stop();
218
+ this.watcher = null;
219
+ }
220
+ if (this.persistTimer) {
221
+ clearTimeout(this.persistTimer);
222
+ this.persistTimer = null;
223
+ }
224
+ await this.persist();
225
+ if (this.db) {
226
+ this.db.close();
227
+ this.db = null;
228
+ }
229
+ }
230
+ startWatcher(debounceMs = 500) {
231
+ if (this.watcher) {
232
+ logger.warn({ projectRoot: this.projectRoot }, 'Watcher already started');
233
+ return;
234
+ }
235
+ this.watcher = new FileWatcher({
236
+ debounceMs,
237
+ ignored: [],
238
+ onFileChange: async (filePath) => {
239
+ await this.invalidate(filePath);
240
+ logger.debug({ filePath }, 'Cache invalidated by file watcher');
241
+ },
242
+ });
243
+ this.watcher.start(this.projectRoot);
244
+ }
245
+ stopWatcher() {
246
+ if (this.watcher) {
247
+ this.watcher.stop();
248
+ this.watcher = null;
249
+ }
250
+ }
251
+ getWatcherStatus() {
252
+ return this.watcher ? this.watcher.getStatus() : { isWatching: false, watchedFiles: 0 };
253
+ }
254
+ }
255
+ //# sourceMappingURL=cacheManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cacheManager.js","sourceRoot":"","sources":["../../../src/core/cacheManager.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Core Engine - v3.5.3
2
+ * Core Engine - v3.6.0
3
3
  * ASYNC I/O: Migrated to fs.promises
4
4
  */
5
5
  import { Parser, Language } from "web-tree-sitter";
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Core Engine - v3.5.3
2
+ * Core Engine - v3.6.0
3
3
  * ASYNC I/O: Migrated to fs.promises
4
4
  */
5
5
  import { Parser, Language } from "web-tree-sitter";
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Security Validator - v3.5.3
2
+ * Security Validator - v3.6.0
3
3
  * CRITICAL FIX: Path traversal check AFTER normalization
4
4
  */
5
5
  export interface ValidationResult {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Security Validator - v3.5.3
2
+ * Security Validator - v3.6.0
3
3
  * CRITICAL FIX: Path traversal check AFTER normalization
4
4
  */
5
5
  import * as path from "node:path";
@@ -14,16 +14,20 @@ export class SecurityValidator {
14
14
  const resolved = path.resolve(filePath);
15
15
  // CRITICAL: Check boundary AFTER normalization (with path separator)
16
16
  if (resolved !== this.projectRoot && !resolved.startsWith(this.projectRoot + path.sep)) {
17
- return { valid: false, error: "Path outside project boundary" };
17
+ return {
18
+ valid: false,
19
+ error: `Security: Path "${filePath}" is outside project boundary "${this.projectRoot}"`
20
+ };
18
21
  }
19
- // NOTE: Path traversal already caught by startsWith check above.
20
- // Removed dead code that duplicated the boundary check (unreachable condition).
21
22
  // Existence check
22
23
  try {
23
24
  await fs.access(resolved);
24
25
  }
25
26
  catch {
26
- return { valid: false, error: "File does not exist" };
27
+ return {
28
+ valid: false,
29
+ error: `File not found: "${filePath}" (resolved to "${resolved}")`
30
+ };
27
31
  }
28
32
  return { valid: true, resolvedPath: resolved };
29
33
  }
@@ -31,12 +35,20 @@ export class SecurityValidator {
31
35
  try {
32
36
  const stat = await fs.stat(filePath);
33
37
  if (stat.size > maxSize) {
34
- return { valid: false, error: `File too large: ${(stat.size / 1024 / 1024).toFixed(2)}MB` };
38
+ const sizeMB = (stat.size / 1024 / 1024).toFixed(2);
39
+ const maxMB = (maxSize / 1024 / 1024).toFixed(2);
40
+ return {
41
+ valid: false,
42
+ error: `File too large: ${sizeMB}MB exceeds maximum ${maxMB}MB`
43
+ };
35
44
  }
36
45
  return { valid: true };
37
46
  }
38
47
  catch (error) {
39
- return { valid: false, error: `Failed to check file size: ${error}` };
48
+ return {
49
+ valid: false,
50
+ error: `Failed to check file size for "${filePath}": ${error instanceof Error ? error.message : String(error)}`
51
+ };
40
52
  }
41
53
  }
42
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/core/validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAQvC,MAAM,OAAO,iBAAiB;IACpB,WAAW,CAAS;IAE5B,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QACrC,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAExC,qEAAqE;QACrE,IAAI,QAAQ,KAAK,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACvF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC;QAClE,CAAC;QAED,iEAAiE;QACjE,gFAAgF;QAEhF,kBAAkB;QAClB,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;QACxD,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,QAAgB,EAAE,UAAkB,EAAE,GAAG,IAAI,GAAG,IAAI;QACzE,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC;gBACxB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9F,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,8BAA8B,KAAK,EAAE,EAAE,CAAC;QACxE,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/core/validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAQvC,MAAM,OAAO,iBAAiB;IACpB,WAAW,CAAS;IAE5B,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QACrC,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAExC,qEAAqE;QACrE,IAAI,QAAQ,KAAK,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACvF,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,mBAAmB,QAAQ,kCAAkC,IAAI,CAAC,WAAW,GAAG;aACxF,CAAC;QACJ,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,oBAAoB,QAAQ,mBAAmB,QAAQ,IAAI;aACnE,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,QAAgB,EAAE,UAAkB,EAAE,GAAG,IAAI,GAAG,IAAI;QACzE,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC;gBACxB,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACpD,MAAM,KAAK,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACjD,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,mBAAmB,MAAM,sBAAsB,KAAK,IAAI;iBAChE,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,kCAAkC,QAAQ,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;aAChH,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * mcp-code-context v3.5.3 - Tree-sitter WASM Edition
3
+ * mcp-code-context v3.6.0 - Tree-sitter WASM Edition
4
4
  *
5
5
  * Production-ready with:
6
6
  * - Tree-sitter WASM for 100% AST accuracy (TypeScript, Python, PHP, Dart)
@@ -8,5 +8,10 @@
8
8
  * - Two-phase write workflow (dry-run + confirmation token)
9
9
  * - Middleware pipeline: rate limiting, file locking, audit logging, telemetry
10
10
  * - Mandatory security boundaries on ALL handlers
11
+ * - Persistent WASM SQLite cache with <100ms hits
12
+ * - Structured logging with pino (JSON to stderr, MCP-safe)
13
+ * - File watcher with chokidar for auto cache invalidation
14
+ * - Fuzzy search with fuse.js + pagination
15
+ * - Token optimization: compact diffs, auto-optimize output
11
16
  */
12
17
  export {};