mcp-code-context 3.0.6 → 3.4.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 (75) hide show
  1. package/CHANGELOG.md +84 -1
  2. package/CHANGELOG_v3.2.0.md +196 -0
  3. package/CHANGELOG_v3.3.0.md +266 -0
  4. package/README.md +1 -1
  5. package/SECURITY.md +177 -0
  6. package/dist/src/core/engine.d.ts +2 -2
  7. package/dist/src/core/engine.js +14 -8
  8. package/dist/src/core/engine.js.map +1 -1
  9. package/dist/src/core/validator.d.ts +2 -2
  10. package/dist/src/core/validator.js +8 -7
  11. package/dist/src/core/validator.js.map +1 -1
  12. package/dist/src/index.d.ts +6 -6
  13. package/dist/src/index.js +499 -158
  14. package/dist/src/index.js.map +1 -1
  15. package/dist/src/operations/compress.d.ts +18 -0
  16. package/dist/src/operations/compress.js +89 -0
  17. package/dist/src/operations/compress.js.map +1 -0
  18. package/dist/src/operations/confirmationStore.d.ts +53 -0
  19. package/dist/src/operations/confirmationStore.js +91 -0
  20. package/dist/src/operations/confirmationStore.js.map +1 -0
  21. package/dist/src/operations/read.d.ts +50 -0
  22. package/dist/src/operations/read.js +228 -0
  23. package/dist/src/operations/read.js.map +1 -0
  24. package/dist/src/operations/write.d.ts +16 -4
  25. package/dist/src/operations/write.js +142 -48
  26. package/dist/src/operations/write.js.map +1 -1
  27. package/dist/src/parsers/base.d.ts +7 -2
  28. package/dist/src/parsers/base.js +18 -1
  29. package/dist/src/parsers/base.js.map +1 -1
  30. package/dist/src/parsers/dartTreeSitter.d.ts +3 -3
  31. package/dist/src/parsers/dartTreeSitter.js +6 -11
  32. package/dist/src/parsers/dartTreeSitter.js.map +1 -1
  33. package/dist/src/parsers/php.d.ts +2 -2
  34. package/dist/src/parsers/php.js +5 -10
  35. package/dist/src/parsers/php.js.map +1 -1
  36. package/dist/src/parsers/python.d.ts +2 -2
  37. package/dist/src/parsers/python.js +5 -10
  38. package/dist/src/parsers/python.js.map +1 -1
  39. package/dist/src/parsers/registry.d.ts +1 -1
  40. package/dist/src/parsers/registry.js +2 -2
  41. package/dist/src/parsers/registry.js.map +1 -1
  42. package/dist/src/parsers/typescript.d.ts +2 -2
  43. package/dist/src/parsers/typescript.js +8 -13
  44. package/dist/src/parsers/typescript.js.map +1 -1
  45. package/dist/src/utils/auditLogger.d.ts +90 -0
  46. package/dist/src/utils/auditLogger.js +271 -0
  47. package/dist/src/utils/auditLogger.js.map +1 -0
  48. package/dist/src/utils/backupManager.d.ts +33 -0
  49. package/dist/src/utils/backupManager.js +130 -0
  50. package/dist/src/utils/backupManager.js.map +1 -0
  51. package/dist/src/utils/constants.d.ts +12 -0
  52. package/dist/src/utils/constants.js +33 -0
  53. package/dist/src/utils/constants.js.map +1 -0
  54. package/dist/src/utils/diff.d.ts +13 -0
  55. package/dist/src/utils/diff.js +124 -0
  56. package/dist/src/utils/diff.js.map +1 -0
  57. package/dist/src/utils/fileLock.d.ts +63 -0
  58. package/dist/src/utils/fileLock.js +123 -0
  59. package/dist/src/utils/fileLock.js.map +1 -0
  60. package/dist/src/utils/rateLimiter.d.ts +61 -0
  61. package/dist/src/utils/rateLimiter.js +114 -0
  62. package/dist/src/utils/rateLimiter.js.map +1 -0
  63. package/dist/src/utils/safeRegex.d.ts +41 -0
  64. package/dist/src/utils/safeRegex.js +137 -0
  65. package/dist/src/utils/safeRegex.js.map +1 -0
  66. package/dist/src/utils/streaming.d.ts +43 -0
  67. package/dist/src/utils/streaming.js +175 -0
  68. package/dist/src/utils/streaming.js.map +1 -0
  69. package/dist/src/utils/telemetry.d.ts +91 -0
  70. package/dist/src/utils/telemetry.js +185 -0
  71. package/dist/src/utils/telemetry.js.map +1 -0
  72. package/llms.txt +46 -28
  73. package/package.json +5 -5
  74. package/mcp-code-context-3.0.2.tgz +0 -0
  75. package/tsconfig.tests.json +0 -27
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backupManager.js","sourceRoot":"","sources":["../../../src/utils/backupManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Constants - Centralized configuration
3
+ * v3.4.0
4
+ */
5
+ export declare const EXCLUDE_DIRS: string[];
6
+ export declare const SUPPORTED_EXTENSIONS: string[];
7
+ export declare const MAX_FILES_REPO_MAP = 500;
8
+ export declare const MAX_TOTAL_SIZE_BYTES: number;
9
+ export declare const MAX_FILE_SIZE_BYTES: number;
10
+ export declare const OPERATION_TIMEOUT_MS = 30000;
11
+ export declare const MAX_CONCURRENT_OPS = 100;
12
+ export declare const REGEX_TIMEOUT_MS = 1000;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Constants - Centralized configuration
3
+ * v3.4.0
4
+ */
5
+ export const EXCLUDE_DIRS = [
6
+ "node_modules",
7
+ "dist",
8
+ "build",
9
+ ".git",
10
+ "vendor",
11
+ ".mcp-backups",
12
+ "coverage",
13
+ ".nyc_output",
14
+ ];
15
+ export const SUPPORTED_EXTENSIONS = [
16
+ ".ts",
17
+ ".tsx",
18
+ ".js",
19
+ ".jsx",
20
+ ".mjs",
21
+ ".mts",
22
+ ".py",
23
+ ".pyi",
24
+ ".php",
25
+ ".dart",
26
+ ];
27
+ export const MAX_FILES_REPO_MAP = 500;
28
+ export const MAX_TOTAL_SIZE_BYTES = 50 * 1024 * 1024; // 50MB
29
+ export const MAX_FILE_SIZE_BYTES = 10 * 1024 * 1024; // 10MB
30
+ export const OPERATION_TIMEOUT_MS = 30000; // 30s
31
+ export const MAX_CONCURRENT_OPS = 100;
32
+ export const REGEX_TIMEOUT_MS = 1000; // 1s for regex operations
33
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,cAAc;IACd,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACR,cAAc;IACd,UAAU;IACV,aAAa;CACd,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;CACR,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AACtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAC7D,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAC5D,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,CAAC,MAAM;AACjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,CAAC,0BAA0B"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Diff Engine - v3.4.0
3
+ * LCS-based unified diff with memory safety cap
4
+ */
5
+ /**
6
+ * Generate unified diff using LCS algorithm
7
+ * Falls back to simple diff for large files to prevent OOM
8
+ */
9
+ export declare function generateUnifiedDiff(oldContent: string, newContent: string, contextLines?: number): string;
10
+ /**
11
+ * Simple line-by-line diff (O(n) memory fallback for large files)
12
+ */
13
+ export declare function generateSimpleDiff(oldContent: string, newContent: string): string;
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Diff Engine - v3.4.0
3
+ * LCS-based unified diff with memory safety cap
4
+ */
5
+ const MAX_DIFF_LINES = 5000;
6
+ /**
7
+ * Longest Common Subsequence algorithm
8
+ */
9
+ function lcs(a, b) {
10
+ const m = a.length;
11
+ const n = b.length;
12
+ const dp = Array(m + 1).fill(0).map(() => Array(n + 1).fill(0));
13
+ for (let i = 1; i <= m; i++) {
14
+ for (let j = 1; j <= n; j++) {
15
+ if (a[i - 1] === b[j - 1]) {
16
+ dp[i][j] = dp[i - 1][j - 1] + 1;
17
+ }
18
+ else {
19
+ dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
20
+ }
21
+ }
22
+ }
23
+ return dp;
24
+ }
25
+ /**
26
+ * Generate unified diff using LCS algorithm
27
+ * Falls back to simple diff for large files to prevent OOM
28
+ */
29
+ export function generateUnifiedDiff(oldContent, newContent, contextLines = 3) {
30
+ const oldLines = oldContent.split('\n');
31
+ const newLines = newContent.split('\n');
32
+ // SAFETY: Fall back to simple diff for large files (LCS is O(n*m) memory)
33
+ if (oldLines.length > MAX_DIFF_LINES || newLines.length > MAX_DIFF_LINES) {
34
+ return generateSimpleDiff(oldContent, newContent);
35
+ }
36
+ const dp = lcs(oldLines, newLines);
37
+ const diff = [];
38
+ // Backtrack to find differences
39
+ let i = oldLines.length;
40
+ let j = newLines.length;
41
+ while (i > 0 || j > 0) {
42
+ if (i > 0 && j > 0 && oldLines[i - 1] === newLines[j - 1]) {
43
+ diff.unshift({ type: 'context', content: oldLines[i - 1], lineNumber: i });
44
+ i--;
45
+ j--;
46
+ }
47
+ else if (j > 0 && (i === 0 || dp[i][j - 1] >= dp[i - 1][j])) {
48
+ diff.unshift({ type: 'add', content: newLines[j - 1], lineNumber: j });
49
+ j--;
50
+ }
51
+ else if (i > 0 && (j === 0 || dp[i][j - 1] < dp[i - 1][j])) {
52
+ diff.unshift({ type: 'remove', content: oldLines[i - 1], lineNumber: i });
53
+ i--;
54
+ }
55
+ }
56
+ // Format output with context
57
+ const output = [];
58
+ let inHunk = false;
59
+ let contextCount = 0;
60
+ for (let idx = 0; idx < diff.length; idx++) {
61
+ const line = diff[idx];
62
+ if (line.type === 'context') {
63
+ if (inHunk) {
64
+ contextCount++;
65
+ if (contextCount <= contextLines) {
66
+ output.push(` ${line.content}`);
67
+ }
68
+ else {
69
+ inHunk = false;
70
+ contextCount = 0;
71
+ }
72
+ }
73
+ else {
74
+ // Check if change is coming
75
+ const hasChangeAhead = diff.slice(idx, idx + contextLines + 1)
76
+ .some(l => l.type !== 'context');
77
+ if (hasChangeAhead) {
78
+ output.push(` ${line.content}`);
79
+ }
80
+ }
81
+ }
82
+ else {
83
+ if (!inHunk) {
84
+ // Add context before change
85
+ const contextBefore = diff.slice(Math.max(0, idx - contextLines), idx)
86
+ .filter(l => l.type === 'context');
87
+ contextBefore.forEach(l => output.push(` ${l.content}`));
88
+ }
89
+ inHunk = true;
90
+ contextCount = 0;
91
+ if (line.type === 'add') {
92
+ output.push(`+ ${line.content}`);
93
+ }
94
+ else {
95
+ output.push(`- ${line.content}`);
96
+ }
97
+ }
98
+ }
99
+ return output.join('\n');
100
+ }
101
+ /**
102
+ * Simple line-by-line diff (O(n) memory fallback for large files)
103
+ */
104
+ export function generateSimpleDiff(oldContent, newContent) {
105
+ const oldLines = oldContent.split('\n');
106
+ const newLines = newContent.split('\n');
107
+ const diff = [];
108
+ const maxLen = Math.max(oldLines.length, newLines.length);
109
+ for (let i = 0; i < maxLen; i++) {
110
+ const oldLine = oldLines[i];
111
+ const newLine = newLines[i];
112
+ if (oldLine === newLine) {
113
+ diff.push(` ${oldLine || ''}`);
114
+ }
115
+ else {
116
+ if (oldLine !== undefined)
117
+ diff.push(`- ${oldLine}`);
118
+ if (newLine !== undefined)
119
+ diff.push(`+ ${newLine}`);
120
+ }
121
+ }
122
+ return diff.join('\n');
123
+ }
124
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/utils/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * File Lock Manager - v3.4.0
3
+ * Prevents concurrent writes to same file
4
+ */
5
+ interface LockInfo {
6
+ clientId: string;
7
+ operation: string;
8
+ timestamp: number;
9
+ timeout: NodeJS.Timeout;
10
+ }
11
+ export declare class FileLockManager {
12
+ private locks;
13
+ private readonly lockTimeout;
14
+ constructor(lockTimeoutMs?: number);
15
+ /**
16
+ * Acquire lock on file
17
+ */
18
+ acquireLock(filePath: string, clientId: string, operation: string): Promise<{
19
+ acquired: boolean;
20
+ error?: string;
21
+ lockedBy?: string;
22
+ }>;
23
+ /**
24
+ * Release lock on file
25
+ */
26
+ releaseLock(filePath: string, clientId: string): boolean;
27
+ /**
28
+ * Check if file is locked
29
+ */
30
+ isLocked(filePath: string): boolean;
31
+ /**
32
+ * Get lock info
33
+ */
34
+ getLockInfo(filePath: string): LockInfo | null;
35
+ /**
36
+ * Force release lock (admin only)
37
+ */
38
+ forceRelease(filePath: string): boolean;
39
+ /**
40
+ * Release all locks for client
41
+ */
42
+ releaseAllForClient(clientId: string): number;
43
+ /**
44
+ * Get all active locks
45
+ */
46
+ getActiveLocks(): Array<{
47
+ path: string;
48
+ info: LockInfo;
49
+ }>;
50
+ /**
51
+ * Clear all locks
52
+ */
53
+ clearAll(): void;
54
+ /**
55
+ * Normalize path for consistent comparison
56
+ */
57
+ private normalizePath;
58
+ }
59
+ /**
60
+ * Global lock manager instance
61
+ */
62
+ export declare const globalLockManager: FileLockManager;
63
+ export {};
@@ -0,0 +1,123 @@
1
+ /**
2
+ * File Lock Manager - v3.4.0
3
+ * Prevents concurrent writes to same file
4
+ */
5
+ export class FileLockManager {
6
+ locks = new Map();
7
+ lockTimeout;
8
+ constructor(lockTimeoutMs = 30000) {
9
+ this.lockTimeout = lockTimeoutMs;
10
+ }
11
+ /**
12
+ * Acquire lock on file
13
+ */
14
+ async acquireLock(filePath, clientId, operation) {
15
+ const normalizedPath = this.normalizePath(filePath);
16
+ const existingLock = this.locks.get(normalizedPath);
17
+ if (existingLock) {
18
+ return {
19
+ acquired: false,
20
+ error: `File locked by ${existingLock.operation} (client: ${existingLock.clientId})`,
21
+ lockedBy: existingLock.clientId,
22
+ };
23
+ }
24
+ // Create lock with auto-release timeout
25
+ const timeout = setTimeout(() => {
26
+ this.releaseLock(filePath, clientId);
27
+ console.warn(`⚠️ Lock auto-released for ${normalizedPath} (timeout)`);
28
+ }, this.lockTimeout);
29
+ this.locks.set(normalizedPath, {
30
+ clientId,
31
+ operation,
32
+ timestamp: Date.now(),
33
+ timeout,
34
+ });
35
+ return { acquired: true };
36
+ }
37
+ /**
38
+ * Release lock on file
39
+ */
40
+ releaseLock(filePath, clientId) {
41
+ const normalizedPath = this.normalizePath(filePath);
42
+ const lock = this.locks.get(normalizedPath);
43
+ if (!lock) {
44
+ return false; // No lock exists
45
+ }
46
+ if (lock.clientId !== clientId) {
47
+ return false; // Lock owned by different client
48
+ }
49
+ clearTimeout(lock.timeout);
50
+ this.locks.delete(normalizedPath);
51
+ return true;
52
+ }
53
+ /**
54
+ * Check if file is locked
55
+ */
56
+ isLocked(filePath) {
57
+ const normalizedPath = this.normalizePath(filePath);
58
+ return this.locks.has(normalizedPath);
59
+ }
60
+ /**
61
+ * Get lock info
62
+ */
63
+ getLockInfo(filePath) {
64
+ const normalizedPath = this.normalizePath(filePath);
65
+ return this.locks.get(normalizedPath) || null;
66
+ }
67
+ /**
68
+ * Force release lock (admin only)
69
+ */
70
+ forceRelease(filePath) {
71
+ const normalizedPath = this.normalizePath(filePath);
72
+ const lock = this.locks.get(normalizedPath);
73
+ if (lock) {
74
+ clearTimeout(lock.timeout);
75
+ this.locks.delete(normalizedPath);
76
+ return true;
77
+ }
78
+ return false;
79
+ }
80
+ /**
81
+ * Release all locks for client
82
+ */
83
+ releaseAllForClient(clientId) {
84
+ let count = 0;
85
+ for (const [path, lock] of this.locks.entries()) {
86
+ if (lock.clientId === clientId) {
87
+ clearTimeout(lock.timeout);
88
+ this.locks.delete(path);
89
+ count++;
90
+ }
91
+ }
92
+ return count;
93
+ }
94
+ /**
95
+ * Get all active locks
96
+ */
97
+ getActiveLocks() {
98
+ return Array.from(this.locks.entries()).map(([path, info]) => ({
99
+ path,
100
+ info,
101
+ }));
102
+ }
103
+ /**
104
+ * Clear all locks
105
+ */
106
+ clearAll() {
107
+ for (const lock of this.locks.values()) {
108
+ clearTimeout(lock.timeout);
109
+ }
110
+ this.locks.clear();
111
+ }
112
+ /**
113
+ * Normalize path for consistent comparison
114
+ */
115
+ normalizePath(filePath) {
116
+ return filePath.replace(/\\/g, '/').toLowerCase();
117
+ }
118
+ }
119
+ /**
120
+ * Global lock manager instance
121
+ */
122
+ export const globalLockManager = new FileLockManager();
123
+ //# sourceMappingURL=fileLock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileLock.js","sourceRoot":"","sources":["../../../src/utils/fileLock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Rate Limiter - v3.4.0
3
+ * Token bucket algorithm for DoS protection
4
+ */
5
+ interface RateLimitConfig {
6
+ maxTokens: number;
7
+ refillRate: number;
8
+ refillInterval: number;
9
+ }
10
+ export declare class RateLimiter {
11
+ private buckets;
12
+ private config;
13
+ private refillTimer;
14
+ constructor(config?: Partial<RateLimitConfig>);
15
+ /**
16
+ * Check if request is allowed
17
+ */
18
+ checkLimit(clientId: string, cost?: number): Promise<{
19
+ allowed: boolean;
20
+ retryAfter?: number;
21
+ }>;
22
+ /**
23
+ * Get current token count for client
24
+ */
25
+ getTokens(clientId: string): number;
26
+ /**
27
+ * Reset tokens for client
28
+ */
29
+ reset(clientId: string): void;
30
+ /**
31
+ * Clear all buckets
32
+ */
33
+ clearAll(): void;
34
+ /**
35
+ * Start automatic refill timer
36
+ */
37
+ private startRefillTimer;
38
+ /**
39
+ * Stop refill timer
40
+ */
41
+ stop(): void;
42
+ }
43
+ /**
44
+ * Operation costs (in tokens)
45
+ */
46
+ export declare const OPERATION_COSTS: {
47
+ readonly get_semantic_repo_map: 50;
48
+ readonly read_file_surgical: 5;
49
+ readonly analyze_impact: 20;
50
+ readonly read_file_lines: 2;
51
+ readonly search_code_pattern: 30;
52
+ readonly parse_file: 5;
53
+ readonly write_file_surgical: 10;
54
+ readonly insert_symbol: 10;
55
+ readonly remove_symbol: 10;
56
+ readonly rename_symbol: 40;
57
+ readonly rollback_file: 2;
58
+ readonly clean_backups: 2;
59
+ readonly get_server_stats: 1;
60
+ };
61
+ export {};
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Rate Limiter - v3.4.0
3
+ * Token bucket algorithm for DoS protection
4
+ */
5
+ export class RateLimiter {
6
+ buckets = new Map();
7
+ config;
8
+ refillTimer = null;
9
+ constructor(config = {}) {
10
+ this.config = {
11
+ maxTokens: config.maxTokens || 100,
12
+ refillRate: config.refillRate || 10,
13
+ refillInterval: config.refillInterval || 1000,
14
+ };
15
+ this.startRefillTimer();
16
+ }
17
+ /**
18
+ * Check if request is allowed
19
+ */
20
+ async checkLimit(clientId, cost = 1) {
21
+ let bucket = this.buckets.get(clientId);
22
+ if (!bucket) {
23
+ bucket = {
24
+ tokens: this.config.maxTokens,
25
+ lastRefill: Date.now(),
26
+ };
27
+ this.buckets.set(clientId, bucket);
28
+ }
29
+ // Refill tokens based on time elapsed
30
+ const now = Date.now();
31
+ const elapsed = now - bucket.lastRefill;
32
+ const tokensToAdd = Math.floor((elapsed / 1000) * this.config.refillRate);
33
+ if (tokensToAdd > 0) {
34
+ bucket.tokens = Math.min(this.config.maxTokens, bucket.tokens + tokensToAdd);
35
+ bucket.lastRefill = now;
36
+ }
37
+ // Check if enough tokens
38
+ if (bucket.tokens >= cost) {
39
+ bucket.tokens -= cost;
40
+ return { allowed: true };
41
+ }
42
+ // Calculate retry after
43
+ const tokensNeeded = cost - bucket.tokens;
44
+ const retryAfter = Math.ceil((tokensNeeded / this.config.refillRate) * 1000);
45
+ return { allowed: false, retryAfter };
46
+ }
47
+ /**
48
+ * Get current token count for client
49
+ */
50
+ getTokens(clientId) {
51
+ const bucket = this.buckets.get(clientId);
52
+ return bucket ? bucket.tokens : this.config.maxTokens;
53
+ }
54
+ /**
55
+ * Reset tokens for client
56
+ */
57
+ reset(clientId) {
58
+ this.buckets.delete(clientId);
59
+ }
60
+ /**
61
+ * Clear all buckets
62
+ */
63
+ clearAll() {
64
+ this.buckets.clear();
65
+ }
66
+ /**
67
+ * Start automatic refill timer
68
+ */
69
+ startRefillTimer() {
70
+ this.refillTimer = setInterval(() => {
71
+ const now = Date.now();
72
+ for (const [clientId, bucket] of this.buckets.entries()) {
73
+ const elapsed = now - bucket.lastRefill;
74
+ const tokensToAdd = Math.floor((elapsed / 1000) * this.config.refillRate);
75
+ if (tokensToAdd > 0) {
76
+ bucket.tokens = Math.min(this.config.maxTokens, bucket.tokens + tokensToAdd);
77
+ bucket.lastRefill = now;
78
+ }
79
+ // Cleanup inactive clients (no activity for 5 minutes)
80
+ if (elapsed > 5 * 60 * 1000 && bucket.tokens === this.config.maxTokens) {
81
+ this.buckets.delete(clientId);
82
+ }
83
+ }
84
+ }, this.config.refillInterval);
85
+ }
86
+ /**
87
+ * Stop refill timer
88
+ */
89
+ stop() {
90
+ if (this.refillTimer) {
91
+ clearInterval(this.refillTimer);
92
+ this.refillTimer = null;
93
+ }
94
+ }
95
+ }
96
+ /**
97
+ * Operation costs (in tokens)
98
+ */
99
+ export const OPERATION_COSTS = {
100
+ get_semantic_repo_map: 50, // Expensive — full repo walk
101
+ read_file_surgical: 5,
102
+ analyze_impact: 20,
103
+ read_file_lines: 2,
104
+ search_code_pattern: 30,
105
+ parse_file: 5,
106
+ write_file_surgical: 10,
107
+ insert_symbol: 10,
108
+ remove_symbol: 10,
109
+ rename_symbol: 40, // Very expensive (cross-file)
110
+ rollback_file: 2,
111
+ clean_backups: 2,
112
+ get_server_stats: 1,
113
+ };
114
+ //# sourceMappingURL=rateLimiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rateLimiter.js","sourceRoot":"","sources":["../../../src/utils/rateLimiter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Safe Regex - v3.4.0
3
+ * Regex execution with timeout to prevent ReDoS
4
+ */
5
+ export interface RegexResult {
6
+ success: boolean;
7
+ matches?: RegExpMatchArray | null;
8
+ error?: string;
9
+ timedOut?: boolean;
10
+ }
11
+ /**
12
+ * Execute regex with timeout protection
13
+ */
14
+ export declare function safeRegexTest(pattern: string | RegExp, input: string, timeoutMs?: number): Promise<{
15
+ success: boolean;
16
+ matched: boolean;
17
+ error?: string;
18
+ timedOut?: boolean;
19
+ }>;
20
+ /**
21
+ * Execute regex match with timeout protection
22
+ */
23
+ export declare function safeRegexMatch(pattern: string | RegExp, input: string, timeoutMs?: number): Promise<RegexResult>;
24
+ /**
25
+ * Validate regex pattern for safety
26
+ */
27
+ export declare function validateRegexPattern(pattern: string): {
28
+ safe: boolean;
29
+ issues: string[];
30
+ };
31
+ /**
32
+ * Sanitize regex pattern (escape metacharacters)
33
+ */
34
+ export declare function sanitizeRegexPattern(input: string): string;
35
+ /**
36
+ * Create safe regex with validation
37
+ */
38
+ export declare function createSafeRegex(pattern: string, flags?: string): {
39
+ regex: RegExp | null;
40
+ error?: string;
41
+ };