mcp-code-context 3.0.6 → 3.4.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.
- package/CHANGELOG.md +84 -1
- package/CHANGELOG_v3.2.0.md +196 -0
- package/CHANGELOG_v3.3.0.md +266 -0
- package/README.md +1 -1
- package/SECURITY.md +177 -0
- package/dist/src/core/engine.d.ts +2 -2
- package/dist/src/core/engine.js +24 -8
- package/dist/src/core/engine.js.map +1 -1
- package/dist/src/core/validator.d.ts +2 -2
- package/dist/src/core/validator.js +8 -7
- package/dist/src/core/validator.js.map +1 -1
- package/dist/src/index.d.ts +6 -6
- package/dist/src/index.js +499 -158
- package/dist/src/index.js.map +1 -1
- package/dist/src/operations/compress.d.ts +18 -0
- package/dist/src/operations/compress.js +89 -0
- package/dist/src/operations/compress.js.map +1 -0
- package/dist/src/operations/confirmationStore.d.ts +53 -0
- package/dist/src/operations/confirmationStore.js +91 -0
- package/dist/src/operations/confirmationStore.js.map +1 -0
- package/dist/src/operations/read.d.ts +50 -0
- package/dist/src/operations/read.js +228 -0
- package/dist/src/operations/read.js.map +1 -0
- package/dist/src/operations/write.d.ts +16 -4
- package/dist/src/operations/write.js +142 -48
- package/dist/src/operations/write.js.map +1 -1
- package/dist/src/parsers/base.d.ts +7 -2
- package/dist/src/parsers/base.js +18 -1
- package/dist/src/parsers/base.js.map +1 -1
- package/dist/src/parsers/dartTreeSitter.d.ts +3 -3
- package/dist/src/parsers/dartTreeSitter.js +6 -11
- package/dist/src/parsers/dartTreeSitter.js.map +1 -1
- package/dist/src/parsers/php.d.ts +2 -2
- package/dist/src/parsers/php.js +5 -10
- package/dist/src/parsers/php.js.map +1 -1
- package/dist/src/parsers/python.d.ts +2 -2
- package/dist/src/parsers/python.js +5 -10
- package/dist/src/parsers/python.js.map +1 -1
- package/dist/src/parsers/registry.d.ts +1 -1
- package/dist/src/parsers/registry.js +2 -2
- package/dist/src/parsers/registry.js.map +1 -1
- package/dist/src/parsers/typescript.d.ts +2 -2
- package/dist/src/parsers/typescript.js +8 -13
- package/dist/src/parsers/typescript.js.map +1 -1
- package/dist/src/utils/auditLogger.d.ts +90 -0
- package/dist/src/utils/auditLogger.js +271 -0
- package/dist/src/utils/auditLogger.js.map +1 -0
- package/dist/src/utils/backupManager.d.ts +33 -0
- package/dist/src/utils/backupManager.js +130 -0
- package/dist/src/utils/backupManager.js.map +1 -0
- package/dist/src/utils/constants.d.ts +12 -0
- package/dist/src/utils/constants.js +33 -0
- package/dist/src/utils/constants.js.map +1 -0
- package/dist/src/utils/diff.d.ts +13 -0
- package/dist/src/utils/diff.js +124 -0
- package/dist/src/utils/diff.js.map +1 -0
- package/dist/src/utils/fileLock.d.ts +63 -0
- package/dist/src/utils/fileLock.js +123 -0
- package/dist/src/utils/fileLock.js.map +1 -0
- package/dist/src/utils/rateLimiter.d.ts +61 -0
- package/dist/src/utils/rateLimiter.js +114 -0
- package/dist/src/utils/rateLimiter.js.map +1 -0
- package/dist/src/utils/safeRegex.d.ts +41 -0
- package/dist/src/utils/safeRegex.js +137 -0
- package/dist/src/utils/safeRegex.js.map +1 -0
- package/dist/src/utils/streaming.d.ts +43 -0
- package/dist/src/utils/streaming.js +175 -0
- package/dist/src/utils/streaming.js.map +1 -0
- package/dist/src/utils/telemetry.d.ts +91 -0
- package/dist/src/utils/telemetry.js +185 -0
- package/dist/src/utils/telemetry.js.map +1 -0
- package/llms.txt +46 -28
- package/package.json +5 -5
- package/scripts/replace-version.js +59 -0
- package/mcp-code-context-3.0.2.tgz +0 -0
- 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.1
|
|
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.1
|
|
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.1
|
|
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.1
|
|
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.1
|
|
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.1
|
|
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.1
|
|
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.1
|
|
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.1
|
|
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
|
+
};
|