mcp-code-context 3.6.3 → 3.7.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 (181) hide show
  1. package/CHANGELOG.md +140 -278
  2. package/INSTRUCTIONS.md +23 -9
  3. package/README.md +217 -97
  4. package/SECURITY.md +55 -21
  5. package/dist/src/core/cacheManager.d.ts +4 -5
  6. package/dist/src/core/cacheManager.js +49 -33
  7. package/dist/src/core/cacheManager.js.map +1 -1
  8. package/dist/src/core/engine.d.ts +1 -1
  9. package/dist/src/core/engine.js +3 -3
  10. package/dist/src/core/engine.js.map +1 -1
  11. package/dist/src/core/indexManager.d.ts +58 -0
  12. package/dist/src/core/indexManager.js +252 -0
  13. package/dist/src/core/indexManager.js.map +1 -0
  14. package/dist/src/core/indexManagerQueries.d.ts +14 -0
  15. package/dist/src/core/indexManagerQueries.js +95 -0
  16. package/dist/src/core/indexManagerQueries.js.map +1 -0
  17. package/dist/src/core/sessionManager.d.ts +117 -0
  18. package/dist/src/core/sessionManager.js +231 -0
  19. package/dist/src/core/sessionManager.js.map +1 -0
  20. package/dist/src/core/validator.d.ts +1 -1
  21. package/dist/src/core/validator.js +18 -10
  22. package/dist/src/core/validator.js.map +1 -1
  23. package/dist/src/index.d.ts +1 -13
  24. package/dist/src/index.js +25 -999
  25. package/dist/src/index.js.map +1 -1
  26. package/dist/src/operations/astTransform.d.ts +38 -0
  27. package/dist/src/operations/astTransform.js +239 -0
  28. package/dist/src/operations/astTransform.js.map +1 -0
  29. package/dist/src/operations/compress.d.ts +5 -3
  30. package/dist/src/operations/compress.js +73 -7
  31. package/dist/src/operations/compress.js.map +1 -1
  32. package/dist/src/operations/confirmationStore.d.ts +35 -8
  33. package/dist/src/operations/confirmationStore.js +112 -14
  34. package/dist/src/operations/confirmationStore.js.map +1 -1
  35. package/dist/src/operations/impactAnalysis.d.ts +9 -0
  36. package/dist/src/operations/impactAnalysis.js +61 -0
  37. package/dist/src/operations/impactAnalysis.js.map +1 -0
  38. package/dist/src/operations/pendingStore.d.ts +51 -0
  39. package/dist/src/operations/pendingStore.js +201 -0
  40. package/dist/src/operations/pendingStore.js.map +1 -0
  41. package/dist/src/operations/pendingStoreInit.d.ts +6 -0
  42. package/dist/src/operations/pendingStoreInit.js +42 -0
  43. package/dist/src/operations/pendingStoreInit.js.map +1 -0
  44. package/dist/src/operations/read.d.ts +6 -92
  45. package/dist/src/operations/read.js +4 -449
  46. package/dist/src/operations/read.js.map +1 -1
  47. package/dist/src/operations/readCore.d.ts +33 -0
  48. package/dist/src/operations/readCore.js +142 -0
  49. package/dist/src/operations/readCore.js.map +1 -0
  50. package/dist/src/operations/rename.d.ts +13 -0
  51. package/dist/src/operations/rename.js +130 -0
  52. package/dist/src/operations/rename.js.map +1 -0
  53. package/dist/src/operations/searchOperation.d.ts +16 -0
  54. package/dist/src/operations/searchOperation.js +113 -0
  55. package/dist/src/operations/searchOperation.js.map +1 -0
  56. package/dist/src/operations/symbolQuery.d.ts +38 -0
  57. package/dist/src/operations/symbolQuery.js +194 -0
  58. package/dist/src/operations/symbolQuery.js.map +1 -0
  59. package/dist/src/operations/write.d.ts +11 -14
  60. package/dist/src/operations/write.js +6 -125
  61. package/dist/src/operations/write.js.map +1 -1
  62. package/dist/src/parsers/base.d.ts +1 -1
  63. package/dist/src/parsers/base.js +1 -1
  64. package/dist/src/parsers/csharp.d.ts +12 -0
  65. package/dist/src/parsers/csharp.js +67 -0
  66. package/dist/src/parsers/csharp.js.map +1 -0
  67. package/dist/src/parsers/dartTreeSitter.d.ts +1 -1
  68. package/dist/src/parsers/dartTreeSitter.js +1 -1
  69. package/dist/src/parsers/go.d.ts +11 -0
  70. package/dist/src/parsers/go.js +74 -0
  71. package/dist/src/parsers/go.js.map +1 -0
  72. package/dist/src/parsers/java.d.ts +12 -0
  73. package/dist/src/parsers/java.js +62 -0
  74. package/dist/src/parsers/java.js.map +1 -0
  75. package/dist/src/parsers/kotlin.d.ts +12 -0
  76. package/dist/src/parsers/kotlin.js +75 -0
  77. package/dist/src/parsers/kotlin.js.map +1 -0
  78. package/dist/src/parsers/php.d.ts +1 -1
  79. package/dist/src/parsers/php.js +1 -1
  80. package/dist/src/parsers/python.d.ts +1 -1
  81. package/dist/src/parsers/python.js +1 -1
  82. package/dist/src/parsers/registry.d.ts +1 -1
  83. package/dist/src/parsers/registry.js +63 -2
  84. package/dist/src/parsers/registry.js.map +1 -1
  85. package/dist/src/parsers/ruby.d.ts +12 -0
  86. package/dist/src/parsers/ruby.js +73 -0
  87. package/dist/src/parsers/ruby.js.map +1 -0
  88. package/dist/src/parsers/rust.d.ts +12 -0
  89. package/dist/src/parsers/rust.js +66 -0
  90. package/dist/src/parsers/rust.js.map +1 -0
  91. package/dist/src/parsers/typescript.d.ts +1 -1
  92. package/dist/src/parsers/typescript.js +28 -38
  93. package/dist/src/parsers/typescript.js.map +1 -1
  94. package/dist/src/tools/adminHandlers.d.ts +67 -0
  95. package/dist/src/tools/adminHandlers.js +129 -0
  96. package/dist/src/tools/adminHandlers.js.map +1 -0
  97. package/dist/src/tools/context.d.ts +9 -0
  98. package/dist/src/tools/context.js +21 -0
  99. package/dist/src/tools/context.js.map +1 -0
  100. package/dist/src/tools/handlers.d.ts +4 -0
  101. package/dist/src/tools/handlers.js +5 -0
  102. package/dist/src/tools/handlers.js.map +1 -0
  103. package/dist/src/tools/pipeline.d.ts +6 -0
  104. package/dist/src/tools/pipeline.js +100 -0
  105. package/dist/src/tools/pipeline.js.map +1 -0
  106. package/dist/src/tools/readHandlers.d.ts +55 -0
  107. package/dist/src/tools/readHandlers.js +220 -0
  108. package/dist/src/tools/readHandlers.js.map +1 -0
  109. package/dist/src/tools/toolDefinitions.d.ts +1037 -0
  110. package/dist/src/tools/toolDefinitions.js +13 -0
  111. package/dist/src/tools/toolDefinitions.js.map +1 -0
  112. package/dist/src/tools/toolDefinitionsAdmin.d.ts +89 -0
  113. package/dist/src/tools/toolDefinitionsAdmin.js +99 -0
  114. package/dist/src/tools/toolDefinitionsAdmin.js.map +1 -0
  115. package/dist/src/tools/toolDefinitionsCore.d.ts +949 -0
  116. package/dist/src/tools/toolDefinitionsCore.js +267 -0
  117. package/dist/src/tools/toolDefinitionsCore.js.map +1 -0
  118. package/dist/src/tools/writeHandlers.d.ts +37 -0
  119. package/dist/src/tools/writeHandlers.js +199 -0
  120. package/dist/src/tools/writeHandlers.js.map +1 -0
  121. package/dist/src/utils/appDir.d.ts +19 -0
  122. package/dist/src/utils/appDir.js +50 -0
  123. package/dist/src/utils/appDir.js.map +1 -0
  124. package/dist/src/utils/auditLogWriter.d.ts +9 -0
  125. package/dist/src/utils/auditLogWriter.js +49 -0
  126. package/dist/src/utils/auditLogWriter.js.map +1 -0
  127. package/dist/src/utils/auditLogger.d.ts +1 -10
  128. package/dist/src/utils/auditLogger.js +14 -109
  129. package/dist/src/utils/auditLogger.js.map +1 -1
  130. package/dist/src/utils/auditQuery.d.ts +23 -0
  131. package/dist/src/utils/auditQuery.js +67 -0
  132. package/dist/src/utils/auditQuery.js.map +1 -0
  133. package/dist/src/utils/backupManager.d.ts +2 -2
  134. package/dist/src/utils/backupManager.js +29 -12
  135. package/dist/src/utils/backupManager.js.map +1 -1
  136. package/dist/src/utils/constants.d.ts +1 -1
  137. package/dist/src/utils/constants.js +8 -1
  138. package/dist/src/utils/constants.js.map +1 -1
  139. package/dist/src/utils/diff.d.ts +12 -1
  140. package/dist/src/utils/diff.js +41 -1
  141. package/dist/src/utils/diff.js.map +1 -1
  142. package/dist/src/utils/fileLock.d.ts +7 -2
  143. package/dist/src/utils/fileLock.js +14 -11
  144. package/dist/src/utils/fileLock.js.map +1 -1
  145. package/dist/src/utils/fileWalker.d.ts +1 -1
  146. package/dist/src/utils/fileWalker.js +1 -1
  147. package/dist/src/utils/fileWatcher.d.ts +1 -1
  148. package/dist/src/utils/fileWatcher.js +1 -1
  149. package/dist/src/utils/fuzzySearch.d.ts +1 -1
  150. package/dist/src/utils/fuzzySearch.js +1 -1
  151. package/dist/src/utils/logger.d.ts +1 -1
  152. package/dist/src/utils/logger.js +2 -2
  153. package/dist/src/utils/logger.js.map +1 -1
  154. package/dist/src/utils/rateLimiter.d.ts +9 -1
  155. package/dist/src/utils/rateLimiter.js +12 -1
  156. package/dist/src/utils/rateLimiter.js.map +1 -1
  157. package/dist/src/utils/regexValidator.d.ts +12 -0
  158. package/dist/src/utils/regexValidator.js +48 -0
  159. package/dist/src/utils/regexValidator.js.map +1 -0
  160. package/dist/src/utils/safeRegex.d.ts +2 -92
  161. package/dist/src/utils/safeRegex.js +41 -222
  162. package/dist/src/utils/safeRegex.js.map +1 -1
  163. package/dist/src/utils/safeRegexApi.d.ts +56 -0
  164. package/dist/src/utils/safeRegexApi.js +99 -0
  165. package/dist/src/utils/safeRegexApi.js.map +1 -0
  166. package/dist/src/utils/safeRegexPool.d.ts +7 -0
  167. package/dist/src/utils/safeRegexPool.js +102 -0
  168. package/dist/src/utils/safeRegexPool.js.map +1 -0
  169. package/dist/src/utils/searchTools.js +6 -6
  170. package/dist/src/utils/searchTools.js.map +1 -1
  171. package/dist/src/utils/streaming.d.ts +4 -3
  172. package/dist/src/utils/streaming.js +1 -1
  173. package/dist/src/utils/streaming.js.map +1 -1
  174. package/dist/src/utils/telemetry.d.ts +1 -1
  175. package/dist/src/utils/telemetry.js +1 -1
  176. package/dist/src/utils/toctou.d.ts +7 -0
  177. package/dist/src/utils/toctou.js +24 -0
  178. package/dist/src/utils/toctou.js.map +1 -0
  179. package/llms.txt +173 -21
  180. package/package.json +2 -2
  181. package/scripts/replace-version.js +0 -59
@@ -1,62 +1,38 @@
1
- /**
2
- * Safe Regex - v3.6.3
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
11
- */
12
- import { Worker, isMainThread, parentPort, workerData } from "node:worker_threads";
13
- import { fileURLToPath } from "node:url";
14
- import { REGEX_TIMEOUT_MS } from './constants.js';
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;
1
+ import { isMainThread, parentPort, workerData } from "node:worker_threads";
2
+ export { validateRegexPattern, sanitizeRegexPattern, createSafeRegex, } from "./regexValidator.js";
3
+ export { safeRegexTest, safeRegexMatch, safeRegexBatchTest, safeRegexFindFirst, safeRegexAnyTest, safeRegexReplaceAll, safeRegexMultiFileBatchTest, } from "./safeRegexApi.js";
4
+ function executeRegexJob(data) {
5
+ const { pattern, flags, input, mode, lines, files } = data;
21
6
  const regex = new RegExp(pattern, flags);
22
7
  switch (mode) {
23
8
  case "test":
24
- parentPort?.postMessage({ matched: regex.test(input) });
25
- break;
9
+ return { matched: regex.test(input ?? "") };
26
10
  case "match":
27
- parentPort?.postMessage({ matches: input.match(regex) });
28
- break;
11
+ return { matches: (input ?? "").match(regex) };
29
12
  case "batch_test": {
30
- // One worker per file: test each line, return matching indices
31
13
  const matches = [];
32
- for (let i = 0; i < lines.length; i++) {
14
+ for (let i = 0; i < (lines?.length ?? 0); i++) {
33
15
  regex.lastIndex = 0;
34
16
  if (regex.test(lines[i])) {
35
17
  matches.push({ index: i, content: lines[i].trim() });
36
18
  }
37
19
  }
38
- parentPort?.postMessage({ matches });
39
- break;
20
+ return { matches };
40
21
  }
41
22
  case "batch_find_first": {
42
- // Find first matching line index
43
23
  let matchIndex = -1;
44
- for (let i = 0; i < lines.length; i++) {
24
+ for (let i = 0; i < (lines?.length ?? 0); i++) {
45
25
  regex.lastIndex = 0;
46
26
  if (regex.test(lines[i])) {
47
27
  matchIndex = i;
48
28
  break;
49
29
  }
50
30
  }
51
- parentPort?.postMessage({ matchIndex });
52
- break;
31
+ return { matchIndex };
53
32
  }
54
33
  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
34
  const fileResults = [];
59
- for (const file of files) {
35
+ for (const file of files ?? []) {
60
36
  for (let i = 0; i < file.lines.length; i++) {
61
37
  regex.lastIndex = 0;
62
38
  if (regex.test(file.lines[i])) {
@@ -64,199 +40,42 @@ if (!isMainThread && workerData) {
64
40
  }
65
41
  }
66
42
  }
67
- parentPort?.postMessage({ results: fileResults });
68
- break;
43
+ return { results: fileResults };
69
44
  }
45
+ case "any_test": {
46
+ const patterns = data.patterns ?? [];
47
+ for (const p of patterns) {
48
+ const r = new RegExp(p, flags);
49
+ r.lastIndex = 0;
50
+ if (r.test(input ?? ""))
51
+ return { matched: true };
52
+ }
53
+ return { matched: false };
54
+ }
55
+ case "replace_all": {
56
+ regex.lastIndex = 0;
57
+ return { output: (input ?? "").replace(regex, data.replacement) };
58
+ }
59
+ default:
60
+ throw new Error(`Unknown regex worker mode: ${mode}`);
70
61
  }
71
62
  }
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
- }
80
- return new Promise((resolve) => {
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 });
89
- }, timeoutMs);
90
- worker.on("message", (msg) => {
91
- if (settled)
92
- return;
93
- settled = true;
94
- clearTimeout(timer);
95
- worker.terminate();
96
- resolve({ result: msg });
97
- });
98
- worker.on("error", (err) => {
99
- if (settled)
100
- return;
101
- settled = true;
102
- clearTimeout(timer);
103
- resolve({ error: err.message });
104
- });
105
- });
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
- // ─────────────────────────────────────────────────────────────────────────
199
- /**
200
- * Validate regex pattern for safety
201
- */
202
- export function validateRegexPattern(pattern) {
203
- const issues = [];
204
- // Check for catastrophic backtracking patterns
205
- const dangerousPatterns = [
206
- { pattern: /\([^)]*\+\)\+/, message: 'Nested quantifiers (a+)+ detected' },
207
- { pattern: /\([^)]*\*\)\*/, message: 'Nested quantifiers (a*)* detected' },
208
- { pattern: /\([^)]*\+\)\*/, message: 'Nested quantifiers (a+)* detected' },
209
- { pattern: /\([^)]*\*\)\+/, message: 'Nested quantifiers (a*)+ detected' },
210
- { pattern: /\([^|]*\|[^)]*\)\*/, message: 'Alternation with star (a|b)* detected' },
211
- { pattern: /\([^|]*\|[^)]*\)\+/, message: 'Alternation with plus (a|b)+ detected' },
212
- ];
213
- for (const { pattern: dangerousPattern, message } of dangerousPatterns) {
214
- if (dangerousPattern.test(pattern)) {
215
- issues.push(message);
63
+ if (!isMainThread) {
64
+ const runAndReply = (data) => {
65
+ try {
66
+ parentPort?.postMessage(executeRegexJob(data));
216
67
  }
217
- }
218
- // Check for excessive repetition
219
- if (/\{(\d+),\}/.test(pattern)) {
220
- const match = pattern.match(/\{(\d+),\}/);
221
- if (match && parseInt(match[1]) > 1000) {
222
- issues.push('Excessive repetition {n,} with n > 1000');
68
+ catch (err) {
69
+ parentPort?.postMessage({
70
+ __error: err instanceof Error ? err.message : String(err),
71
+ });
223
72
  }
224
- }
225
- // Check for very long patterns (potential complexity)
226
- if (pattern.length > 500) {
227
- issues.push('Pattern exceeds 500 characters');
228
- }
229
- return {
230
- safe: issues.length === 0,
231
- issues,
232
73
  };
233
- }
234
- /**
235
- * Sanitize regex pattern (escape metacharacters)
236
- */
237
- export function sanitizeRegexPattern(input) {
238
- return input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
239
- }
240
- /**
241
- * Create safe regex with validation
242
- */
243
- export function createSafeRegex(pattern, flags) {
244
- const validation = validateRegexPattern(pattern);
245
- if (!validation.safe) {
246
- return {
247
- regex: null,
248
- error: `Unsafe regex pattern: ${validation.issues.join(', ')}`,
249
- };
250
- }
251
- try {
252
- const regex = new RegExp(pattern, flags);
253
- return { regex };
74
+ if (workerData) {
75
+ runAndReply(workerData);
254
76
  }
255
- catch (error) {
256
- return {
257
- regex: null,
258
- error: error instanceof Error ? error.message : String(error),
259
- };
77
+ else {
78
+ parentPort?.on("message", runAndReply);
260
79
  }
261
80
  }
262
81
  //# sourceMappingURL=safeRegex.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"safeRegex.js","sourceRoot":"","sources":["../../../src/utils/safeRegex.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"safeRegex.js","sourceRoot":"","sources":["../../../src/utils/safeRegex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Safe regex public API — all execution routed through worker pool
3
+ */
4
+ export interface RegexResult {
5
+ success: boolean;
6
+ matches?: RegExpMatchArray | null;
7
+ error?: string;
8
+ timedOut?: boolean;
9
+ }
10
+ export declare function safeRegexTest(pattern: string | RegExp, input: string, timeoutMs?: number): Promise<{
11
+ success: boolean;
12
+ matched: boolean;
13
+ error?: string;
14
+ timedOut?: boolean;
15
+ }>;
16
+ export declare function safeRegexMatch(pattern: string | RegExp, input: string, timeoutMs?: number): Promise<RegexResult>;
17
+ export declare function safeRegexBatchTest(pattern: string | RegExp, lines: string[], timeoutMs?: number): Promise<{
18
+ success: boolean;
19
+ matches?: Array<{
20
+ index: number;
21
+ content: string;
22
+ }>;
23
+ timedOut?: boolean;
24
+ error?: string;
25
+ }>;
26
+ export declare function safeRegexFindFirst(pattern: string | RegExp, lines: string[], timeoutMs?: number): Promise<{
27
+ success: boolean;
28
+ matchIndex?: number;
29
+ timedOut?: boolean;
30
+ error?: string;
31
+ }>;
32
+ export declare function safeRegexAnyTest(patterns: string[], input: string, timeoutMs?: number): Promise<{
33
+ success: boolean;
34
+ matched: boolean;
35
+ timedOut?: boolean;
36
+ error?: string;
37
+ }>;
38
+ export declare function safeRegexReplaceAll(pattern: string, replacement: string, input: string, timeoutMs?: number): Promise<{
39
+ success: boolean;
40
+ output?: string;
41
+ timedOut?: boolean;
42
+ error?: string;
43
+ }>;
44
+ export declare function safeRegexMultiFileBatchTest(pattern: string | RegExp, files: Array<{
45
+ path: string;
46
+ lines: string[];
47
+ }>, timeoutMs?: number): Promise<{
48
+ success: boolean;
49
+ results?: Array<{
50
+ file: string;
51
+ index: number;
52
+ content: string;
53
+ }>;
54
+ timedOut?: boolean;
55
+ error?: string;
56
+ }>;
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Safe regex public API — all execution routed through worker pool
3
+ */
4
+ import { isMainThread } from "node:worker_threads";
5
+ import { REGEX_TIMEOUT_MS } from "./constants.js";
6
+ import { validateRegexPattern } from "./regexValidator.js";
7
+ import { runRegexWorkerJob } from "./safeRegexPool.js";
8
+ function extractPatternInfo(pattern) {
9
+ return {
10
+ source: pattern instanceof RegExp ? pattern.source : pattern,
11
+ flags: pattern instanceof RegExp ? pattern.flags : "",
12
+ };
13
+ }
14
+ export async function safeRegexTest(pattern, input, timeoutMs = REGEX_TIMEOUT_MS) {
15
+ if (!isMainThread)
16
+ return { success: false, matched: false };
17
+ const { source, flags } = extractPatternInfo(pattern);
18
+ const { result, timedOut, error } = await runRegexWorkerJob({ pattern: source, flags, input, mode: "test" }, timeoutMs);
19
+ if (timedOut)
20
+ return { success: false, matched: false, timedOut: true, error: `Regex exceeded ${timeoutMs}ms (ReDoS prevented)` };
21
+ if (error)
22
+ return { success: false, matched: false, error };
23
+ return { success: true, matched: result.matched };
24
+ }
25
+ export async function safeRegexMatch(pattern, input, timeoutMs = REGEX_TIMEOUT_MS) {
26
+ if (!isMainThread)
27
+ return { success: false };
28
+ const { source, flags } = extractPatternInfo(pattern);
29
+ const { result, timedOut, error } = await runRegexWorkerJob({ pattern: source, flags, input, mode: "match" }, timeoutMs);
30
+ if (timedOut)
31
+ return { success: false, timedOut: true, error: `Regex exceeded ${timeoutMs}ms (ReDoS prevented)` };
32
+ if (error)
33
+ return { success: false, error };
34
+ return { success: true, matches: result.matches };
35
+ }
36
+ export async function safeRegexBatchTest(pattern, lines, timeoutMs = REGEX_TIMEOUT_MS) {
37
+ if (!isMainThread)
38
+ return { success: false };
39
+ const { source, flags } = extractPatternInfo(pattern);
40
+ const { result, timedOut, error } = await runRegexWorkerJob({ pattern: source, flags, lines, mode: "batch_test" }, timeoutMs);
41
+ if (timedOut)
42
+ return { success: false, timedOut: true, error: `Regex batch exceeded ${timeoutMs}ms (ReDoS prevented)` };
43
+ if (error)
44
+ return { success: false, error };
45
+ return { success: true, matches: result.matches };
46
+ }
47
+ export async function safeRegexFindFirst(pattern, lines, timeoutMs = REGEX_TIMEOUT_MS) {
48
+ if (!isMainThread)
49
+ return { success: false };
50
+ const { source, flags } = extractPatternInfo(pattern);
51
+ const { result, timedOut, error } = await runRegexWorkerJob({ pattern: source, flags, lines, mode: "batch_find_first" }, timeoutMs);
52
+ if (timedOut)
53
+ return { success: false, timedOut: true, error: `Regex search exceeded ${timeoutMs}ms (ReDoS prevented)` };
54
+ if (error)
55
+ return { success: false, error };
56
+ return { success: true, matchIndex: result.matchIndex };
57
+ }
58
+ export async function safeRegexAnyTest(patterns, input, timeoutMs = REGEX_TIMEOUT_MS) {
59
+ if (!isMainThread)
60
+ return { success: false, matched: false };
61
+ for (const pattern of patterns) {
62
+ const validation = validateRegexPattern(pattern);
63
+ if (!validation.safe) {
64
+ return { success: false, matched: false, error: `Unsafe regex pattern: ${validation.issues.join(", ")}` };
65
+ }
66
+ }
67
+ const { result, timedOut, error } = await runRegexWorkerJob({ patterns, input, flags: "", mode: "any_test" }, timeoutMs);
68
+ if (timedOut)
69
+ return { success: false, matched: false, timedOut: true, error: `Regex exceeded ${timeoutMs}ms (ReDoS prevented)` };
70
+ if (error)
71
+ return { success: false, matched: false, error };
72
+ return { success: true, matched: result.matched };
73
+ }
74
+ export async function safeRegexReplaceAll(pattern, replacement, input, timeoutMs = REGEX_TIMEOUT_MS) {
75
+ if (!isMainThread)
76
+ return { success: false };
77
+ const validation = validateRegexPattern(pattern);
78
+ if (!validation.safe) {
79
+ return { success: false, error: `Unsafe regex pattern: ${validation.issues.join(", ")}` };
80
+ }
81
+ const { result, timedOut, error } = await runRegexWorkerJob({ pattern, flags: "g", input, replacement, mode: "replace_all" }, timeoutMs);
82
+ if (timedOut)
83
+ return { success: false, timedOut: true, error: `Regex replace exceeded ${timeoutMs}ms (ReDoS prevented)` };
84
+ if (error)
85
+ return { success: false, error };
86
+ return { success: true, output: result.output };
87
+ }
88
+ export async function safeRegexMultiFileBatchTest(pattern, files, timeoutMs = REGEX_TIMEOUT_MS) {
89
+ if (!isMainThread)
90
+ return { success: false };
91
+ const { source, flags } = extractPatternInfo(pattern);
92
+ const { result, timedOut, error } = await runRegexWorkerJob({ pattern: source, flags, files, mode: "batch_multi_file" }, timeoutMs);
93
+ if (timedOut)
94
+ return { success: false, timedOut: true, error: `Multi-file regex scan exceeded ${timeoutMs}ms (ReDoS prevented)` };
95
+ if (error)
96
+ return { success: false, error };
97
+ return { success: true, results: result.results };
98
+ }
99
+ //# sourceMappingURL=safeRegexApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeRegexApi.js","sourceRoot":"","sources":["../../../src/utils/safeRegexApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ type WorkerJob = Record<string, unknown>;
2
+ export declare function runRegexWorkerJob<T>(data: WorkerJob, timeoutMs: number): Promise<{
3
+ result?: T;
4
+ timedOut?: boolean;
5
+ error?: string;
6
+ }>;
7
+ export {};
@@ -0,0 +1,102 @@
1
+ import { Worker, isMainThread } from "node:worker_threads";
2
+ import { fileURLToPath } from "node:url";
3
+ import * as path from "node:path";
4
+ import { existsSync } from "node:fs";
5
+ const POOL_SIZE = 4;
6
+ let cachedWorkerFile = null;
7
+ let workerPool = null;
8
+ const idleWorkers = [];
9
+ const waitQueue = [];
10
+ function getWorkerFile() {
11
+ if (cachedWorkerFile)
12
+ return cachedWorkerFile;
13
+ const thisDir = path.dirname(fileURLToPath(import.meta.url));
14
+ const candidates = [
15
+ path.resolve(thisDir, "safeRegex.js"),
16
+ path.resolve(thisDir, "../../dist/src/utils/safeRegex.js"),
17
+ ];
18
+ for (const candidate of candidates) {
19
+ if (existsSync(candidate)) {
20
+ cachedWorkerFile = candidate;
21
+ return candidate;
22
+ }
23
+ }
24
+ throw new Error("safeRegex worker file not found. Run: npm run build");
25
+ }
26
+ function spawnWorker() {
27
+ const worker = new Worker(getWorkerFile());
28
+ worker.on("error", () => replaceWorker(worker));
29
+ return worker;
30
+ }
31
+ function initPool() {
32
+ if (workerPool)
33
+ return;
34
+ workerPool = Array.from({ length: POOL_SIZE }, () => spawnWorker());
35
+ idleWorkers.push(...workerPool);
36
+ }
37
+ function replaceWorker(dead) {
38
+ if (!workerPool)
39
+ return;
40
+ const idx = workerPool.indexOf(dead);
41
+ if (idx >= 0) {
42
+ const replacement = spawnWorker();
43
+ workerPool[idx] = replacement;
44
+ idleWorkers.push(replacement);
45
+ const waiter = waitQueue.shift();
46
+ if (waiter) {
47
+ idleWorkers.pop();
48
+ waiter(replacement);
49
+ }
50
+ }
51
+ }
52
+ function acquireWorker() {
53
+ initPool();
54
+ const worker = idleWorkers.pop();
55
+ if (worker)
56
+ return Promise.resolve(worker);
57
+ return new Promise((resolve) => waitQueue.push(resolve));
58
+ }
59
+ function releaseWorker(worker) {
60
+ const waiter = waitQueue.shift();
61
+ if (waiter) {
62
+ waiter(worker);
63
+ }
64
+ else {
65
+ idleWorkers.push(worker);
66
+ }
67
+ }
68
+ export async function runRegexWorkerJob(data, timeoutMs) {
69
+ if (!isMainThread) {
70
+ throw new Error("safeRegex: runRegexWorkerJob called from worker thread");
71
+ }
72
+ const worker = await acquireWorker();
73
+ return new Promise((resolve) => {
74
+ let settled = false;
75
+ const timer = setTimeout(() => {
76
+ if (settled)
77
+ return;
78
+ settled = true;
79
+ worker.removeAllListeners("message");
80
+ worker.terminate();
81
+ replaceWorker(worker);
82
+ resolve({ timedOut: true });
83
+ }, timeoutMs);
84
+ const onMessage = (msg) => {
85
+ if (settled)
86
+ return;
87
+ settled = true;
88
+ clearTimeout(timer);
89
+ worker.off("message", onMessage);
90
+ releaseWorker(worker);
91
+ if (msg && typeof msg === "object" && "__error" in msg) {
92
+ resolve({ error: msg.__error });
93
+ }
94
+ else {
95
+ resolve({ result: msg });
96
+ }
97
+ };
98
+ worker.on("message", onMessage);
99
+ worker.postMessage(data);
100
+ });
101
+ }
102
+ //# sourceMappingURL=safeRegexPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeRegexPool.js","sourceRoot":"","sources":["../../../src/utils/safeRegexPool.ts"],"names":[],"mappings":"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"}