@j0hanz/filesystem-context-mcp 1.0.10 → 1.2.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 +112 -22
- package/dist/__tests__/lib/errors.test.js +3 -23
- package/dist/__tests__/lib/errors.test.js.map +1 -1
- package/dist/__tests__/lib/file-operations.test.js +34 -0
- package/dist/__tests__/lib/file-operations.test.js.map +1 -1
- package/dist/__tests__/lib/path-validation.test.js +8 -0
- package/dist/__tests__/lib/path-validation.test.js.map +1 -1
- package/dist/__tests__/schemas/validators.test.js +130 -124
- package/dist/__tests__/schemas/validators.test.js.map +1 -1
- package/dist/__tests__/security/filesystem-boundary.test.js +1 -1
- package/dist/__tests__/security/filesystem-boundary.test.js.map +1 -1
- package/dist/config/types.d.ts +1 -58
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +0 -2
- package/dist/config/types.js.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/instructions.md +1 -2
- package/dist/lib/constants.d.ts +9 -7
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +89 -298
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/errors.d.ts +25 -1
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +4 -112
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/file-operations/analyze-directory.d.ts +8 -0
- package/dist/lib/file-operations/analyze-directory.d.ts.map +1 -0
- package/dist/lib/file-operations/analyze-directory.js +117 -0
- package/dist/lib/file-operations/analyze-directory.js.map +1 -0
- package/dist/lib/file-operations/directory-items.d.ts +20 -0
- package/dist/lib/file-operations/directory-items.d.ts.map +1 -0
- package/dist/lib/file-operations/directory-items.js +85 -0
- package/dist/lib/file-operations/directory-items.js.map +1 -0
- package/dist/lib/file-operations/directory-iteration.d.ts +17 -0
- package/dist/lib/file-operations/directory-iteration.d.ts.map +1 -0
- package/dist/lib/file-operations/directory-iteration.js +55 -0
- package/dist/lib/file-operations/directory-iteration.js.map +1 -0
- package/dist/lib/file-operations/directory-tree.d.ts +9 -0
- package/dist/lib/file-operations/directory-tree.d.ts.map +1 -0
- package/dist/lib/file-operations/directory-tree.js +175 -0
- package/dist/lib/file-operations/directory-tree.js.map +1 -0
- package/dist/lib/file-operations/file-info.d.ts +3 -0
- package/dist/lib/file-operations/file-info.d.ts.map +1 -0
- package/dist/lib/file-operations/file-info.js +56 -0
- package/dist/lib/file-operations/file-info.js.map +1 -0
- package/dist/lib/file-operations/list-directory.d.ts +10 -0
- package/dist/lib/file-operations/list-directory.d.ts.map +1 -0
- package/dist/lib/file-operations/list-directory.js +189 -0
- package/dist/lib/file-operations/list-directory.js.map +1 -0
- package/dist/lib/file-operations/read-media-file.d.ts +5 -0
- package/dist/lib/file-operations/read-media-file.d.ts.map +1 -0
- package/dist/lib/file-operations/read-media-file.js +31 -0
- package/dist/lib/file-operations/read-media-file.js.map +1 -0
- package/dist/lib/file-operations/read-multiple-files.d.ts +16 -0
- package/dist/lib/file-operations/read-multiple-files.d.ts.map +1 -0
- package/dist/lib/file-operations/read-multiple-files.js +98 -0
- package/dist/lib/file-operations/read-multiple-files.js.map +1 -0
- package/dist/lib/file-operations/search-content.d.ts +16 -0
- package/dist/lib/file-operations/search-content.d.ts.map +1 -0
- package/dist/lib/file-operations/search-content.js +431 -0
- package/dist/lib/file-operations/search-content.js.map +1 -0
- package/dist/lib/file-operations/search-files.d.ts +9 -0
- package/dist/lib/file-operations/search-files.d.ts.map +1 -0
- package/dist/lib/file-operations/search-files.js +139 -0
- package/dist/lib/file-operations/search-files.js.map +1 -0
- package/dist/lib/file-operations/sorting.d.ts +12 -0
- package/dist/lib/file-operations/sorting.d.ts.map +1 -0
- package/dist/lib/file-operations/sorting.js +24 -0
- package/dist/lib/file-operations/sorting.js.map +1 -0
- package/dist/lib/file-operations.d.ts +9 -57
- package/dist/lib/file-operations.d.ts.map +1 -1
- package/dist/lib/file-operations.js +9 -733
- package/dist/lib/file-operations.js.map +1 -1
- package/dist/lib/fs-helpers/binary-detect.d.ts +3 -0
- package/dist/lib/fs-helpers/binary-detect.d.ts.map +1 -0
- package/dist/lib/fs-helpers/binary-detect.js +54 -0
- package/dist/lib/fs-helpers/binary-detect.js.map +1 -0
- package/dist/lib/fs-helpers/concurrency.d.ts +11 -0
- package/dist/lib/fs-helpers/concurrency.d.ts.map +1 -0
- package/dist/lib/fs-helpers/concurrency.js +95 -0
- package/dist/lib/fs-helpers/concurrency.js.map +1 -0
- package/dist/lib/fs-helpers/fs-utils.d.ts +5 -0
- package/dist/lib/fs-helpers/fs-utils.d.ts.map +1 -0
- package/dist/lib/fs-helpers/fs-utils.js +13 -0
- package/dist/lib/fs-helpers/fs-utils.js.map +1 -0
- package/dist/lib/fs-helpers/readers/head-file.d.ts +2 -0
- package/dist/lib/fs-helpers/readers/head-file.d.ts.map +1 -0
- package/dist/lib/fs-helpers/readers/head-file.js +73 -0
- package/dist/lib/fs-helpers/readers/head-file.js.map +1 -0
- package/dist/lib/fs-helpers/readers/line-range.d.ts +7 -0
- package/dist/lib/fs-helpers/readers/line-range.d.ts.map +1 -0
- package/dist/lib/fs-helpers/readers/line-range.js +46 -0
- package/dist/lib/fs-helpers/readers/line-range.js.map +1 -0
- package/dist/lib/fs-helpers/readers/read-file.d.ts +16 -0
- package/dist/lib/fs-helpers/readers/read-file.d.ts.map +1 -0
- package/dist/lib/fs-helpers/readers/read-file.js +87 -0
- package/dist/lib/fs-helpers/readers/read-file.js.map +1 -0
- package/dist/lib/fs-helpers/readers/tail-file.d.ts +2 -0
- package/dist/lib/fs-helpers/readers/tail-file.d.ts.map +1 -0
- package/dist/lib/fs-helpers/readers/tail-file.js +98 -0
- package/dist/lib/fs-helpers/readers/tail-file.js.map +1 -0
- package/dist/lib/fs-helpers/readers/utf8.d.ts +3 -0
- package/dist/lib/fs-helpers/readers/utf8.d.ts.map +1 -0
- package/dist/lib/fs-helpers/readers/utf8.js +22 -0
- package/dist/lib/fs-helpers/readers/utf8.js.map +1 -0
- package/dist/lib/fs-helpers/readers.d.ts +4 -0
- package/dist/lib/fs-helpers/readers.d.ts.map +1 -0
- package/dist/lib/fs-helpers/readers.js +4 -0
- package/dist/lib/fs-helpers/readers.js.map +1 -0
- package/dist/lib/fs-helpers.d.ts +4 -25
- package/dist/lib/fs-helpers.d.ts.map +1 -1
- package/dist/lib/fs-helpers.js +4 -350
- package/dist/lib/fs-helpers.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/allowed-directories.d.ts +9 -0
- package/dist/lib/path-validation/allowed-directories.d.ts.map +1 -0
- package/dist/lib/path-validation/allowed-directories.js +94 -0
- package/dist/lib/path-validation/allowed-directories.js.map +1 -0
- package/dist/lib/path-validation/errors.d.ts +5 -0
- package/dist/lib/path-validation/errors.d.ts.map +1 -0
- package/dist/lib/path-validation/errors.js +33 -0
- package/dist/lib/path-validation/errors.js.map +1 -0
- package/dist/lib/path-validation/roots.d.ts +3 -0
- package/dist/lib/path-validation/roots.d.ts.map +1 -0
- package/dist/lib/path-validation/roots.js +49 -0
- package/dist/lib/path-validation/roots.js.map +1 -0
- package/dist/lib/path-validation/validators.d.ts +9 -0
- package/dist/lib/path-validation/validators.d.ts.map +1 -0
- package/dist/lib/path-validation/validators.js +70 -0
- package/dist/lib/path-validation/validators.js.map +1 -0
- package/dist/lib/path-validation.d.ts +3 -7
- package/dist/lib/path-validation.d.ts.map +1 -1
- package/dist/lib/path-validation.js +3 -124
- package/dist/lib/path-validation.js.map +1 -1
- package/dist/schemas/input-helpers.d.ts +8 -0
- package/dist/schemas/input-helpers.d.ts.map +1 -0
- package/dist/schemas/input-helpers.js +44 -0
- package/dist/schemas/input-helpers.js.map +1 -0
- package/dist/schemas/inputs.d.ts +8 -5
- package/dist/schemas/inputs.d.ts.map +1 -1
- package/dist/schemas/inputs.js +41 -64
- package/dist/schemas/inputs.js.map +1 -1
- package/dist/schemas/output-helpers.d.ts +24 -0
- package/dist/schemas/output-helpers.d.ts.map +1 -0
- package/dist/schemas/output-helpers.js +13 -0
- package/dist/schemas/output-helpers.js.map +1 -0
- package/dist/schemas/outputs.d.ts +480 -46
- package/dist/schemas/outputs.d.ts.map +1 -1
- package/dist/schemas/outputs.js +26 -41
- package/dist/schemas/outputs.js.map +1 -1
- package/dist/server.d.ts +9 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +29 -57
- package/dist/server.js.map +1 -1
- package/dist/tools/analyze-directory.d.ts.map +1 -1
- package/dist/tools/analyze-directory.js +116 -54
- package/dist/tools/analyze-directory.js.map +1 -1
- package/dist/tools/directory-tree.d.ts.map +1 -1
- package/dist/tools/directory-tree.js +86 -49
- package/dist/tools/directory-tree.js.map +1 -1
- package/dist/tools/get-file-info.d.ts.map +1 -1
- package/dist/tools/get-file-info.js +71 -37
- package/dist/tools/get-file-info.js.map +1 -1
- package/dist/tools/list-allowed-dirs.d.ts.map +1 -1
- package/dist/tools/list-allowed-dirs.js +48 -35
- 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 +131 -60
- 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 +70 -56
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/read-media-file.d.ts.map +1 -1
- package/dist/tools/read-media-file.js +39 -41
- package/dist/tools/read-media-file.js.map +1 -1
- package/dist/tools/read-multiple-files.d.ts.map +1 -1
- package/dist/tools/read-multiple-files.js +57 -50
- 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 +147 -95
- 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 +122 -51
- package/dist/tools/search-files.js.map +1 -1
- package/dist/tools/tool-response.d.ts +9 -0
- package/dist/tools/tool-response.d.ts.map +1 -0
- package/dist/tools/tool-response.js +7 -0
- package/dist/tools/tool-response.js.map +1 -0
- package/package.json +2 -1
- package/dist/__tests__/errors.test.d.ts +0 -2
- package/dist/__tests__/errors.test.d.ts.map +0 -1
- package/dist/__tests__/errors.test.js +0 -88
- package/dist/__tests__/errors.test.js.map +0 -1
- package/dist/__tests__/file-operations.test.d.ts +0 -2
- package/dist/__tests__/file-operations.test.d.ts.map +0 -1
- package/dist/__tests__/file-operations.test.js +0 -230
- package/dist/__tests__/file-operations.test.js.map +0 -1
- package/dist/__tests__/lib/formatters.test.d.ts +0 -2
- package/dist/__tests__/lib/formatters.test.d.ts.map +0 -1
- package/dist/__tests__/lib/formatters.test.js +0 -248
- package/dist/__tests__/lib/formatters.test.js.map +0 -1
- package/dist/__tests__/lib/image-parsing.test.d.ts +0 -2
- package/dist/__tests__/lib/image-parsing.test.d.ts.map +0 -1
- package/dist/__tests__/lib/image-parsing.test.js +0 -262
- package/dist/__tests__/lib/image-parsing.test.js.map +0 -1
- package/dist/__tests__/path-validation.test.d.ts +0 -2
- package/dist/__tests__/path-validation.test.d.ts.map +0 -1
- package/dist/__tests__/path-validation.test.js +0 -92
- package/dist/__tests__/path-validation.test.js.map +0 -1
- package/dist/lib/directory-helpers.d.ts +0 -4
- package/dist/lib/directory-helpers.d.ts.map +0 -1
- package/dist/lib/directory-helpers.js +0 -36
- package/dist/lib/directory-helpers.js.map +0 -1
- package/dist/lib/formatters.d.ts +0 -21
- package/dist/lib/formatters.d.ts.map +0 -1
- package/dist/lib/formatters.js +0 -206
- package/dist/lib/formatters.js.map +0 -1
- package/dist/lib/image-parsing.d.ts +0 -4
- package/dist/lib/image-parsing.d.ts.map +0 -1
- package/dist/lib/image-parsing.js +0 -130
- package/dist/lib/image-parsing.js.map +0 -1
- package/dist/lib/mcp-logger.d.ts +0 -11
- package/dist/lib/mcp-logger.d.ts.map +0 -1
- package/dist/lib/mcp-logger.js +0 -49
- package/dist/lib/mcp-logger.js.map +0 -1
- package/dist/lib/roots-utils.d.ts +0 -7
- package/dist/lib/roots-utils.d.ts.map +0 -1
- package/dist/lib/roots-utils.js +0 -39
- package/dist/lib/roots-utils.js.map +0 -1
- package/dist/lib/search-helpers.d.ts +0 -13
- package/dist/lib/search-helpers.d.ts.map +0 -1
- package/dist/lib/search-helpers.js +0 -205
- package/dist/lib/search-helpers.js.map +0 -1
- package/dist/lib/sorting.d.ts +0 -12
- package/dist/lib/sorting.d.ts.map +0 -1
- package/dist/lib/sorting.js +0 -41
- package/dist/lib/sorting.js.map +0 -1
- package/dist/lib/types.d.ts +0 -6
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/types.js +0 -2
- package/dist/lib/types.js.map +0 -1
- package/dist/prompts/analyze-codebase.d.ts +0 -3
- package/dist/prompts/analyze-codebase.d.ts.map +0 -1
- package/dist/prompts/analyze-codebase.js +0 -144
- package/dist/prompts/analyze-codebase.js.map +0 -1
- package/dist/prompts/filesystem-query.d.ts +0 -3
- package/dist/prompts/filesystem-query.d.ts.map +0 -1
- package/dist/prompts/filesystem-query.js +0 -168
- package/dist/prompts/filesystem-query.js.map +0 -1
- package/dist/prompts/find-duplicates.d.ts +0 -3
- package/dist/prompts/find-duplicates.d.ts.map +0 -1
- package/dist/prompts/find-duplicates.js +0 -77
- package/dist/prompts/find-duplicates.js.map +0 -1
- package/dist/prompts/index.d.ts +0 -3
- package/dist/prompts/index.d.ts.map +0 -1
- package/dist/prompts/index.js +0 -13
- package/dist/prompts/index.js.map +0 -1
- package/dist/prompts/project-overview.d.ts +0 -3
- package/dist/prompts/project-overview.d.ts.map +0 -1
- package/dist/prompts/project-overview.js +0 -122
- package/dist/prompts/project-overview.js.map +0 -1
- package/dist/prompts/search-and-replace.d.ts +0 -3
- package/dist/prompts/search-and-replace.d.ts.map +0 -1
- package/dist/prompts/search-and-replace.js +0 -130
- package/dist/prompts/search-and-replace.js.map +0 -1
- package/dist/prompts/shared.d.ts +0 -11
- package/dist/prompts/shared.d.ts.map +0 -1
- package/dist/prompts/shared.js +0 -32
- package/dist/prompts/shared.js.map +0 -1
- package/dist/resources/index.d.ts +0 -3
- package/dist/resources/index.d.ts.map +0 -1
- package/dist/resources/index.js +0 -54
- package/dist/resources/index.js.map +0 -1
- package/dist/schemas/validators.d.ts +0 -12
- package/dist/schemas/validators.d.ts.map +0 -1
- package/dist/schemas/validators.js +0 -35
- package/dist/schemas/validators.js.map +0 -1
- package/dist/utils/index.d.ts +0 -2
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -2
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/response-helpers.d.ts +0 -22
- package/dist/utils/response-helpers.d.ts.map +0 -1
- package/dist/utils/response-helpers.js +0 -24
- package/dist/utils/response-helpers.js.map +0 -1
|
@@ -1,142 +1,148 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
2
|
import { ErrorCode, McpError } from '../../lib/errors.js';
|
|
3
|
-
|
|
3
|
+
function expectMcpError(fn, options) {
|
|
4
|
+
try {
|
|
5
|
+
fn();
|
|
6
|
+
expect.fail('Expected McpError to be thrown');
|
|
7
|
+
}
|
|
8
|
+
catch (error) {
|
|
9
|
+
expect(error).toBeInstanceOf(McpError);
|
|
10
|
+
const mcpError = error;
|
|
11
|
+
expect(mcpError.code).toBe(options.code);
|
|
12
|
+
expect(mcpError.message).toContain(options.messageIncludes);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
// Inline validation functions (matching the implementation in tools)
|
|
16
|
+
function validateLineRange(params) {
|
|
17
|
+
const { lineStart, lineEnd, head, tail, path } = params;
|
|
18
|
+
const hasLineStart = lineStart !== undefined;
|
|
19
|
+
const hasLineEnd = lineEnd !== undefined;
|
|
20
|
+
if (hasLineStart !== hasLineEnd) {
|
|
21
|
+
const missing = hasLineStart ? 'lineEnd' : 'lineStart';
|
|
22
|
+
const provided = hasLineStart ? 'lineStart' : 'lineEnd';
|
|
23
|
+
throw new McpError(ErrorCode.E_INVALID_INPUT, `Invalid lineRange: ${provided} requires ${missing} to also be specified`, path);
|
|
24
|
+
}
|
|
25
|
+
if (hasLineStart && hasLineEnd && lineEnd < lineStart) {
|
|
26
|
+
throw new McpError(ErrorCode.E_INVALID_INPUT, `Invalid lineRange: lineEnd (${lineEnd}) must be >= lineStart (${lineStart})`, path);
|
|
27
|
+
}
|
|
28
|
+
const hasLineRange = hasLineStart && hasLineEnd;
|
|
29
|
+
const optionsCount = [
|
|
30
|
+
hasLineRange,
|
|
31
|
+
head !== undefined,
|
|
32
|
+
tail !== undefined,
|
|
33
|
+
].filter(Boolean).length;
|
|
34
|
+
if (optionsCount > 1) {
|
|
35
|
+
throw new McpError(ErrorCode.E_INVALID_INPUT, 'Cannot specify multiple of lineRange (lineStart + lineEnd), head, or tail simultaneously', path);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function validateHeadTail(head, tail) {
|
|
39
|
+
if (head !== undefined && tail !== undefined) {
|
|
40
|
+
throw new McpError(ErrorCode.E_INVALID_INPUT, 'Cannot specify both head and tail simultaneously');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
4
43
|
describe('validateLineRange', () => {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
catch (error) {
|
|
55
|
-
expect(error).toBeInstanceOf(McpError);
|
|
56
|
-
const mcpError = error;
|
|
57
|
-
expect(mcpError.code).toBe(ErrorCode.E_INVALID_INPUT);
|
|
58
|
-
expect(mcpError.message).toContain('lineEnd (5) must be >= lineStart (10)');
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
it('should accept lineEnd equal to lineStart (single line)', () => {
|
|
62
|
-
expect(() => {
|
|
63
|
-
validateLineRange({ lineStart: 5, lineEnd: 5, path: '/test/file.txt' });
|
|
64
|
-
}).not.toThrow();
|
|
65
|
-
});
|
|
66
|
-
it('should reject lineRange with head', () => {
|
|
67
|
-
try {
|
|
68
|
-
validateLineRange({
|
|
44
|
+
const validCases = [
|
|
45
|
+
{
|
|
46
|
+
name: 'valid lineRange with both lineStart and lineEnd',
|
|
47
|
+
params: { lineStart: 1, lineEnd: 10, path: '/test/file.txt' },
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'no line options',
|
|
51
|
+
params: { path: '/test/file.txt' },
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: 'head option alone',
|
|
55
|
+
params: { head: 10, path: '/test/file.txt' },
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: 'tail option alone',
|
|
59
|
+
params: { tail: 10, path: '/test/file.txt' },
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'lineEnd equal to lineStart',
|
|
63
|
+
params: { lineStart: 5, lineEnd: 5, path: '/test/file.txt' },
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
for (const testCase of validCases) {
|
|
67
|
+
it(`should accept ${testCase.name}`, () => {
|
|
68
|
+
expect(() => {
|
|
69
|
+
validateLineRange(testCase.params);
|
|
70
|
+
}).not.toThrow();
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
const invalidCases = [
|
|
74
|
+
{
|
|
75
|
+
name: 'lineStart without lineEnd',
|
|
76
|
+
params: { lineStart: 5, path: '/test/file.txt' },
|
|
77
|
+
message: 'lineStart requires lineEnd',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: 'lineEnd without lineStart',
|
|
81
|
+
params: { lineEnd: 10, path: '/test/file.txt' },
|
|
82
|
+
message: 'lineEnd requires lineStart',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: 'lineEnd < lineStart',
|
|
86
|
+
params: { lineStart: 10, lineEnd: 5, path: '/test/file.txt' },
|
|
87
|
+
message: 'lineEnd (5) must be >= lineStart (10)',
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: 'lineRange with head',
|
|
91
|
+
params: {
|
|
69
92
|
lineStart: 1,
|
|
70
93
|
lineEnd: 10,
|
|
71
94
|
head: 5,
|
|
72
95
|
path: '/test/file.txt',
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
expect(mcpError.code).toBe(ErrorCode.E_INVALID_INPUT);
|
|
80
|
-
expect(mcpError.message).toContain('Cannot specify multiple');
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
it('should reject lineRange with tail', () => {
|
|
84
|
-
try {
|
|
85
|
-
validateLineRange({
|
|
96
|
+
},
|
|
97
|
+
message: 'Cannot specify multiple',
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: 'lineRange with tail',
|
|
101
|
+
params: {
|
|
86
102
|
lineStart: 1,
|
|
87
103
|
lineEnd: 10,
|
|
88
104
|
tail: 5,
|
|
89
105
|
path: '/test/file.txt',
|
|
106
|
+
},
|
|
107
|
+
message: 'Cannot specify multiple',
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
name: 'head with tail',
|
|
111
|
+
params: { head: 5, tail: 5, path: '/test/file.txt' },
|
|
112
|
+
message: 'Cannot specify multiple',
|
|
113
|
+
},
|
|
114
|
+
];
|
|
115
|
+
for (const testCase of invalidCases) {
|
|
116
|
+
it(`should reject ${testCase.name}`, () => {
|
|
117
|
+
expectMcpError(() => {
|
|
118
|
+
validateLineRange(testCase.params);
|
|
119
|
+
}, {
|
|
120
|
+
code: ErrorCode.E_INVALID_INPUT,
|
|
121
|
+
messageIncludes: testCase.message,
|
|
90
122
|
});
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
catch (error) {
|
|
94
|
-
expect(error).toBeInstanceOf(McpError);
|
|
95
|
-
const mcpError = error;
|
|
96
|
-
expect(mcpError.code).toBe(ErrorCode.E_INVALID_INPUT);
|
|
97
|
-
expect(mcpError.message).toContain('Cannot specify multiple');
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
it('should reject head with tail', () => {
|
|
101
|
-
try {
|
|
102
|
-
validateLineRange({ head: 5, tail: 5, path: '/test/file.txt' });
|
|
103
|
-
expect.fail('Expected McpError to be thrown');
|
|
104
|
-
}
|
|
105
|
-
catch (error) {
|
|
106
|
-
expect(error).toBeInstanceOf(McpError);
|
|
107
|
-
const mcpError = error;
|
|
108
|
-
expect(mcpError.code).toBe(ErrorCode.E_INVALID_INPUT);
|
|
109
|
-
expect(mcpError.message).toContain('Cannot specify multiple');
|
|
110
|
-
}
|
|
111
|
-
});
|
|
123
|
+
});
|
|
124
|
+
}
|
|
112
125
|
});
|
|
113
126
|
describe('validateHeadTail', () => {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
validateHeadTail({});
|
|
127
|
-
}).not.toThrow();
|
|
128
|
-
});
|
|
127
|
+
const validCases = [
|
|
128
|
+
[10, undefined],
|
|
129
|
+
[undefined, 10],
|
|
130
|
+
[undefined, undefined],
|
|
131
|
+
];
|
|
132
|
+
for (const [head, tail] of validCases) {
|
|
133
|
+
it('should accept valid head/tail combination', () => {
|
|
134
|
+
expect(() => {
|
|
135
|
+
validateHeadTail(head, tail);
|
|
136
|
+
}).not.toThrow();
|
|
137
|
+
});
|
|
138
|
+
}
|
|
129
139
|
it('should reject both head and tail', () => {
|
|
130
|
-
|
|
131
|
-
validateHeadTail(
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
const mcpError = error;
|
|
137
|
-
expect(mcpError.code).toBe(ErrorCode.E_INVALID_INPUT);
|
|
138
|
-
expect(mcpError.message).toContain('Cannot specify both head and tail');
|
|
139
|
-
}
|
|
140
|
+
expectMcpError(() => {
|
|
141
|
+
validateHeadTail(5, 5);
|
|
142
|
+
}, {
|
|
143
|
+
code: ErrorCode.E_INVALID_INPUT,
|
|
144
|
+
messageIncludes: 'Cannot specify both head and tail',
|
|
145
|
+
});
|
|
140
146
|
});
|
|
141
147
|
});
|
|
142
148
|
//# sourceMappingURL=validators.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.test.js","sourceRoot":"","sources":["../../../src/__tests__/schemas/validators.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"validators.test.js","sourceRoot":"","sources":["../../../src/__tests__/schemas/validators.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE1D,SAAS,cAAc,CACrB,EAAc,EACd,OAAqD;IAErD,IAAI,CAAC;QACH,EAAE,EAAE,CAAC;QACL,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,KAAiB,CAAC;QACnC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,SAAS,iBAAiB,CAAC,MAM1B;IACC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IACxD,MAAM,YAAY,GAAG,SAAS,KAAK,SAAS,CAAC;IAC7C,MAAM,UAAU,GAAG,OAAO,KAAK,SAAS,CAAC;IAEzC,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;QACvD,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QACxD,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,eAAe,EACzB,sBAAsB,QAAQ,aAAa,OAAO,uBAAuB,EACzE,IAAI,CACL,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,IAAI,UAAU,IAAI,OAAO,GAAG,SAAS,EAAE,CAAC;QACtD,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,eAAe,EACzB,+BAA+B,OAAO,2BAA2B,SAAS,GAAG,EAC7E,IAAI,CACL,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,YAAY,IAAI,UAAU,CAAC;IAChD,MAAM,YAAY,GAAG;QACnB,YAAY;QACZ,IAAI,KAAK,SAAS;QAClB,IAAI,KAAK,SAAS;KACnB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACzB,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,eAAe,EACzB,0FAA0F,EAC1F,IAAI,CACL,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAa,EAAE,IAAa;IACpD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7C,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,eAAe,EACzB,kDAAkD,CACnD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,MAAM,UAAU,GAAG;QACjB;YACE,IAAI,EAAE,iDAAiD;YACvD,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;SAC9D;QACD;YACE,IAAI,EAAE,iBAAiB;YACvB,MAAM,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;SACnC;QACD;YACE,IAAI,EAAE,mBAAmB;YACzB,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;SAC7C;QACD;YACE,IAAI,EAAE,mBAAmB;YACzB,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;SAC7C;QACD;YACE,IAAI,EAAE,4BAA4B;YAClC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE;SAC7D;KACF,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,EAAE,CAAC,iBAAiB,QAAQ,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE;YACxC,MAAM,CAAC,GAAG,EAAE;gBACV,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,YAAY,GAAG;QACnB;YACE,IAAI,EAAE,2BAA2B;YACjC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE;YAChD,OAAO,EAAE,4BAA4B;SACtC;QACD;YACE,IAAI,EAAE,2BAA2B;YACjC,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;YAC/C,OAAO,EAAE,4BAA4B;SACtC;QACD;YACE,IAAI,EAAE,qBAAqB;YAC3B,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE;YAC7D,OAAO,EAAE,uCAAuC;SACjD;QACD;YACE,IAAI,EAAE,qBAAqB;YAC3B,MAAM,EAAE;gBACN,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,CAAC;gBACP,IAAI,EAAE,gBAAgB;aACvB;YACD,OAAO,EAAE,yBAAyB;SACnC;QACD;YACE,IAAI,EAAE,qBAAqB;YAC3B,MAAM,EAAE;gBACN,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,CAAC;gBACP,IAAI,EAAE,gBAAgB;aACvB;YACD,OAAO,EAAE,yBAAyB;SACnC;QACD;YACE,IAAI,EAAE,gBAAgB;YACtB,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE;YACpD,OAAO,EAAE,yBAAyB;SACnC;KACF,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,EAAE,CAAC,iBAAiB,QAAQ,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE;YACxC,cAAc,CACZ,GAAG,EAAE;gBACH,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC,EACD;gBACE,IAAI,EAAE,SAAS,CAAC,eAAe;gBAC/B,eAAe,EAAE,QAAQ,CAAC,OAAO;aAClC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,MAAM,UAAU,GAA+C;QAC7D,CAAC,EAAE,EAAE,SAAS,CAAC;QACf,CAAC,SAAS,EAAE,EAAE,CAAC;QACf,CAAC,SAAS,EAAE,SAAS,CAAC;KACvB,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;QACtC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,CAAC,GAAG,EAAE;gBACV,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,cAAc,CACZ,GAAG,EAAE;YACH,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzB,CAAC,EACD;YACE,IAAI,EAAE,SAAS,CAAC,eAAe;YAC/B,eAAe,EAAE,mCAAmC;SACrD,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -30,7 +30,7 @@ describe('security boundary: filesystem access', () => {
|
|
|
30
30
|
'src/lib/path-validation.ts',
|
|
31
31
|
'src/lib/file-operations.ts',
|
|
32
32
|
'src/lib/fs-helpers.ts',
|
|
33
|
-
'src/lib/search-
|
|
33
|
+
'src/lib/file-operations/search-content.ts',
|
|
34
34
|
]);
|
|
35
35
|
const offenders = [];
|
|
36
36
|
for (const relPath of sourceFiles) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem-boundary.test.js","sourceRoot":"","sources":["../../../src/__tests__/security/filesystem-boundary.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,SAAS,WAAW;IAClB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,sCAAsC;IACtC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,CACL,mCAAmC,CAAC,IAAI,CAAC,MAAM,CAAC;QAChD,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,CACvC,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAE/B,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE;YAC5C,GAAG,EAAE,QAAQ;YACb,MAAM,EAAE,CAAC,kBAAkB,CAAC;YAC5B,SAAS,EAAE,IAAI;YACf,GAAG,EAAE,KAAK;SACX,CAAC,CAAC;QAEH,mEAAmE;QACnE,2CAA2C;QAC3C,qCAAqC;QACrC,0DAA0D;QAC1D,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAS;YAC3C,eAAe;YACf,4BAA4B;YAC5B,4BAA4B;YAC5B,uBAAuB;YACvB,
|
|
1
|
+
{"version":3,"file":"filesystem-boundary.test.js","sourceRoot":"","sources":["../../../src/__tests__/security/filesystem-boundary.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,SAAS,WAAW;IAClB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,sCAAsC;IACtC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,CACL,mCAAmC,CAAC,IAAI,CAAC,MAAM,CAAC;QAChD,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,CACvC,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAE/B,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE;YAC5C,GAAG,EAAE,QAAQ;YACb,MAAM,EAAE,CAAC,kBAAkB,CAAC;YAC5B,SAAS,EAAE,IAAI;YACf,GAAG,EAAE,KAAK;SACX,CAAC,CAAC;QAEH,mEAAmE;QACnE,2CAA2C;QAC3C,qCAAqC;QACrC,0DAA0D;QAC1D,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAS;YAC3C,eAAe;YACf,4BAA4B;YAC5B,4BAA4B;YAC5B,uBAAuB;YACvB,2CAA2C;SAC5C,CAAC,CAAC;QAEH,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAEpD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1B,SAAS;YACX,CAAC;YAED,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC5D,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,MAAM,CACJ,SAAS,EACT,gEAAgE;YAC9D,8EAA8E;YAC9E,0GAA0G,CAC7G,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/config/types.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { Buffer } from 'node:buffer';
|
|
2
1
|
export type FileType = 'file' | 'directory' | 'symlink' | 'other';
|
|
3
2
|
export interface FileInfo {
|
|
4
3
|
name: string;
|
|
@@ -50,6 +49,7 @@ export interface SearchFilesResult {
|
|
|
50
49
|
truncated: boolean;
|
|
51
50
|
skippedInaccessible: number;
|
|
52
51
|
filesScanned: number;
|
|
52
|
+
stoppedReason?: 'maxResults' | 'maxFiles' | 'timeout';
|
|
53
53
|
};
|
|
54
54
|
}
|
|
55
55
|
export interface ContentMatch {
|
|
@@ -123,8 +123,6 @@ export interface MediaFileResult {
|
|
|
123
123
|
mimeType: string;
|
|
124
124
|
size: number;
|
|
125
125
|
data: string;
|
|
126
|
-
width?: number;
|
|
127
|
-
height?: number;
|
|
128
126
|
}
|
|
129
127
|
export declare const ErrorCode: {
|
|
130
128
|
readonly E_ACCESS_DENIED: "E_ACCESS_DENIED";
|
|
@@ -132,67 +130,12 @@ export declare const ErrorCode: {
|
|
|
132
130
|
readonly E_NOT_FILE: "E_NOT_FILE";
|
|
133
131
|
readonly E_NOT_DIRECTORY: "E_NOT_DIRECTORY";
|
|
134
132
|
readonly E_TOO_LARGE: "E_TOO_LARGE";
|
|
135
|
-
readonly E_BINARY_FILE: "E_BINARY_FILE";
|
|
136
133
|
readonly E_TIMEOUT: "E_TIMEOUT";
|
|
137
134
|
readonly E_INVALID_PATTERN: "E_INVALID_PATTERN";
|
|
138
135
|
readonly E_INVALID_INPUT: "E_INVALID_INPUT";
|
|
139
136
|
readonly E_PERMISSION_DENIED: "E_PERMISSION_DENIED";
|
|
140
137
|
readonly E_SYMLINK_NOT_ALLOWED: "E_SYMLINK_NOT_ALLOWED";
|
|
141
|
-
readonly E_PATH_TRAVERSAL: "E_PATH_TRAVERSAL";
|
|
142
138
|
readonly E_UNKNOWN: "E_UNKNOWN";
|
|
143
139
|
};
|
|
144
140
|
export type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];
|
|
145
|
-
export interface DetailedError {
|
|
146
|
-
code: ErrorCode;
|
|
147
|
-
message: string;
|
|
148
|
-
path?: string;
|
|
149
|
-
suggestion?: string;
|
|
150
|
-
details?: Record<string, unknown>;
|
|
151
|
-
}
|
|
152
|
-
export interface ErrorResponse {
|
|
153
|
-
[key: string]: unknown;
|
|
154
|
-
content: {
|
|
155
|
-
type: 'text';
|
|
156
|
-
text: string;
|
|
157
|
-
}[];
|
|
158
|
-
structuredContent: {
|
|
159
|
-
ok: false;
|
|
160
|
-
error: {
|
|
161
|
-
code: string;
|
|
162
|
-
message: string;
|
|
163
|
-
path?: string;
|
|
164
|
-
suggestion?: string;
|
|
165
|
-
};
|
|
166
|
-
};
|
|
167
|
-
isError: true;
|
|
168
|
-
}
|
|
169
|
-
export interface ParseArgsResult {
|
|
170
|
-
allowedDirs: string[];
|
|
171
|
-
allowCwd: boolean;
|
|
172
|
-
}
|
|
173
|
-
export interface ServerOptions {
|
|
174
|
-
allowCwd?: boolean;
|
|
175
|
-
}
|
|
176
|
-
export interface ImageDimensions {
|
|
177
|
-
width: number;
|
|
178
|
-
height: number;
|
|
179
|
-
}
|
|
180
|
-
export type ImageParser = (buffer: Buffer) => ImageDimensions | null;
|
|
181
|
-
export interface ValidatedPathDetails {
|
|
182
|
-
requestedPath: string;
|
|
183
|
-
resolvedPath: string;
|
|
184
|
-
isSymlink: boolean;
|
|
185
|
-
}
|
|
186
|
-
export interface ScanFileResult {
|
|
187
|
-
matches: ContentMatch[];
|
|
188
|
-
linesSkippedDueToRegexTimeout: number;
|
|
189
|
-
fileHadMatches: boolean;
|
|
190
|
-
}
|
|
191
|
-
export interface ParallelResult<R> {
|
|
192
|
-
results: R[];
|
|
193
|
-
errors: {
|
|
194
|
-
index: number;
|
|
195
|
-
error: Error;
|
|
196
|
-
}[];
|
|
197
|
-
}
|
|
198
141
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
|
package/dist/config/types.js
CHANGED
|
@@ -4,13 +4,11 @@ export const ErrorCode = {
|
|
|
4
4
|
E_NOT_FILE: 'E_NOT_FILE',
|
|
5
5
|
E_NOT_DIRECTORY: 'E_NOT_DIRECTORY',
|
|
6
6
|
E_TOO_LARGE: 'E_TOO_LARGE',
|
|
7
|
-
E_BINARY_FILE: 'E_BINARY_FILE',
|
|
8
7
|
E_TIMEOUT: 'E_TIMEOUT',
|
|
9
8
|
E_INVALID_PATTERN: 'E_INVALID_PATTERN',
|
|
10
9
|
E_INVALID_INPUT: 'E_INVALID_INPUT',
|
|
11
10
|
E_PERMISSION_DENIED: 'E_PERMISSION_DENIED',
|
|
12
11
|
E_SYMLINK_NOT_ALLOWED: 'E_SYMLINK_NOT_ALLOWED',
|
|
13
|
-
E_PATH_TRAVERSAL: 'E_PATH_TRAVERSAL',
|
|
14
12
|
E_UNKNOWN: 'E_UNKNOWN',
|
|
15
13
|
};
|
|
16
14
|
//# sourceMappingURL=types.js.map
|
package/dist/config/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAqIA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,eAAe,EAAE,iBAAiB;IAClC,WAAW,EAAE,aAAa;IAC1B,UAAU,EAAE,YAAY;IACxB,eAAe,EAAE,iBAAiB;IAClC,WAAW,EAAE,aAAa;IAC1B,SAAS,EAAE,WAAW;IACtB,iBAAiB,EAAE,mBAAmB;IACtC,eAAe,EAAE,iBAAiB;IAClC,mBAAmB,EAAE,qBAAqB;IAC1C,qBAAqB,EAAE,uBAAuB;IAC9C,SAAS,EAAE,WAAW;CACd,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,26 +1,24 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
2
|
+
import { setAllowedDirectoriesResolved } from './lib/path-validation.js';
|
|
3
3
|
import { createServer, parseArgs, startServer } from './server.js';
|
|
4
4
|
async function main() {
|
|
5
5
|
const { allowedDirs, allowCwd } = await parseArgs();
|
|
6
6
|
if (allowedDirs.length > 0) {
|
|
7
|
-
|
|
7
|
+
await setAllowedDirectoriesResolved(allowedDirs);
|
|
8
8
|
console.error('Allowed directories (from CLI):');
|
|
9
9
|
}
|
|
10
10
|
else {
|
|
11
11
|
console.error(`No directories specified via CLI. Will use MCP Roots${allowCwd ? ' or current working directory' : ''}.`);
|
|
12
12
|
}
|
|
13
|
-
const server = createServer({ allowCwd });
|
|
13
|
+
const server = createServer({ allowCwd, cliAllowedDirs: allowedDirs });
|
|
14
14
|
await startServer(server);
|
|
15
15
|
}
|
|
16
|
-
// Graceful shutdown handlers
|
|
17
16
|
process.on('SIGTERM', () => {
|
|
18
17
|
process.exit(0);
|
|
19
18
|
});
|
|
20
19
|
process.on('SIGINT', () => {
|
|
21
20
|
process.exit(0);
|
|
22
21
|
});
|
|
23
|
-
// Run main and handle fatal errors
|
|
24
22
|
main().catch((error) => {
|
|
25
23
|
console.error('Fatal error:', error instanceof Error ? error.message : String(error));
|
|
26
24
|
process.exit(1);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEnE,KAAK,UAAU,IAAI;IACjB,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,MAAM,SAAS,EAAE,CAAC;IAEpD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,6BAA6B,CAAC,WAAW,CAAC,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CACX,uDAAuD,QAAQ,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAAE,GAAG,CAC1G,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IACvE,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CACX,cAAc,EACd,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/instructions.md
CHANGED
|
@@ -166,7 +166,7 @@ Statistics: counts, sizes, types, largest/recent files.
|
|
|
166
166
|
|
|
167
167
|
### `read_media_file`
|
|
168
168
|
|
|
169
|
-
Binary files as base64 with MIME type
|
|
169
|
+
Binary files as base64 with MIME type.
|
|
170
170
|
|
|
171
171
|
| Parameter | Default | Description |
|
|
172
172
|
| --------- | ------- | --------------- |
|
|
@@ -194,7 +194,6 @@ Detailed metadata about a file or directory.
|
|
|
194
194
|
| `E_NOT_FILE` | Expected file, got directory | Use `list_directory` instead |
|
|
195
195
|
| `E_NOT_DIRECTORY` | Expected directory, got file | Use `read_file` instead |
|
|
196
196
|
| `E_TOO_LARGE` | File exceeds size limit | Use `head/tail` or increase `maxSize` |
|
|
197
|
-
| `E_BINARY_FILE` | Binary in text operation | Use `read_media_file` |
|
|
198
197
|
| `E_TIMEOUT` | Operation took too long | Reduce limits |
|
|
199
198
|
| `E_INVALID_PATTERN` | Malformed glob/regex | Check glob/regex syntax |
|
|
200
199
|
| `E_PERMISSION_DENIED` | OS-level access denied | Check file permissions |
|
package/dist/lib/constants.d.ts
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
export declare const PARALLEL_CONCURRENCY
|
|
2
|
-
export declare const DIR_TRAVERSAL_CONCURRENCY
|
|
1
|
+
export declare const PARALLEL_CONCURRENCY: number;
|
|
2
|
+
export declare const DIR_TRAVERSAL_CONCURRENCY: number;
|
|
3
3
|
export declare const REGEX_MATCH_TIMEOUT_MS: number;
|
|
4
4
|
export declare const MAX_SEARCHABLE_FILE_SIZE: number;
|
|
5
5
|
export declare const MAX_TEXT_FILE_SIZE: number;
|
|
6
6
|
export declare const MAX_MEDIA_FILE_SIZE: number;
|
|
7
7
|
export declare const MAX_LINE_CONTENT_LENGTH = 200;
|
|
8
8
|
export declare const BINARY_CHECK_BUFFER_SIZE = 512;
|
|
9
|
-
export declare const DEFAULT_MAX_DEPTH
|
|
10
|
-
export declare const DEFAULT_MAX_RESULTS
|
|
11
|
-
export declare const
|
|
12
|
-
export declare const
|
|
13
|
-
export declare const
|
|
9
|
+
export declare const DEFAULT_MAX_DEPTH: number;
|
|
10
|
+
export declare const DEFAULT_MAX_RESULTS: number;
|
|
11
|
+
export declare const DEFAULT_SEARCH_MAX_FILES: number;
|
|
12
|
+
export declare const DEFAULT_SEARCH_TIMEOUT_MS: number;
|
|
13
|
+
export declare const DEFAULT_TOP_N: number;
|
|
14
|
+
export declare const DEFAULT_TREE_DEPTH: number;
|
|
15
|
+
export declare const DEFAULT_TREE_MAX_FILES: number;
|
|
14
16
|
export declare const KNOWN_BINARY_EXTENSIONS: Set<string>;
|
|
15
17
|
export declare function getMimeType(ext: string): string;
|
|
16
18
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAuBA,eAAO,MAAM,oBAAoB,QAA2C,CAAC;AAC7E,eAAO,MAAM,yBAAyB,QAKrC,CAAC;AACF,eAAO,MAAM,sBAAsB,QAKlC,CAAC;AACF,eAAO,MAAM,wBAAwB,QAKpC,CAAC;AACF,eAAO,MAAM,kBAAkB,QAK9B,CAAC;AACF,eAAO,MAAM,mBAAmB,QAK/B,CAAC;AAEF,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,eAAO,MAAM,iBAAiB,QAA2C,CAAC;AAC1E,eAAO,MAAM,mBAAmB,QAK/B,CAAC;AACF,eAAO,MAAM,wBAAwB,QAKpC,CAAC;AACF,eAAO,MAAM,yBAAyB,QAKrC,CAAC;AACF,eAAO,MAAM,aAAa,QAA0C,CAAC;AACrE,eAAO,MAAM,kBAAkB,QAAwC,CAAC;AACxE,eAAO,MAAM,sBAAsB,QAKlC,CAAC;AACF,eAAO,MAAM,uBAAuB,aAyClC,CAAC;AA+DH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/C"}
|