@j0hanz/filesystem-context-mcp 1.0.9 → 1.1.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.
- package/README.md +20 -5
- package/dist/__tests__/schemas/validators.test.js +32 -5
- package/dist/__tests__/schemas/validators.test.js.map +1 -1
- package/dist/config/types.d.ts +28 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/constants.d.ts +7 -7
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +24 -37
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/directory-helpers.d.ts +1 -2
- package/dist/lib/directory-helpers.d.ts.map +1 -1
- package/dist/lib/directory-helpers.js +2 -5
- package/dist/lib/directory-helpers.js.map +1 -1
- package/dist/lib/errors.d.ts +2 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +22 -33
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/file-operations.d.ts +2 -1
- package/dist/lib/file-operations.d.ts.map +1 -1
- package/dist/lib/file-operations.js +249 -146
- package/dist/lib/file-operations.js.map +1 -1
- package/dist/lib/formatters.d.ts +1 -12
- package/dist/lib/formatters.d.ts.map +1 -1
- package/dist/lib/formatters.js +11 -14
- package/dist/lib/formatters.js.map +1 -1
- package/dist/lib/fs-helpers.d.ts.map +1 -1
- package/dist/lib/fs-helpers.js +41 -66
- package/dist/lib/fs-helpers.js.map +1 -1
- package/dist/lib/image-parsing.d.ts.map +1 -1
- package/dist/lib/image-parsing.js +27 -19
- package/dist/lib/image-parsing.js.map +1 -1
- package/dist/lib/mcp-logger.d.ts.map +1 -1
- package/dist/lib/mcp-logger.js +16 -12
- package/dist/lib/mcp-logger.js.map +1 -1
- package/dist/lib/path-utils.d.ts.map +1 -1
- package/dist/lib/path-utils.js +0 -2
- package/dist/lib/path-utils.js.map +1 -1
- package/dist/lib/path-validation.d.ts.map +1 -1
- package/dist/lib/path-validation.js +45 -24
- package/dist/lib/path-validation.js.map +1 -1
- package/dist/lib/search-helpers.d.ts +3 -0
- package/dist/lib/search-helpers.d.ts.map +1 -1
- package/dist/lib/search-helpers.js +44 -56
- package/dist/lib/search-helpers.js.map +1 -1
- package/dist/schemas/inputs.d.ts +3 -2
- package/dist/schemas/inputs.d.ts.map +1 -1
- package/dist/schemas/inputs.js +22 -4
- package/dist/schemas/inputs.js.map +1 -1
- package/dist/schemas/outputs.d.ts +31 -12
- package/dist/schemas/outputs.d.ts.map +1 -1
- package/dist/schemas/outputs.js +16 -0
- package/dist/schemas/outputs.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +39 -17
- package/dist/server.js.map +1 -1
- package/dist/tools/analyze-directory.d.ts.map +1 -1
- package/dist/tools/analyze-directory.js +6 -6
- package/dist/tools/analyze-directory.js.map +1 -1
- package/dist/tools/list-allowed-dirs.d.ts.map +1 -1
- package/dist/tools/list-allowed-dirs.js +20 -1
- package/dist/tools/list-allowed-dirs.js.map +1 -1
- package/dist/tools/list-directory.d.ts.map +1 -1
- package/dist/tools/list-directory.js +11 -3
- package/dist/tools/list-directory.js.map +1 -1
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +7 -4
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/read-multiple-files.d.ts.map +1 -1
- package/dist/tools/read-multiple-files.js +4 -4
- package/dist/tools/read-multiple-files.js.map +1 -1
- package/dist/tools/search-content.d.ts.map +1 -1
- package/dist/tools/search-content.js +5 -10
- package/dist/tools/search-content.js.map +1 -1
- package/dist/tools/search-files.d.ts.map +1 -1
- package/dist/tools/search-files.js +6 -5
- package/dist/tools/search-files.js.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-validation.d.ts","sourceRoot":"","sources":["../../src/lib/path-validation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"path-validation.d.ts","sourceRoot":"","sources":["../../src/lib/path-validation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAM/D,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAG1D;AAED,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAoKD,wBAAsB,4BAA4B,CAChD,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,oBAAoB,CAAC,CAE/B;AAED,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,IAAI,EAAE,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CA8BnB"}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
// Path validation and security module - the SECURITY BOUNDARY of this server.
|
|
2
|
-
// All filesystem operations MUST call validateExistingPath() before accessing any path.
|
|
3
1
|
import * as fs from 'node:fs/promises';
|
|
4
2
|
import { fileURLToPath } from 'node:url';
|
|
5
3
|
import { ErrorCode, McpError } from './errors.js';
|
|
@@ -20,15 +18,51 @@ function isPathWithinAllowedDirectories(normalizedPath) {
|
|
|
20
18
|
const candidate = normalizeForComparison(normalizedPath);
|
|
21
19
|
return allowedDirectories.some((allowedDir) => {
|
|
22
20
|
const allowed = normalizeForComparison(allowedDir);
|
|
23
|
-
// Exact match or is a child path
|
|
24
21
|
return (candidate === allowed || candidate.startsWith(allowed + PATH_SEPARATOR));
|
|
25
22
|
});
|
|
26
23
|
}
|
|
24
|
+
const RESERVED_DEVICE_NAMES = new Set([
|
|
25
|
+
'CON',
|
|
26
|
+
'PRN',
|
|
27
|
+
'AUX',
|
|
28
|
+
'NUL',
|
|
29
|
+
'COM1',
|
|
30
|
+
'COM2',
|
|
31
|
+
'COM3',
|
|
32
|
+
'COM4',
|
|
33
|
+
'COM5',
|
|
34
|
+
'COM6',
|
|
35
|
+
'COM7',
|
|
36
|
+
'COM8',
|
|
37
|
+
'COM9',
|
|
38
|
+
'LPT1',
|
|
39
|
+
'LPT2',
|
|
40
|
+
'LPT3',
|
|
41
|
+
'LPT4',
|
|
42
|
+
'LPT5',
|
|
43
|
+
'LPT6',
|
|
44
|
+
'LPT7',
|
|
45
|
+
'LPT8',
|
|
46
|
+
'LPT9',
|
|
47
|
+
]);
|
|
27
48
|
async function validateExistingPathDetailsInternal(requestedPath) {
|
|
28
|
-
// Validate input is not empty or only whitespace
|
|
29
49
|
if (!requestedPath || requestedPath.trim().length === 0) {
|
|
30
50
|
throw new McpError(ErrorCode.E_INVALID_INPUT, 'Path cannot be empty or whitespace', requestedPath);
|
|
31
51
|
}
|
|
52
|
+
// Check for null bytes (path truncation attack prevention)
|
|
53
|
+
if (requestedPath.includes('\0')) {
|
|
54
|
+
throw new McpError(ErrorCode.E_INVALID_INPUT, 'Path contains null bytes', requestedPath);
|
|
55
|
+
}
|
|
56
|
+
// Check for Windows reserved device names
|
|
57
|
+
if (process.platform === 'win32') {
|
|
58
|
+
const segments = requestedPath.split(/[\\/]/);
|
|
59
|
+
for (const segment of segments) {
|
|
60
|
+
const baseName = segment.split('.')[0]?.toUpperCase();
|
|
61
|
+
if (baseName && RESERVED_DEVICE_NAMES.has(baseName)) {
|
|
62
|
+
throw new McpError(ErrorCode.E_INVALID_INPUT, `Windows reserved device name not allowed: ${baseName}`, requestedPath);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
32
66
|
const normalizedRequested = normalizePath(requestedPath);
|
|
33
67
|
if (!isPathWithinAllowedDirectories(normalizedRequested)) {
|
|
34
68
|
throw new McpError(ErrorCode.E_ACCESS_DENIED, `Access denied: Path '${requestedPath}' is outside allowed directories`, requestedPath, { normalizedPath: normalizedRequested });
|
|
@@ -38,7 +72,6 @@ async function validateExistingPathDetailsInternal(requestedPath) {
|
|
|
38
72
|
realPath = await fs.realpath(normalizedRequested);
|
|
39
73
|
}
|
|
40
74
|
catch (error) {
|
|
41
|
-
// Distinguish between different error types for better error messages
|
|
42
75
|
const nodeError = error;
|
|
43
76
|
if (nodeError.code === 'ENOENT') {
|
|
44
77
|
throw new McpError(ErrorCode.E_NOT_FOUND, `Path does not exist: ${requestedPath}`, requestedPath, { originalCode: nodeError.code }, error);
|
|
@@ -47,30 +80,22 @@ async function validateExistingPathDetailsInternal(requestedPath) {
|
|
|
47
80
|
throw new McpError(ErrorCode.E_PERMISSION_DENIED, `Permission denied accessing path: ${requestedPath}`, requestedPath, { originalCode: nodeError.code }, error);
|
|
48
81
|
}
|
|
49
82
|
if (nodeError.code === 'ELOOP') {
|
|
50
|
-
throw new McpError(ErrorCode.E_SYMLINK_NOT_ALLOWED, `Too many symbolic links in path: ${requestedPath}`, requestedPath, { originalCode: nodeError.code }, error);
|
|
83
|
+
throw new McpError(ErrorCode.E_SYMLINK_NOT_ALLOWED, `Too many symbolic links in path (possible circular reference): ${requestedPath}`, requestedPath, { originalCode: nodeError.code }, error);
|
|
51
84
|
}
|
|
52
85
|
if (nodeError.code === 'ENAMETOOLONG') {
|
|
53
86
|
throw new McpError(ErrorCode.E_INVALID_INPUT, `Path name too long: ${requestedPath}`, requestedPath, { originalCode: nodeError.code }, error);
|
|
54
87
|
}
|
|
55
|
-
// Generic fallback for other errors
|
|
56
88
|
throw new McpError(ErrorCode.E_NOT_FOUND, `Path is not accessible: ${requestedPath}`, requestedPath, { originalCode: nodeError.code, originalMessage: nodeError.message }, error);
|
|
57
89
|
}
|
|
58
90
|
const normalizedReal = normalizePath(realPath);
|
|
59
91
|
if (!isPathWithinAllowedDirectories(normalizedReal)) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
try {
|
|
66
|
-
const lstats = await fs.lstat(normalizedRequested);
|
|
67
|
-
isSymlink = lstats.isSymbolicLink();
|
|
68
|
-
}
|
|
69
|
-
catch {
|
|
70
|
-
// If lstat fails but realpath succeeded, treat as non-symlink.
|
|
71
|
-
// This can happen on some platforms/filesystems; safe default.
|
|
72
|
-
isSymlink = false;
|
|
92
|
+
const allowedDirs = getAllowedDirectories();
|
|
93
|
+
const suggestion = allowedDirs.length > 0
|
|
94
|
+
? `Allowed directories:\n${allowedDirs.map((d) => ` - ${d}`).join('\n')}`
|
|
95
|
+
: 'No allowed directories configured. Use CLI arguments or MCP roots protocol.';
|
|
96
|
+
throw new McpError(ErrorCode.E_ACCESS_DENIED, `Access denied: Path '${requestedPath}' is outside allowed directories.\n\n${suggestion}`, requestedPath, { resolvedPath: realPath, normalizedResolvedPath: normalizedReal });
|
|
73
97
|
}
|
|
98
|
+
const isSymlink = normalizedRequested !== normalizedReal;
|
|
74
99
|
return {
|
|
75
100
|
requestedPath: normalizedRequested,
|
|
76
101
|
resolvedPath: normalizedReal,
|
|
@@ -84,21 +109,17 @@ export async function validateExistingPath(requestedPath) {
|
|
|
84
109
|
const details = await validateExistingPathDetailsInternal(requestedPath);
|
|
85
110
|
return details.resolvedPath;
|
|
86
111
|
}
|
|
87
|
-
// Extract valid directory paths from MCP Root objects (file:// URIs only)
|
|
88
112
|
export async function getValidRootDirectories(roots) {
|
|
89
113
|
const validDirs = [];
|
|
90
114
|
for (const root of roots) {
|
|
91
|
-
// Only accept file:// URIs
|
|
92
115
|
if (!root.uri.startsWith('file://')) {
|
|
93
116
|
continue;
|
|
94
117
|
}
|
|
95
118
|
try {
|
|
96
119
|
const dirPath = fileURLToPath(root.uri);
|
|
97
120
|
const normalizedPath = normalizePath(dirPath);
|
|
98
|
-
// Verify the directory exists and is accessible
|
|
99
121
|
const stats = await fs.stat(normalizedPath);
|
|
100
122
|
if (stats.isDirectory()) {
|
|
101
|
-
// Resolve symlinks to get the real path
|
|
102
123
|
try {
|
|
103
124
|
const realPath = await fs.realpath(normalizedPath);
|
|
104
125
|
validDirs.push(normalizePath(realPath));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-validation.js","sourceRoot":"","sources":["../../src/lib/path-validation.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"path-validation.js","sourceRoot":"","sources":["../../src/lib/path-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,5 +9,8 @@ export declare function scanFileForContent(filePath: string, regex: RegExp, opti
|
|
|
9
9
|
contextLines: number;
|
|
10
10
|
deadlineMs?: number;
|
|
11
11
|
currentMatchCount: number;
|
|
12
|
+
isLiteral?: boolean;
|
|
13
|
+
searchString?: string;
|
|
14
|
+
caseSensitive?: boolean;
|
|
12
15
|
}): Promise<ScanFileResult>;
|
|
13
16
|
//# sourceMappingURL=search-helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-helpers.d.ts","sourceRoot":"","sources":["../../src/lib/search-helpers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"search-helpers.d.ts","sourceRoot":"","sources":["../../src/lib/search-helpers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,cAAc,EACf,MAAM,oBAAoB,CAAC;AA4E5B,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAuB5D;AAsBD,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GACpD,MAAM,CAYR;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IACP,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GACA,OAAO,CAAC,cAAc,CAAC,CAkFzB"}
|
|
@@ -1,63 +1,51 @@
|
|
|
1
1
|
import * as readline from 'node:readline';
|
|
2
2
|
import { createReadStream } from 'node:fs';
|
|
3
3
|
import { MAX_LINE_CONTENT_LENGTH, REGEX_MATCH_TIMEOUT_MS, } from './constants.js';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
count = 0;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
push(line) {
|
|
15
|
-
this.buffer[this.writeIndex] = line;
|
|
16
|
-
this.writeIndex = (this.writeIndex + 1) % this.capacity;
|
|
17
|
-
if (this.count < this.capacity)
|
|
18
|
-
this.count++;
|
|
19
|
-
}
|
|
20
|
-
toArray() {
|
|
21
|
-
if (this.count === 0)
|
|
22
|
-
return [];
|
|
23
|
-
if (this.count < this.capacity) {
|
|
24
|
-
return this.buffer.slice(0, this.count);
|
|
25
|
-
}
|
|
26
|
-
// Buffer is full - return in correct order starting from writeIndex
|
|
27
|
-
return [
|
|
28
|
-
...this.buffer.slice(this.writeIndex),
|
|
29
|
-
...this.buffer.slice(0, this.writeIndex),
|
|
30
|
-
];
|
|
31
|
-
}
|
|
32
|
-
clear() {
|
|
33
|
-
this.count = 0;
|
|
34
|
-
this.writeIndex = 0;
|
|
4
|
+
function countLiteralMatches(line, searchString, caseSensitive) {
|
|
5
|
+
if (line.length === 0 || searchString.length === 0)
|
|
6
|
+
return 0;
|
|
7
|
+
const haystack = caseSensitive ? line : line.toLowerCase();
|
|
8
|
+
const needle = caseSensitive ? searchString : searchString.toLowerCase();
|
|
9
|
+
let count = 0;
|
|
10
|
+
let pos = 0;
|
|
11
|
+
while ((pos = haystack.indexOf(needle, pos)) !== -1) {
|
|
12
|
+
count++;
|
|
13
|
+
pos += needle.length;
|
|
35
14
|
}
|
|
15
|
+
return count;
|
|
36
16
|
}
|
|
37
|
-
// Count regex matches with timeout protection (returns -1 on timeout)
|
|
38
17
|
function countRegexMatches(line, regex, timeoutMs = REGEX_MATCH_TIMEOUT_MS) {
|
|
39
|
-
// Safety check for empty line
|
|
40
18
|
if (line.length === 0)
|
|
41
19
|
return 0;
|
|
42
20
|
regex.lastIndex = 0;
|
|
43
21
|
let count = 0;
|
|
44
22
|
const deadline = Date.now() + timeoutMs;
|
|
45
|
-
const maxIterations = line.length * 2;
|
|
23
|
+
const maxIterations = Math.min(line.length * 2, 10000);
|
|
46
24
|
let iterations = 0;
|
|
25
|
+
let lastIndex = 0;
|
|
47
26
|
let match;
|
|
48
27
|
while ((match = regex.exec(line)) !== null) {
|
|
49
28
|
count++;
|
|
50
29
|
iterations++;
|
|
51
|
-
// Prevent infinite loops on zero-width matches
|
|
52
30
|
if (match[0] === '') {
|
|
31
|
+
const { lastIndex: newIndex } = regex;
|
|
53
32
|
regex.lastIndex++;
|
|
54
|
-
|
|
33
|
+
lastIndex = newIndex + 1;
|
|
55
34
|
if (regex.lastIndex > line.length)
|
|
56
35
|
break;
|
|
57
36
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
37
|
+
else {
|
|
38
|
+
const { lastIndex: currentIndex } = regex;
|
|
39
|
+
// Detect if regex is stuck (lastIndex not advancing)
|
|
40
|
+
if (currentIndex === lastIndex) {
|
|
41
|
+
return -1; // Regex not making progress
|
|
42
|
+
}
|
|
43
|
+
lastIndex = currentIndex;
|
|
44
|
+
}
|
|
45
|
+
const shouldCheckTimeout = (count > 0 && count % 10 === 0) ||
|
|
46
|
+
(iterations > 0 && iterations % 50 === 0);
|
|
47
|
+
if (shouldCheckTimeout && Date.now() > deadline) {
|
|
48
|
+
return -1;
|
|
61
49
|
}
|
|
62
50
|
// Safety check for runaway regex
|
|
63
51
|
if (iterations > maxIterations) {
|
|
@@ -66,18 +54,14 @@ function countRegexMatches(line, regex, timeoutMs = REGEX_MATCH_TIMEOUT_MS) {
|
|
|
66
54
|
}
|
|
67
55
|
return count;
|
|
68
56
|
}
|
|
69
|
-
// Check if regex is simple enough to be safe without full ReDoS check
|
|
70
57
|
export function isSimpleSafePattern(pattern) {
|
|
71
|
-
// Validate input
|
|
72
58
|
if (typeof pattern !== 'string' || pattern.length === 0) {
|
|
73
59
|
return false;
|
|
74
60
|
}
|
|
75
|
-
// Patterns with nested quantifiers are the main ReDoS concern
|
|
76
61
|
const nestedQuantifierPattern = /[+*?}]\s*\)\s*[+*?{]/;
|
|
77
62
|
if (nestedQuantifierPattern.test(pattern)) {
|
|
78
63
|
return false;
|
|
79
64
|
}
|
|
80
|
-
// Check for high repetition counts that safe-regex2 would flag (default limit is 25)
|
|
81
65
|
const highRepetitionPattern = /\{(\d+)(?:,\d*)?\}/g;
|
|
82
66
|
let match;
|
|
83
67
|
while ((match = highRepetitionPattern.exec(pattern)) !== null) {
|
|
@@ -85,14 +69,12 @@ export function isSimpleSafePattern(pattern) {
|
|
|
85
69
|
if (countStr === undefined)
|
|
86
70
|
continue;
|
|
87
71
|
const count = parseInt(countStr, 10);
|
|
88
|
-
// Check for NaN and high values
|
|
89
72
|
if (Number.isNaN(count) || count >= 25) {
|
|
90
73
|
return false;
|
|
91
74
|
}
|
|
92
75
|
}
|
|
93
76
|
return true;
|
|
94
77
|
}
|
|
95
|
-
// Process pending matches to add context-after lines
|
|
96
78
|
function updatePendingMatches(pendingMatches, trimmedLine) {
|
|
97
79
|
for (const pending of pendingMatches) {
|
|
98
80
|
if (pending.afterNeeded > 0) {
|
|
@@ -101,16 +83,13 @@ function updatePendingMatches(pendingMatches, trimmedLine) {
|
|
|
101
83
|
pending.afterNeeded--;
|
|
102
84
|
}
|
|
103
85
|
}
|
|
104
|
-
// Remove completed pending matches from the front
|
|
105
86
|
while (pendingMatches.length > 0 && pendingMatches[0]?.afterNeeded === 0) {
|
|
106
87
|
pendingMatches.shift();
|
|
107
88
|
}
|
|
108
89
|
}
|
|
109
|
-
// Trim and truncate line content for storage
|
|
110
90
|
function prepareTrimmedLine(line) {
|
|
111
91
|
return line.trim().substring(0, MAX_LINE_CONTENT_LENGTH);
|
|
112
92
|
}
|
|
113
|
-
// Prepare final search pattern with optional literal escaping and word boundaries
|
|
114
93
|
export function prepareSearchPattern(searchPattern, options) {
|
|
115
94
|
let finalPattern = searchPattern;
|
|
116
95
|
if (options.isLiteral) {
|
|
@@ -122,7 +101,7 @@ export function prepareSearchPattern(searchPattern, options) {
|
|
|
122
101
|
return finalPattern;
|
|
123
102
|
}
|
|
124
103
|
export async function scanFileForContent(filePath, regex, options) {
|
|
125
|
-
const { maxResults, contextLines, deadlineMs, currentMatchCount } = options;
|
|
104
|
+
const { maxResults, contextLines, deadlineMs, currentMatchCount, isLiteral, searchString, caseSensitive, } = options;
|
|
126
105
|
const matches = [];
|
|
127
106
|
let linesSkippedDueToRegexTimeout = 0;
|
|
128
107
|
let fileHadMatches = false;
|
|
@@ -132,7 +111,7 @@ export async function scanFileForContent(filePath, regex, options) {
|
|
|
132
111
|
crlfDelay: Infinity,
|
|
133
112
|
});
|
|
134
113
|
let lineNumber = 0;
|
|
135
|
-
const
|
|
114
|
+
const contextBuffer = [];
|
|
136
115
|
const pendingMatches = [];
|
|
137
116
|
try {
|
|
138
117
|
for await (const line of rl) {
|
|
@@ -143,10 +122,16 @@ export async function scanFileForContent(filePath, regex, options) {
|
|
|
143
122
|
break;
|
|
144
123
|
const trimmedLine = prepareTrimmedLine(line);
|
|
145
124
|
updatePendingMatches(pendingMatches, trimmedLine);
|
|
146
|
-
const matchCount =
|
|
125
|
+
const matchCount = isLiteral && searchString
|
|
126
|
+
? countLiteralMatches(line, searchString, caseSensitive ?? false)
|
|
127
|
+
: countRegexMatches(line, regex);
|
|
147
128
|
if (matchCount < 0) {
|
|
148
129
|
linesSkippedDueToRegexTimeout++;
|
|
149
|
-
|
|
130
|
+
if (contextLines > 0) {
|
|
131
|
+
contextBuffer.push(trimmedLine);
|
|
132
|
+
if (contextBuffer.length > contextLines)
|
|
133
|
+
contextBuffer.shift();
|
|
134
|
+
}
|
|
150
135
|
continue;
|
|
151
136
|
}
|
|
152
137
|
if (matchCount > 0) {
|
|
@@ -157,9 +142,8 @@ export async function scanFileForContent(filePath, regex, options) {
|
|
|
157
142
|
content: trimmedLine,
|
|
158
143
|
matchCount,
|
|
159
144
|
};
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
newMatch.contextBefore = contextBefore;
|
|
145
|
+
if (contextBuffer.length > 0) {
|
|
146
|
+
newMatch.contextBefore = [...contextBuffer];
|
|
163
147
|
}
|
|
164
148
|
matches.push(newMatch);
|
|
165
149
|
if (contextLines > 0) {
|
|
@@ -169,7 +153,11 @@ export async function scanFileForContent(filePath, regex, options) {
|
|
|
169
153
|
});
|
|
170
154
|
}
|
|
171
155
|
}
|
|
172
|
-
|
|
156
|
+
if (contextLines > 0) {
|
|
157
|
+
contextBuffer.push(trimmedLine);
|
|
158
|
+
if (contextBuffer.length > contextLines)
|
|
159
|
+
contextBuffer.shift();
|
|
160
|
+
}
|
|
173
161
|
}
|
|
174
162
|
}
|
|
175
163
|
finally {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-helpers.js","sourceRoot":"","sources":["../../src/lib/search-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"search-helpers.js","sourceRoot":"","sources":["../../src/lib/search-helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/schemas/inputs.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export declare const ListDirectoryInputSchema: {
|
|
|
11
11
|
export declare const SearchFilesInputSchema: {
|
|
12
12
|
path: z.ZodString;
|
|
13
13
|
pattern: z.ZodEffects<z.ZodString, string, string>;
|
|
14
|
-
excludePatterns: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
14
|
+
excludePatterns: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>>;
|
|
15
15
|
maxResults: z.ZodOptional<z.ZodNumber>;
|
|
16
16
|
sortBy: z.ZodDefault<z.ZodOptional<z.ZodEnum<["name", "size", "modified", "path"]>>>;
|
|
17
17
|
maxDepth: z.ZodOptional<z.ZodNumber>;
|
|
@@ -29,6 +29,7 @@ export declare const ReadMultipleFilesInputSchema: {
|
|
|
29
29
|
paths: z.ZodArray<z.ZodString, "many">;
|
|
30
30
|
encoding: z.ZodDefault<z.ZodOptional<z.ZodEnum<["utf-8", "utf8", "ascii", "base64", "hex", "latin1"]>>>;
|
|
31
31
|
maxSize: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
32
|
+
maxTotalSize: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
32
33
|
head: z.ZodOptional<z.ZodNumber>;
|
|
33
34
|
tail: z.ZodOptional<z.ZodNumber>;
|
|
34
35
|
};
|
|
@@ -39,7 +40,7 @@ export declare const SearchContentInputSchema: {
|
|
|
39
40
|
path: z.ZodString;
|
|
40
41
|
pattern: z.ZodString;
|
|
41
42
|
filePattern: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
42
|
-
excludePatterns: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
43
|
+
excludePatterns: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>>;
|
|
43
44
|
caseSensitive: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
44
45
|
maxResults: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
45
46
|
maxFileSize: z.ZodOptional<z.ZodNumber>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inputs.d.ts","sourceRoot":"","sources":["../../src/schemas/inputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,wBAAwB;;;;;;;;
|
|
1
|
+
{"version":3,"file":"inputs.d.ts","sourceRoot":"","sources":["../../src/schemas/inputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,wBAAwB;;;;;;;;CA4CpC,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;CA6DlC,CAAC;AA2DF,eAAO,MAAM,mBAAmB;;;;;;;;CAA2B,CAAC;AAgD5D,eAAO,MAAM,4BAA4B;;;;;;;CAAoC,CAAC;AAE9E,eAAO,MAAM,sBAAsB;;CAKlC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;CA+FpC,CAAC;AAEF,eAAO,MAAM,2BAA2B;;;;;;CAgCvC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;;;;CAoCpC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;CAapC,CAAC"}
|
package/dist/schemas/inputs.js
CHANGED
|
@@ -22,7 +22,7 @@ export const ListDirectoryInputSchema = {
|
|
|
22
22
|
.max(100, 'maxDepth cannot exceed 100')
|
|
23
23
|
.optional()
|
|
24
24
|
.default(DEFAULT_MAX_DEPTH)
|
|
25
|
-
.describe('Maximum depth for recursive listing'),
|
|
25
|
+
.describe('Maximum depth for recursive listing (higher values may impact performance)'),
|
|
26
26
|
maxEntries: z
|
|
27
27
|
.number()
|
|
28
28
|
.int('maxEntries must be an integer')
|
|
@@ -65,7 +65,12 @@ export const SearchFilesInputSchema = {
|
|
|
65
65
|
}, { message: 'Invalid glob pattern syntax' })
|
|
66
66
|
.describe('Glob pattern to match files. Examples: "**/*.ts" (all TypeScript files), "src/**/*.js" (JS files in src), "*.json" (JSON files in current dir)'),
|
|
67
67
|
excludePatterns: z
|
|
68
|
-
.array(z
|
|
68
|
+
.array(z
|
|
69
|
+
.string()
|
|
70
|
+
.max(500, 'Individual exclude pattern is too long')
|
|
71
|
+
.refine((val) => !val.includes('**/**/**'), {
|
|
72
|
+
message: 'Pattern too deeply nested (max 2 levels of **)',
|
|
73
|
+
}))
|
|
69
74
|
.max(100, 'Too many exclude patterns (max 100)')
|
|
70
75
|
.optional()
|
|
71
76
|
.default([])
|
|
@@ -88,7 +93,7 @@ export const SearchFilesInputSchema = {
|
|
|
88
93
|
.min(1, 'maxDepth must be at least 1')
|
|
89
94
|
.max(100, 'maxDepth cannot exceed 100')
|
|
90
95
|
.optional()
|
|
91
|
-
.describe('Maximum directory depth to search'),
|
|
96
|
+
.describe('Maximum directory depth to search (lower values improve performance)'),
|
|
92
97
|
};
|
|
93
98
|
// Base schema for reading a file with various options.
|
|
94
99
|
const ReadFileBaseSchema = z.object({
|
|
@@ -159,6 +164,14 @@ const ReadMultipleFilesBaseSchema = z.object({
|
|
|
159
164
|
.optional()
|
|
160
165
|
.default(MAX_TEXT_FILE_SIZE)
|
|
161
166
|
.describe('Maximum file size in bytes per file (default 10MB)'),
|
|
167
|
+
maxTotalSize: z
|
|
168
|
+
.number()
|
|
169
|
+
.int('maxTotalSize must be an integer')
|
|
170
|
+
.min(1, 'maxTotalSize must be at least 1 byte')
|
|
171
|
+
.max(1024 * 1024 * 1024, 'maxTotalSize cannot exceed 1GB')
|
|
172
|
+
.optional()
|
|
173
|
+
.default(100 * 1024 * 1024)
|
|
174
|
+
.describe('Maximum total size in bytes for all files combined (default 100MB)'),
|
|
162
175
|
head: z
|
|
163
176
|
.number()
|
|
164
177
|
.int('head must be an integer')
|
|
@@ -199,7 +212,12 @@ export const SearchContentInputSchema = {
|
|
|
199
212
|
.default('**/*')
|
|
200
213
|
.describe('Glob pattern to filter files'),
|
|
201
214
|
excludePatterns: z
|
|
202
|
-
.array(z
|
|
215
|
+
.array(z
|
|
216
|
+
.string()
|
|
217
|
+
.max(500, 'Individual exclude pattern is too long')
|
|
218
|
+
.refine((val) => !val.includes('**/**/**'), {
|
|
219
|
+
message: 'Pattern too deeply nested (max 2 levels of **)',
|
|
220
|
+
}))
|
|
203
221
|
.max(100, 'Too many exclude patterns (max 100)')
|
|
204
222
|
.optional()
|
|
205
223
|
.default([])
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inputs.js","sourceRoot":"","sources":["../../src/schemas/inputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,sBAAsB,CAAC;SAC9B,QAAQ,CAAC,oDAAoD,CAAC;IACjE,SAAS,EAAE,CAAC;SACT,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CACP,qEAAqE,CACtE;IACH,aAAa,EAAE,CAAC;SACb,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,sBAAsB,CAAC;IACnC,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,GAAG,CAAC,6BAA6B,CAAC;SAClC,GAAG,CAAC,CAAC,EAAE,+BAA+B,CAAC;SACvC,GAAG,CAAC,GAAG,EAAE,4BAA4B,CAAC;SACtC,QAAQ,EAAE;SACV,OAAO,CAAC,iBAAiB,CAAC;SAC1B,QAAQ,
|
|
1
|
+
{"version":3,"file":"inputs.js","sourceRoot":"","sources":["../../src/schemas/inputs.ts"],"names":[],"mappings":"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"}
|