mcp-code-context 3.4.1 → 3.5.1

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 (56) hide show
  1. package/CHANGELOG.md +3 -3
  2. package/CHANGELOG_v3.3.0.md +1 -1
  3. package/SECURITY.md +14 -14
  4. package/dist/src/core/engine.d.ts +1 -1
  5. package/dist/src/core/engine.js +1 -1
  6. package/dist/src/core/validator.d.ts +1 -1
  7. package/dist/src/core/validator.js +3 -5
  8. package/dist/src/core/validator.js.map +1 -1
  9. package/dist/src/index.d.ts +1 -1
  10. package/dist/src/index.js +43 -11
  11. package/dist/src/index.js.map +1 -1
  12. package/dist/src/operations/compress.d.ts +1 -1
  13. package/dist/src/operations/compress.js +1 -1
  14. package/dist/src/operations/confirmationStore.d.ts +10 -1
  15. package/dist/src/operations/confirmationStore.js +2 -1
  16. package/dist/src/operations/confirmationStore.js.map +1 -1
  17. package/dist/src/operations/read.d.ts +2 -2
  18. package/dist/src/operations/read.js +38 -42
  19. package/dist/src/operations/read.js.map +1 -1
  20. package/dist/src/operations/write.d.ts +9 -2
  21. package/dist/src/operations/write.js +32 -17
  22. package/dist/src/operations/write.js.map +1 -1
  23. package/dist/src/parsers/base.d.ts +1 -1
  24. package/dist/src/parsers/base.js +1 -1
  25. package/dist/src/parsers/dartTreeSitter.d.ts +1 -1
  26. package/dist/src/parsers/dartTreeSitter.js +1 -1
  27. package/dist/src/parsers/php.d.ts +1 -1
  28. package/dist/src/parsers/php.js +1 -1
  29. package/dist/src/parsers/python.d.ts +1 -1
  30. package/dist/src/parsers/python.js +1 -1
  31. package/dist/src/parsers/registry.d.ts +1 -1
  32. package/dist/src/parsers/registry.js +1 -1
  33. package/dist/src/parsers/typescript.d.ts +1 -1
  34. package/dist/src/parsers/typescript.js +6 -3
  35. package/dist/src/parsers/typescript.js.map +1 -1
  36. package/dist/src/utils/auditLogger.d.ts +1 -1
  37. package/dist/src/utils/auditLogger.js +1 -1
  38. package/dist/src/utils/backupManager.d.ts +1 -1
  39. package/dist/src/utils/backupManager.js +1 -1
  40. package/dist/src/utils/constants.d.ts +1 -1
  41. package/dist/src/utils/constants.js +1 -1
  42. package/dist/src/utils/diff.d.ts +1 -1
  43. package/dist/src/utils/diff.js +1 -1
  44. package/dist/src/utils/fileLock.d.ts +1 -1
  45. package/dist/src/utils/fileLock.js +1 -1
  46. package/dist/src/utils/rateLimiter.d.ts +1 -1
  47. package/dist/src/utils/rateLimiter.js +1 -1
  48. package/dist/src/utils/safeRegex.d.ts +55 -4
  49. package/dist/src/utils/safeRegex.js +186 -61
  50. package/dist/src/utils/safeRegex.js.map +1 -1
  51. package/dist/src/utils/streaming.d.ts +1 -1
  52. package/dist/src/utils/streaming.js +1 -1
  53. package/dist/src/utils/telemetry.d.ts +1 -1
  54. package/dist/src/utils/telemetry.js +1 -1
  55. package/llms.txt +5 -5
  56. package/package.json +1 -1
@@ -1,76 +1,201 @@
1
1
  /**
2
- * Safe Regex - v3.4.1
3
- * Regex execution with timeout to prevent ReDoS
2
+ * Safe Regex - v3.5.1
3
+ * CRITICAL FIX: Real ReDoS protection via worker_threads
4
+ *
5
+ * Problem: setTimeout cannot interrupt regex.test() in Node.js single-threaded event loop.
6
+ * Solution: Execute regex in a Worker thread. If it exceeds timeout, worker.terminate() kills it.
7
+ *
8
+ * This file serves dual purpose:
9
+ * - Main thread: exports safe regex functions that delegate to workers
10
+ * - Worker thread: executes regex operations when loaded as a worker
4
11
  */
12
+ import { Worker, isMainThread, parentPort, workerData } from "node:worker_threads";
13
+ import { fileURLToPath } from "node:url";
5
14
  import { REGEX_TIMEOUT_MS } from './constants.js';
6
- /**
7
- * Execute regex with timeout protection
8
- */
9
- export async function safeRegexTest(pattern, input, timeoutMs = REGEX_TIMEOUT_MS) {
10
- return new Promise((resolve) => {
11
- const regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern;
12
- let timedOut = false;
13
- const timeout = setTimeout(() => {
14
- timedOut = true;
15
- resolve({
16
- success: false,
17
- matched: false,
18
- error: `Regex execution exceeded ${timeoutMs}ms (potential ReDoS)`,
19
- timedOut: true,
20
- });
21
- }, timeoutMs);
22
- try {
23
- const matched = regex.test(input);
24
- clearTimeout(timeout);
25
- if (timedOut)
26
- return; // Already resolved
27
- resolve({ success: true, matched });
15
+ // ─────────────────────────────────────────────────────────────────────────
16
+ // WORKER THREAD EXECUTION
17
+ // Runs when this file is loaded as a Worker via new Worker(thisFile, { workerData })
18
+ // ─────────────────────────────────────────────────────────────────────────
19
+ if (!isMainThread && workerData) {
20
+ const { pattern, flags, input, mode, lines } = workerData;
21
+ const regex = new RegExp(pattern, flags);
22
+ switch (mode) {
23
+ case "test":
24
+ parentPort?.postMessage({ matched: regex.test(input) });
25
+ break;
26
+ case "match":
27
+ parentPort?.postMessage({ matches: input.match(regex) });
28
+ break;
29
+ case "batch_test": {
30
+ // One worker per file: test each line, return matching indices
31
+ const matches = [];
32
+ for (let i = 0; i < lines.length; i++) {
33
+ regex.lastIndex = 0;
34
+ if (regex.test(lines[i])) {
35
+ matches.push({ index: i, content: lines[i].trim() });
36
+ }
37
+ }
38
+ parentPort?.postMessage({ matches });
39
+ break;
28
40
  }
29
- catch (error) {
30
- clearTimeout(timeout);
31
- if (timedOut)
32
- return;
33
- resolve({
34
- success: false,
35
- matched: false,
36
- error: error instanceof Error ? error.message : String(error),
37
- });
41
+ case "batch_find_first": {
42
+ // Find first matching line index
43
+ let matchIndex = -1;
44
+ for (let i = 0; i < lines.length; i++) {
45
+ regex.lastIndex = 0;
46
+ if (regex.test(lines[i])) {
47
+ matchIndex = i;
48
+ break;
49
+ }
50
+ }
51
+ parentPort?.postMessage({ matchIndex });
52
+ break;
38
53
  }
39
- });
54
+ case "batch_multi_file": {
55
+ // All files in one worker — eliminates N worker spawns in searchPattern
56
+ // files: Array<{ path: string, lines: string[] }>
57
+ const { files } = workerData;
58
+ const fileResults = [];
59
+ for (const file of files) {
60
+ for (let i = 0; i < file.lines.length; i++) {
61
+ regex.lastIndex = 0;
62
+ if (regex.test(file.lines[i])) {
63
+ fileResults.push({ file: file.path, index: i, content: file.lines[i].trim() });
64
+ }
65
+ }
66
+ }
67
+ parentPort?.postMessage({ results: fileResults });
68
+ break;
69
+ }
70
+ }
40
71
  }
41
- /**
42
- * Execute regex match with timeout protection
43
- */
44
- export async function safeRegexMatch(pattern, input, timeoutMs = REGEX_TIMEOUT_MS) {
72
+ // ─────────────────────────────────────────────────────────────────────────
73
+ // MAIN THREAD: Worker execution helper
74
+ // ─────────────────────────────────────────────────────────────────────────
75
+ const WORKER_FILE = fileURLToPath(import.meta.url);
76
+ function runInWorker(data, timeoutMs) {
77
+ if (!isMainThread) {
78
+ throw new Error("safeRegex: runInWorker called from worker thread — this is a bug");
79
+ }
45
80
  return new Promise((resolve) => {
46
- const regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern;
47
- let timedOut = false;
48
- const timeout = setTimeout(() => {
49
- timedOut = true;
50
- resolve({
51
- success: false,
52
- error: `Regex execution exceeded ${timeoutMs}ms (potential ReDoS)`,
53
- timedOut: true,
54
- });
81
+ const worker = new Worker(WORKER_FILE, { workerData: data });
82
+ let settled = false;
83
+ const timer = setTimeout(() => {
84
+ if (settled)
85
+ return;
86
+ settled = true;
87
+ worker.terminate();
88
+ resolve({ timedOut: true });
55
89
  }, timeoutMs);
56
- try {
57
- const matches = input.match(regex);
58
- clearTimeout(timeout);
59
- if (timedOut)
90
+ worker.on("message", (msg) => {
91
+ if (settled)
60
92
  return;
61
- resolve({ success: true, matches });
62
- }
63
- catch (error) {
64
- clearTimeout(timeout);
65
- if (timedOut)
93
+ settled = true;
94
+ clearTimeout(timer);
95
+ worker.terminate();
96
+ resolve({ result: msg });
97
+ });
98
+ worker.on("error", (err) => {
99
+ if (settled)
66
100
  return;
67
- resolve({
68
- success: false,
69
- error: error instanceof Error ? error.message : String(error),
70
- });
71
- }
101
+ settled = true;
102
+ clearTimeout(timer);
103
+ resolve({ error: err.message });
104
+ });
72
105
  });
73
106
  }
107
+ function extractPatternInfo(pattern) {
108
+ return {
109
+ source: pattern instanceof RegExp ? pattern.source : pattern,
110
+ flags: pattern instanceof RegExp ? pattern.flags : "",
111
+ };
112
+ }
113
+ // ─────────────────────────────────────────────────────────────────────────
114
+ // PUBLIC API — Single operations
115
+ // ─────────────────────────────────────────────────────────────────────────
116
+ /**
117
+ * Execute regex test with real timeout via worker_threads.
118
+ * worker.terminate() can actually kill a stuck regex, unlike setTimeout.
119
+ */
120
+ export async function safeRegexTest(pattern, input, timeoutMs = REGEX_TIMEOUT_MS) {
121
+ if (!isMainThread)
122
+ return { success: false, matched: false };
123
+ const { source, flags } = extractPatternInfo(pattern);
124
+ const { result, timedOut, error } = await runInWorker({ pattern: source, flags, input, mode: "test" }, timeoutMs);
125
+ if (timedOut)
126
+ return { success: false, matched: false, timedOut: true, error: `Regex exceeded ${timeoutMs}ms (ReDoS prevented)` };
127
+ if (error)
128
+ return { success: false, matched: false, error };
129
+ return { success: true, matched: result.matched };
130
+ }
131
+ /**
132
+ * Execute regex match with real timeout via worker_threads.
133
+ */
134
+ export async function safeRegexMatch(pattern, input, timeoutMs = REGEX_TIMEOUT_MS) {
135
+ if (!isMainThread)
136
+ return { success: false };
137
+ const { source, flags } = extractPatternInfo(pattern);
138
+ const { result, timedOut, error } = await runInWorker({ pattern: source, flags, input, mode: "match" }, timeoutMs);
139
+ if (timedOut)
140
+ return { success: false, timedOut: true, error: `Regex exceeded ${timeoutMs}ms (ReDoS prevented)` };
141
+ if (error)
142
+ return { success: false, error };
143
+ return { success: true, matches: result.matches };
144
+ }
145
+ // ─────────────────────────────────────────────────────────────────────────
146
+ // PUBLIC API — Batch operations (one worker per file, loop inside worker)
147
+ // ─────────────────────────────────────────────────────────────────────────
148
+ /**
149
+ * Batch regex test: sends all lines to one worker, loops inside.
150
+ * Returns matching line indices and trimmed content.
151
+ * Use this for searchPattern — one worker per file, not per line.
152
+ */
153
+ export async function safeRegexBatchTest(pattern, lines, timeoutMs = REGEX_TIMEOUT_MS) {
154
+ if (!isMainThread)
155
+ return { success: false };
156
+ const { source, flags } = extractPatternInfo(pattern);
157
+ const { result, timedOut, error } = await runInWorker({ pattern: source, flags, lines, mode: "batch_test" }, timeoutMs);
158
+ if (timedOut)
159
+ return { success: false, timedOut: true, error: `Regex batch exceeded ${timeoutMs}ms (ReDoS prevented)` };
160
+ if (error)
161
+ return { success: false, error };
162
+ return { success: true, matches: result.matches };
163
+ }
164
+ /**
165
+ * Batch find first matching line: one worker, returns index of first match.
166
+ * Use this for readLines aroundPattern — avoids N worker spawns.
167
+ */
168
+ export async function safeRegexFindFirst(pattern, lines, timeoutMs = REGEX_TIMEOUT_MS) {
169
+ if (!isMainThread)
170
+ return { success: false };
171
+ const { source, flags } = extractPatternInfo(pattern);
172
+ const { result, timedOut, error } = await runInWorker({ pattern: source, flags, lines, mode: "batch_find_first" }, timeoutMs);
173
+ if (timedOut)
174
+ return { success: false, timedOut: true, error: `Regex search exceeded ${timeoutMs}ms (ReDoS prevented)` };
175
+ if (error)
176
+ return { success: false, error };
177
+ return { success: true, matchIndex: result.matchIndex };
178
+ }
179
+ /**
180
+ * Multi-file batch regex test: ALL files processed in ONE worker spawn.
181
+ * Eliminates N worker spawns for N files in searchPattern.
182
+ * The worker loops all files×lines internally. If any line causes ReDoS,
183
+ * the worker is terminated and the entire search times out safely.
184
+ */
185
+ export async function safeRegexMultiFileBatchTest(pattern, files, timeoutMs = REGEX_TIMEOUT_MS) {
186
+ if (!isMainThread)
187
+ return { success: false };
188
+ const { source, flags } = extractPatternInfo(pattern);
189
+ const { result, timedOut, error } = await runInWorker({ pattern: source, flags, files, mode: "batch_multi_file" }, timeoutMs);
190
+ if (timedOut)
191
+ return { success: false, timedOut: true, error: `Multi-file regex scan exceeded ${timeoutMs}ms (ReDoS prevented)` };
192
+ if (error)
193
+ return { success: false, error };
194
+ return { success: true, results: result.results };
195
+ }
196
+ // ─────────────────────────────────────────────────────────────────────────
197
+ // Pattern validation and sanitization (synchronous — no worker needed)
198
+ // ─────────────────────────────────────────────────────────────────────────
74
199
  /**
75
200
  * Validate regex pattern for safety
76
201
  */
@@ -1 +1 @@
1
- {"version":3,"file":"safeRegex.js","sourceRoot":"","sources":["../../../src/utils/safeRegex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AASlD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAwB,EACxB,KAAa,EACb,YAAoB,gBAAgB;IAEpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1E,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,QAAQ,GAAG,IAAI,CAAC;YAChB,OAAO,CAAC;gBACN,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,4BAA4B,SAAS,sBAAsB;gBAClE,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;QACL,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClC,YAAY,CAAC,OAAO,CAAC,CAAC;YAEtB,IAAI,QAAQ;gBAAE,OAAO,CAAC,mBAAmB;YAEzC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,IAAI,QAAQ;gBAAE,OAAO;YAErB,OAAO,CAAC;gBACN,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAwB,EACxB,KAAa,EACb,YAAoB,gBAAgB;IAEpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1E,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,QAAQ,GAAG,IAAI,CAAC;YAChB,OAAO,CAAC;gBACN,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,4BAA4B,SAAS,sBAAsB;gBAClE,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;QACL,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnC,YAAY,CAAC,OAAO,CAAC,CAAC;YAEtB,IAAI,QAAQ;gBAAE,OAAO;YAErB,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,IAAI,QAAQ;gBAAE,OAAO;YAErB,OAAO,CAAC;gBACN,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,+CAA+C;IAC/C,MAAM,iBAAiB,GAAG;QACxB,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,mCAAmC,EAAE;QAC1E,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,mCAAmC,EAAE;QAC1E,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,mCAAmC,EAAE;QAC1E,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,mCAAmC,EAAE;QAC1E,EAAE,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,uCAAuC,EAAE;QACnF,EAAE,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,uCAAuC,EAAE;KACpF,CAAC;IAEF,KAAK,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,IAAI,iBAAiB,EAAE,CAAC;QACvE,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1C,IAAI,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QACzB,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,KAAc;IAEd,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAEjD,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO;YACL,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,yBAAyB,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAC/D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACzC,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"safeRegex.js","sourceRoot":"","sources":["../../../src/utils/safeRegex.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * File Streaming - v3.4.1
2
+ * File Streaming - v3.5.1
3
3
  * Stream large files in chunks to avoid memory exhaustion
4
4
  */
5
5
  export interface StreamOptions {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * File Streaming - v3.4.1
2
+ * File Streaming - v3.5.1
3
3
  * Stream large files in chunks to avoid memory exhaustion
4
4
  */
5
5
  import * as fs from "node:fs";
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Telemetry - v3.4.1
2
+ * Telemetry - v3.5.1
3
3
  * Metrics collection and monitoring
4
4
  */
5
5
  export interface Metric {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Telemetry - v3.4.1
2
+ * Telemetry - v3.5.1
3
3
  * Metrics collection and monitoring
4
4
  */
5
5
  export class TelemetryCollector {
package/llms.txt CHANGED
@@ -1,8 +1,8 @@
1
- # mcp-code-context v3.4.1
1
+ # mcp-code-context v3.5.1
2
2
 
3
3
  > A Model Context Protocol (MCP) server with **Tree-sitter WASM parsers** for 100% AST accuracy. Zero native dependencies. Production-ready with middleware pipeline.
4
4
 
5
- ## What's New in v3.4.1
5
+ ## What's New in v3.5.1
6
6
 
7
7
  🔒 **Production Hardening**:
8
8
  - ✅ Two-phase write workflow (dry-run + confirmation token)
@@ -142,13 +142,13 @@ This MCP server solves two problems:
142
142
  - `steps` (optional): Number of versions to go back (1-5, default: 1).
143
143
  **What it does:** Reverts the file to the state it was in before the last 1-5 modifications.
144
144
 
145
- ### Write Tools (v3.4.1 Two-Phase Workflow)
145
+ ### Write Tools (v3.5.1 Two-Phase Workflow)
146
146
 
147
147
  All write tools follow a **Two-Phase Workflow**:
148
148
  1. **Phase 1 (Preview)**: Call without a token to get a unified `diff` and a `confirmationToken`.
149
149
  2. **Phase 2 (Apply)**: Call with `confirmationToken` and `confirm: true` to apply the changes.
150
150
 
151
- **Important Notes (v3.4.1):**
151
+ **Important Notes (v3.5.1):**
152
152
  - ✅ **Windows CRLF Support**: Fully resolved. All operations work correctly on Windows files with CRLF line endings.
153
153
  - ✅ **Parameter Brace Handling**: Methods with braces in parameters (e.g., `{int? cart}`) are now handled correctly.
154
154
 
@@ -236,7 +236,7 @@ All write tools follow a **Two-Phase Workflow**:
236
236
  5. **Phase 2: Apply Edit** → Verify the diff, then call with the token and `confirm: true`.
237
237
  6. **Recovery** → Use `rollback_file` if needed.
238
238
 
239
- ### Additional Tools (v3.4.1)
239
+ ### Additional Tools (v3.5.1)
240
240
 
241
241
  #### 11. `parse_file`
242
242
  **Purpose:** Parse a file using Tree-sitter and extract all symbols.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-code-context",
3
- "version": "3.4.1",
3
+ "version": "3.5.1",
4
4
  "description": "Powerful MCP server with Tree-sitter WASM parsers for 100% AST accuracy. Zero native dependencies. Production-ready with streaming, telemetry, audit logging, rate limiting, file locking, and ReDoS protection. Supports TypeScript, JavaScript, PHP, Dart, and Python.",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",