@j0hanz/filesystem-context-mcp 1.2.9 → 1.3.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/README.md +254 -453
- package/dist/__tests__/lib/file-operations/compute-checksums.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations/compute-checksums.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/compute-checksums.test.js +59 -0
- package/dist/__tests__/lib/file-operations/compute-checksums.test.js.map +1 -0
- package/dist/__tests__/lib/file-operations/get-multiple-file-info.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations/get-multiple-file-info.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/get-multiple-file-info.test.js +46 -0
- package/dist/__tests__/lib/file-operations/get-multiple-file-info.test.js.map +1 -0
- package/dist/__tests__/lib/file-operations/search-content-edge-cases.test.js +1 -1
- package/dist/__tests__/lib/file-operations/search-content-edge-cases.test.js.map +1 -1
- package/dist/__tests__/lib/file-operations/search-definitions-helpers.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations/search-definitions-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/search-definitions-helpers.test.js +43 -0
- package/dist/__tests__/lib/file-operations/search-definitions-helpers.test.js.map +1 -0
- package/dist/__tests__/lib/file-operations/search-definitions.fixtures.d.ts +7 -0
- package/dist/__tests__/lib/file-operations/search-definitions.fixtures.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/search-definitions.fixtures.js +113 -0
- package/dist/__tests__/lib/file-operations/search-definitions.fixtures.js.map +1 -0
- package/dist/__tests__/lib/file-operations/search-definitions.test.js +153 -280
- package/dist/__tests__/lib/file-operations/search-definitions.test.js.map +1 -1
- package/dist/__tests__/lib/file-operations/sorting.test.d.ts +2 -0
- package/dist/__tests__/lib/file-operations/sorting.test.d.ts.map +1 -0
- package/dist/__tests__/lib/file-operations/sorting.test.js +22 -0
- package/dist/__tests__/lib/file-operations/sorting.test.js.map +1 -0
- package/dist/__tests__/lib/fs-helpers/utf8.test.d.ts +2 -0
- package/dist/__tests__/lib/fs-helpers/utf8.test.d.ts.map +1 -0
- package/dist/__tests__/lib/fs-helpers/utf8.test.js +43 -0
- package/dist/__tests__/lib/fs-helpers/utf8.test.js.map +1 -0
- package/dist/__tests__/lib/path-validation-errors.test.d.ts +2 -0
- package/dist/__tests__/lib/path-validation-errors.test.d.ts.map +1 -0
- package/dist/__tests__/lib/path-validation-errors.test.js +35 -0
- package/dist/__tests__/lib/path-validation-errors.test.js.map +1 -0
- package/dist/__tests__/lib/path-validation-roots.test.d.ts +2 -0
- package/dist/__tests__/lib/path-validation-roots.test.d.ts.map +1 -0
- package/dist/__tests__/lib/path-validation-roots.test.js +42 -0
- package/dist/__tests__/lib/path-validation-roots.test.js.map +1 -0
- package/dist/__tests__/lib/path-validation.test.js +22 -0
- package/dist/__tests__/lib/path-validation.test.js.map +1 -1
- package/dist/__tests__/security/filesystem-boundary.test.js +20 -12
- package/dist/__tests__/security/filesystem-boundary.test.js.map +1 -1
- package/dist/config/formatting.d.ts +14 -0
- package/dist/config/formatting.d.ts.map +1 -0
- package/dist/config/formatting.js +34 -0
- package/dist/config/formatting.js.map +1 -0
- package/dist/config/types.d.ts +12 -75
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/index.js +26 -2
- package/dist/index.js.map +1 -1
- package/dist/instructions.md +159 -149
- package/dist/lib/constants.d.ts +1 -5
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +31 -11
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/errors.d.ts +0 -2
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +2 -30
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/file-operations/analyze-directory-helpers.d.ts +24 -0
- package/dist/lib/file-operations/analyze-directory-helpers.d.ts.map +1 -0
- package/dist/lib/file-operations/analyze-directory-helpers.js +50 -0
- package/dist/lib/file-operations/analyze-directory-helpers.js.map +1 -0
- package/dist/lib/file-operations/analyze-directory.d.ts +1 -0
- package/dist/lib/file-operations/analyze-directory.d.ts.map +1 -1
- package/dist/lib/file-operations/analyze-directory.js +11 -59
- package/dist/lib/file-operations/analyze-directory.js.map +1 -1
- package/dist/lib/file-operations/batch-results.d.ts +13 -0
- package/dist/lib/file-operations/batch-results.d.ts.map +1 -0
- package/dist/lib/file-operations/batch-results.js +23 -0
- package/dist/lib/file-operations/batch-results.js.map +1 -0
- package/dist/lib/file-operations/compute-checksums.d.ts +10 -0
- package/dist/lib/file-operations/compute-checksums.d.ts.map +1 -0
- package/dist/lib/file-operations/compute-checksums.js +134 -0
- package/dist/lib/file-operations/compute-checksums.js.map +1 -0
- package/dist/lib/file-operations/directory-helpers.d.ts.map +1 -1
- package/dist/lib/file-operations/directory-helpers.js +18 -10
- package/dist/lib/file-operations/directory-helpers.js.map +1 -1
- package/dist/lib/file-operations/directory-tree-builders.d.ts +7 -0
- package/dist/lib/file-operations/directory-tree-builders.d.ts.map +1 -0
- package/dist/lib/file-operations/directory-tree-builders.js +58 -0
- package/dist/lib/file-operations/directory-tree-builders.js.map +1 -0
- package/dist/lib/file-operations/directory-tree-helpers.d.ts +0 -5
- package/dist/lib/file-operations/directory-tree-helpers.d.ts.map +1 -1
- package/dist/lib/file-operations/directory-tree-helpers.js +21 -64
- package/dist/lib/file-operations/directory-tree-helpers.js.map +1 -1
- package/dist/lib/file-operations/directory-tree.d.ts +1 -0
- package/dist/lib/file-operations/directory-tree.d.ts.map +1 -1
- package/dist/lib/file-operations/directory-tree.js +5 -10
- package/dist/lib/file-operations/directory-tree.js.map +1 -1
- package/dist/lib/file-operations/file-info.d.ts +3 -1
- package/dist/lib/file-operations/file-info.d.ts.map +1 -1
- package/dist/lib/file-operations/file-info.js +16 -5
- package/dist/lib/file-operations/file-info.js.map +1 -1
- package/dist/lib/file-operations/get-multiple-file-info.d.ts +7 -0
- package/dist/lib/file-operations/get-multiple-file-info.d.ts.map +1 -0
- package/dist/lib/file-operations/get-multiple-file-info.js +57 -0
- package/dist/lib/file-operations/get-multiple-file-info.js.map +1 -0
- package/dist/lib/file-operations/list-directory-entry.d.ts +18 -0
- package/dist/lib/file-operations/list-directory-entry.d.ts.map +1 -0
- package/dist/lib/file-operations/list-directory-entry.js +93 -0
- package/dist/lib/file-operations/list-directory-entry.js.map +1 -0
- package/dist/lib/file-operations/list-directory-helpers.d.ts +6 -1
- package/dist/lib/file-operations/list-directory-helpers.d.ts.map +1 -1
- package/dist/lib/file-operations/list-directory-helpers.js +83 -97
- package/dist/lib/file-operations/list-directory-helpers.js.map +1 -1
- package/dist/lib/file-operations/list-directory.d.ts +2 -0
- package/dist/lib/file-operations/list-directory.d.ts.map +1 -1
- package/dist/lib/file-operations/list-directory.js +11 -11
- package/dist/lib/file-operations/list-directory.js.map +1 -1
- package/dist/lib/file-operations/read-media-file.d.ts.map +1 -1
- package/dist/lib/file-operations/read-media-file.js +5 -1
- package/dist/lib/file-operations/read-media-file.js.map +1 -1
- package/dist/lib/file-operations/read-multiple-files.d.ts +8 -0
- package/dist/lib/file-operations/read-multiple-files.d.ts.map +1 -1
- package/dist/lib/file-operations/read-multiple-files.js +15 -7
- package/dist/lib/file-operations/read-multiple-files.js.map +1 -1
- package/dist/lib/file-operations/search/engine-options.d.ts.map +1 -1
- package/dist/lib/file-operations/search/engine-options.js +1 -8
- package/dist/lib/file-operations/search/engine-options.js.map +1 -1
- package/dist/lib/file-operations/search/engine-stream.d.ts +1 -1
- package/dist/lib/file-operations/search/engine-stream.d.ts.map +1 -1
- package/dist/lib/file-operations/search/engine-stream.js +21 -5
- package/dist/lib/file-operations/search/engine-stream.js.map +1 -1
- package/dist/lib/file-operations/search/engine.d.ts +1 -1
- package/dist/lib/file-operations/search/engine.d.ts.map +1 -1
- package/dist/lib/file-operations/search/engine.js +43 -3
- package/dist/lib/file-operations/search/engine.js.map +1 -1
- package/dist/lib/file-operations/search/file-processor.d.ts.map +1 -1
- package/dist/lib/file-operations/search/file-processor.js +94 -54
- package/dist/lib/file-operations/search/file-processor.js.map +1 -1
- package/dist/lib/file-operations/search/match-strategy.d.ts.map +1 -1
- package/dist/lib/file-operations/search/match-strategy.js +2 -1
- package/dist/lib/file-operations/search/match-strategy.js.map +1 -1
- package/dist/lib/file-operations/search/types.d.ts +1 -0
- package/dist/lib/file-operations/search/types.d.ts.map +1 -1
- package/dist/lib/file-operations/search-content.d.ts +1 -0
- package/dist/lib/file-operations/search-content.d.ts.map +1 -1
- package/dist/lib/file-operations/search-content.js +1 -1
- package/dist/lib/file-operations/search-content.js.map +1 -1
- package/dist/lib/file-operations/search-definitions/matchers.d.ts +12 -0
- package/dist/lib/file-operations/search-definitions/matchers.d.ts.map +1 -0
- package/dist/lib/file-operations/search-definitions/matchers.js +122 -0
- package/dist/lib/file-operations/search-definitions/matchers.js.map +1 -0
- package/dist/lib/file-operations/search-definitions/patterns.d.ts +14 -0
- package/dist/lib/file-operations/search-definitions/patterns.d.ts.map +1 -0
- package/dist/lib/file-operations/search-definitions/patterns.js +83 -0
- package/dist/lib/file-operations/search-definitions/patterns.js.map +1 -0
- package/dist/lib/file-operations/search-definitions.d.ts.map +1 -1
- package/dist/lib/file-operations/search-definitions.js +25 -199
- package/dist/lib/file-operations/search-definitions.js.map +1 -1
- package/dist/lib/file-operations/search-files-helpers.d.ts +3 -27
- package/dist/lib/file-operations/search-files-helpers.d.ts.map +1 -1
- package/dist/lib/file-operations/search-files-helpers.js +18 -45
- package/dist/lib/file-operations/search-files-helpers.js.map +1 -1
- package/dist/lib/file-operations/search-files-options.d.ts +33 -0
- package/dist/lib/file-operations/search-files-options.d.ts.map +1 -0
- package/dist/lib/file-operations/search-files-options.js +33 -0
- package/dist/lib/file-operations/search-files-options.js.map +1 -0
- package/dist/lib/file-operations/search-files.d.ts +1 -1
- package/dist/lib/file-operations/search-files.d.ts.map +1 -1
- package/dist/lib/file-operations/search-files.js +9 -3
- package/dist/lib/file-operations/search-files.js.map +1 -1
- package/dist/lib/file-operations/sorting.d.ts.map +1 -1
- package/dist/lib/file-operations/sorting.js +39 -14
- package/dist/lib/file-operations/sorting.js.map +1 -1
- package/dist/lib/file-operations.d.ts +1 -4
- package/dist/lib/file-operations.d.ts.map +1 -1
- package/dist/lib/file-operations.js +1 -4
- package/dist/lib/file-operations.js.map +1 -1
- package/dist/lib/fs-helpers/binary-detect.d.ts.map +1 -1
- package/dist/lib/fs-helpers/binary-detect.js +13 -16
- package/dist/lib/fs-helpers/binary-detect.js.map +1 -1
- package/dist/lib/fs-helpers/concurrency.d.ts +1 -1
- package/dist/lib/fs-helpers/concurrency.d.ts.map +1 -1
- package/dist/lib/fs-helpers/concurrency.js +37 -3
- package/dist/lib/fs-helpers/concurrency.js.map +1 -1
- package/dist/lib/fs-helpers/readers/head-file.js +1 -1
- package/dist/lib/fs-helpers/readers/head-file.js.map +1 -1
- package/dist/lib/fs-helpers/readers/read-buffer.d.ts +2 -0
- package/dist/lib/fs-helpers/readers/read-buffer.d.ts.map +1 -0
- package/dist/lib/fs-helpers/readers/read-buffer.js +52 -0
- package/dist/lib/fs-helpers/readers/read-buffer.js.map +1 -0
- package/dist/lib/fs-helpers/readers/read-file-content.d.ts +36 -0
- package/dist/lib/fs-helpers/readers/read-file-content.d.ts.map +1 -0
- package/dist/lib/fs-helpers/readers/read-file-content.js +49 -0
- package/dist/lib/fs-helpers/readers/read-file-content.js.map +1 -0
- package/dist/lib/fs-helpers/readers/read-file.d.ts +9 -0
- package/dist/lib/fs-helpers/readers/read-file.d.ts.map +1 -1
- package/dist/lib/fs-helpers/readers/read-file.js +56 -36
- package/dist/lib/fs-helpers/readers/read-file.js.map +1 -1
- package/dist/lib/fs-helpers/readers/tail-file.js +1 -1
- package/dist/lib/fs-helpers/readers/tail-file.js.map +1 -1
- package/dist/lib/merge-defined.d.ts +2 -0
- package/dist/lib/merge-defined.d.ts.map +1 -0
- package/dist/lib/merge-defined.js +8 -0
- package/dist/lib/merge-defined.js.map +1 -0
- package/dist/lib/path-utils.d.ts +1 -0
- package/dist/lib/path-utils.d.ts.map +1 -1
- package/dist/lib/path-utils.js +12 -0
- package/dist/lib/path-utils.js.map +1 -1
- package/dist/lib/path-validation/allowed-directories.d.ts.map +1 -1
- package/dist/lib/path-validation/allowed-directories.js +2 -9
- package/dist/lib/path-validation/allowed-directories.js.map +1 -1
- package/dist/lib/path-validation/errors.js +2 -2
- package/dist/lib/path-validation/errors.js.map +1 -1
- package/dist/lib/path-validation/validators.d.ts.map +1 -1
- package/dist/lib/path-validation/validators.js +11 -1
- package/dist/lib/path-validation/validators.js.map +1 -1
- package/dist/schemas/common.d.ts +0 -18
- package/dist/schemas/common.d.ts.map +1 -1
- package/dist/schemas/common.js +0 -10
- package/dist/schemas/common.js.map +1 -1
- package/dist/schemas/index.d.ts +2 -2
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +2 -2
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/input-helpers.d.ts +1 -4
- package/dist/schemas/input-helpers.d.ts.map +1 -1
- package/dist/schemas/input-helpers.js +9 -33
- package/dist/schemas/input-helpers.js.map +1 -1
- package/dist/schemas/inputs/checksums.d.ts +8 -0
- package/dist/schemas/inputs/checksums.d.ts.map +1 -0
- package/dist/schemas/inputs/checksums.js +25 -0
- package/dist/schemas/inputs/checksums.js.map +1 -0
- package/dist/schemas/inputs/directory.d.ts +13 -0
- package/dist/schemas/inputs/directory.d.ts.map +1 -0
- package/dist/schemas/inputs/directory.js +33 -0
- package/dist/schemas/inputs/directory.js.map +1 -0
- package/dist/schemas/inputs/file-info.d.ts +9 -0
- package/dist/schemas/inputs/file-info.d.ts.map +1 -0
- package/dist/schemas/inputs/file-info.js +20 -0
- package/dist/schemas/inputs/file-info.js.map +1 -0
- package/dist/schemas/inputs/read.d.ts +22 -0
- package/dist/schemas/inputs/read.d.ts.map +1 -0
- package/dist/schemas/inputs/read.js +39 -0
- package/dist/schemas/inputs/read.js.map +1 -0
- package/dist/schemas/inputs/search.d.ts +33 -0
- package/dist/schemas/inputs/search.d.ts.map +1 -0
- package/dist/schemas/inputs/search.js +89 -0
- package/dist/schemas/inputs/search.js.map +1 -0
- package/dist/schemas/inputs.d.ts +4 -94
- package/dist/schemas/inputs.d.ts.map +1 -1
- package/dist/schemas/inputs.js +4 -227
- package/dist/schemas/inputs.js.map +1 -1
- package/dist/schemas/output-helpers.d.ts +59 -0
- package/dist/schemas/output-helpers.d.ts.map +1 -1
- package/dist/schemas/output-helpers.js +31 -0
- package/dist/schemas/output-helpers.js.map +1 -1
- package/dist/schemas/outputs/checksums.d.ts +93 -0
- package/dist/schemas/outputs/checksums.d.ts.map +1 -0
- package/dist/schemas/outputs/checksums.js +18 -0
- package/dist/schemas/outputs/checksums.js.map +1 -0
- package/dist/schemas/outputs/directory.d.ts +257 -0
- package/dist/schemas/outputs/directory.d.ts.map +1 -0
- package/dist/schemas/outputs/directory.js +63 -0
- package/dist/schemas/outputs/directory.js.map +1 -0
- package/dist/schemas/outputs/file-info.d.ts +270 -0
- package/dist/schemas/outputs/file-info.d.ts.map +1 -0
- package/dist/schemas/outputs/file-info.js +30 -0
- package/dist/schemas/outputs/file-info.js.map +1 -0
- package/dist/schemas/outputs/read.d.ts +282 -0
- package/dist/schemas/outputs/read.d.ts.map +1 -0
- package/dist/schemas/outputs/read.js +62 -0
- package/dist/schemas/outputs/read.js.map +1 -0
- package/dist/schemas/outputs/search.d.ts +370 -0
- package/dist/schemas/outputs/search.d.ts.map +1 -0
- package/dist/schemas/outputs/search.js +96 -0
- package/dist/schemas/outputs/search.js.map +1 -0
- package/dist/schemas/outputs.d.ts +4 -1059
- package/dist/schemas/outputs.d.ts.map +1 -1
- package/dist/schemas/outputs.js +4 -229
- package/dist/schemas/outputs.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +28 -15
- package/dist/server.js.map +1 -1
- package/dist/tools/analyze-directory.d.ts.map +1 -1
- package/dist/tools/analyze-directory.js +26 -28
- package/dist/tools/analyze-directory.js.map +1 -1
- package/dist/tools/compute-checksums.d.ts +3 -0
- package/dist/tools/compute-checksums.d.ts.map +1 -0
- package/dist/tools/compute-checksums.js +69 -0
- package/dist/tools/compute-checksums.js.map +1 -0
- package/dist/tools/directory-tree.d.ts.map +1 -1
- package/dist/tools/directory-tree.js +17 -11
- 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 +8 -44
- package/dist/tools/get-file-info.js.map +1 -1
- package/dist/tools/get-multiple-file-info.d.ts +3 -0
- package/dist/tools/get-multiple-file-info.d.ts.map +1 -0
- package/dist/tools/get-multiple-file-info.js +53 -0
- package/dist/tools/get-multiple-file-info.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -8
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/list-allowed-dirs.d.ts.map +1 -1
- package/dist/tools/list-allowed-dirs.js +46 -29
- 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 +83 -77
- 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 +57 -37
- 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 +8 -6
- 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 +58 -23
- 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 +14 -16
- package/dist/tools/search-content.js.map +1 -1
- package/dist/tools/search-definitions.d.ts.map +1 -1
- package/dist/tools/search-definitions.js +59 -42
- package/dist/tools/search-definitions.js.map +1 -1
- package/dist/tools/search-files.d.ts.map +1 -1
- package/dist/tools/search-files.js +65 -45
- package/dist/tools/search-files.js.map +1 -1
- package/dist/tools/shared/file-info.d.ts +17 -0
- package/dist/tools/shared/file-info.d.ts.map +1 -0
- package/dist/tools/shared/file-info.js +40 -0
- package/dist/tools/shared/file-info.js.map +1 -0
- package/dist/tools/shared/formatting.d.ts +5 -0
- package/dist/tools/shared/formatting.d.ts.map +1 -1
- package/dist/tools/shared/formatting.js +21 -1
- package/dist/tools/shared/formatting.js.map +1 -1
- package/dist/tools/shared/read-range.d.ts +7 -0
- package/dist/tools/shared/read-range.d.ts.map +1 -0
- package/dist/tools/shared/read-range.js +22 -0
- package/dist/tools/shared/read-range.js.map +1 -0
- package/dist/tools/shared/search-formatting.d.ts.map +1 -1
- package/dist/tools/shared/search-formatting.js +57 -29
- package/dist/tools/shared/search-formatting.js.map +1 -1
- package/dist/tools/tool-response.d.ts +22 -0
- package/dist/tools/tool-response.d.ts.map +1 -1
- package/dist/tools/tool-response.js +30 -0
- package/dist/tools/tool-response.js.map +1 -1
- package/package.json +2 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { formatBytes, formatOperationSummary, joinLines, } from '../config/formatting.js';
|
|
2
|
+
import { ErrorCode } from '../lib/errors.js';
|
|
2
3
|
import { getDirectoryTree } from '../lib/file-operations.js';
|
|
3
4
|
import { DirectoryTreeInputSchema, DirectoryTreeOutputSchema, } from '../schemas/index.js';
|
|
4
|
-
import {
|
|
5
|
-
import { buildToolResponse } from './tool-response.js';
|
|
5
|
+
import { buildToolErrorResponse, buildToolResponse, } from './tool-response.js';
|
|
6
6
|
function formatTreeEntry(entry, indent = '') {
|
|
7
|
-
return formatTreeEntryLines(entry, indent)
|
|
7
|
+
return joinLines(formatTreeEntryLines(entry, indent));
|
|
8
8
|
}
|
|
9
9
|
function formatTreeEntryLines(entry, indent) {
|
|
10
10
|
const lines = [formatTreeEntryLine(entry, indent)];
|
|
@@ -25,8 +25,12 @@ function buildStructuredResult(result) {
|
|
|
25
25
|
summary: result.summary,
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
|
-
function buildTextResult(result) {
|
|
28
|
+
function buildTextResult(result, includeSize) {
|
|
29
29
|
let textOutput = formatTreeEntry(result.tree);
|
|
30
|
+
if (includeSize === false) {
|
|
31
|
+
textOutput +=
|
|
32
|
+
'\n(Size omitted. Set includeSize=true to include file sizes in the tree.)';
|
|
33
|
+
}
|
|
30
34
|
textOutput += formatOperationSummary({
|
|
31
35
|
truncated: result.summary.truncated,
|
|
32
36
|
truncatedReason: 'tree was truncated',
|
|
@@ -36,16 +40,17 @@ function buildTextResult(result) {
|
|
|
36
40
|
});
|
|
37
41
|
return textOutput;
|
|
38
42
|
}
|
|
39
|
-
async function handleDirectoryTree({ path, maxDepth, excludePatterns, includeHidden, includeSize, maxFiles, }) {
|
|
43
|
+
async function handleDirectoryTree({ path, maxDepth, excludePatterns, includeHidden, includeSize, maxFiles, }, signal) {
|
|
40
44
|
const result = await getDirectoryTree(path, {
|
|
41
45
|
maxDepth,
|
|
42
46
|
excludePatterns,
|
|
43
47
|
includeHidden,
|
|
44
48
|
includeSize,
|
|
45
49
|
maxFiles,
|
|
50
|
+
signal,
|
|
46
51
|
});
|
|
47
52
|
const structured = buildStructuredResult(result);
|
|
48
|
-
const textOutput = buildTextResult(result);
|
|
53
|
+
const textOutput = buildTextResult(result, includeSize);
|
|
49
54
|
return buildToolResponse(textOutput, structured);
|
|
50
55
|
}
|
|
51
56
|
const DIRECTORY_TREE_TOOL = {
|
|
@@ -64,13 +69,14 @@ const DIRECTORY_TREE_TOOL = {
|
|
|
64
69
|
},
|
|
65
70
|
};
|
|
66
71
|
export function registerDirectoryTreeTool(server) {
|
|
67
|
-
|
|
72
|
+
const handler = async (args, extra) => {
|
|
68
73
|
try {
|
|
69
|
-
return await handleDirectoryTree(args);
|
|
74
|
+
return await handleDirectoryTree(args, extra.signal);
|
|
70
75
|
}
|
|
71
76
|
catch (error) {
|
|
72
|
-
|
|
77
|
+
return buildToolErrorResponse(error, ErrorCode.E_NOT_DIRECTORY, args.path);
|
|
73
78
|
}
|
|
74
|
-
}
|
|
79
|
+
};
|
|
80
|
+
server.registerTool('directory_tree', DIRECTORY_TREE_TOOL, handler);
|
|
75
81
|
}
|
|
76
82
|
//# sourceMappingURL=directory-tree.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directory-tree.js","sourceRoot":"","sources":["../../src/tools/directory-tree.ts"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"directory-tree.js","sourceRoot":"","sources":["../../src/tools/directory-tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-file-info.d.ts","sourceRoot":"","sources":["../../src/tools/get-file-info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"get-file-info.d.ts","sourceRoot":"","sources":["../../src/tools/get-file-info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA4DzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAU/D"}
|
|
@@ -1,52 +1,22 @@
|
|
|
1
|
-
import { ErrorCode
|
|
1
|
+
import { ErrorCode } from '../lib/errors.js';
|
|
2
2
|
import { getFileInfo } from '../lib/file-operations.js';
|
|
3
3
|
import { GetFileInfoInputSchema, GetFileInfoOutputSchema, } from '../schemas/index.js';
|
|
4
|
-
import {
|
|
5
|
-
import { buildToolResponse } from './tool-response.js';
|
|
6
|
-
function formatFileInfo(info) {
|
|
7
|
-
const lines = [
|
|
8
|
-
`Name: ${info.name}`,
|
|
9
|
-
`Path: ${info.path}`,
|
|
10
|
-
`Type: ${info.type}`,
|
|
11
|
-
`Size: ${formatBytes(info.size)}`,
|
|
12
|
-
`Created: ${formatDate(info.created)}`,
|
|
13
|
-
`Modified: ${formatDate(info.modified)}`,
|
|
14
|
-
`Accessed: ${formatDate(info.accessed)}`,
|
|
15
|
-
`Permissions: ${info.permissions}`,
|
|
16
|
-
`Hidden: ${info.isHidden ? 'Yes' : 'No'}`,
|
|
17
|
-
];
|
|
18
|
-
if (info.mimeType)
|
|
19
|
-
lines.push(`MIME Type: ${info.mimeType}`);
|
|
20
|
-
if (info.symlinkTarget)
|
|
21
|
-
lines.push(`Symlink Target: ${info.symlinkTarget}`);
|
|
22
|
-
return lines.join('\n');
|
|
23
|
-
}
|
|
4
|
+
import { buildFileInfoPayload, formatFileInfoDetails, } from './shared/file-info.js';
|
|
5
|
+
import { buildToolErrorResponse, buildToolResponse, withToolErrorHandling, } from './tool-response.js';
|
|
24
6
|
function buildStructuredResult(info) {
|
|
25
7
|
return {
|
|
26
8
|
ok: true,
|
|
27
|
-
info:
|
|
28
|
-
name: info.name,
|
|
29
|
-
path: info.path,
|
|
30
|
-
type: info.type,
|
|
31
|
-
size: info.size,
|
|
32
|
-
created: info.created.toISOString(),
|
|
33
|
-
modified: info.modified.toISOString(),
|
|
34
|
-
accessed: info.accessed.toISOString(),
|
|
35
|
-
permissions: info.permissions,
|
|
36
|
-
isHidden: info.isHidden,
|
|
37
|
-
mimeType: info.mimeType,
|
|
38
|
-
symlinkTarget: info.symlinkTarget,
|
|
39
|
-
},
|
|
9
|
+
info: buildFileInfoPayload(info),
|
|
40
10
|
};
|
|
41
11
|
}
|
|
42
12
|
async function handleGetFileInfo({ path, }) {
|
|
43
13
|
const info = await getFileInfo(path);
|
|
44
14
|
const structured = buildStructuredResult(info);
|
|
45
|
-
return buildToolResponse(
|
|
15
|
+
return buildToolResponse(formatFileInfoDetails(info), structured);
|
|
46
16
|
}
|
|
47
17
|
const GET_FILE_INFO_TOOL = {
|
|
48
18
|
title: 'Get File Info',
|
|
49
|
-
description: 'Retrieve detailed metadata about a file or directory without reading
|
|
19
|
+
description: 'Retrieve detailed metadata about a file or directory without reading contents. ' +
|
|
50
20
|
'Returns: name, path, type, size, timestamps (created/modified/accessed), permissions, ' +
|
|
51
21
|
'MIME type (for files), hidden status, and symlink target (if applicable). ' +
|
|
52
22
|
'Use this to check file properties before reading large files.',
|
|
@@ -59,13 +29,7 @@ const GET_FILE_INFO_TOOL = {
|
|
|
59
29
|
},
|
|
60
30
|
};
|
|
61
31
|
export function registerGetFileInfoTool(server) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
return await handleGetFileInfo(args);
|
|
65
|
-
}
|
|
66
|
-
catch (error) {
|
|
67
|
-
throw toRpcError(error, ErrorCode.E_NOT_FOUND, args.path);
|
|
68
|
-
}
|
|
69
|
-
});
|
|
32
|
+
const handler = (args) => withToolErrorHandling(() => handleGetFileInfo(args), (error) => buildToolErrorResponse(error, ErrorCode.E_NOT_FOUND, args.path));
|
|
33
|
+
server.registerTool('get_file_info', GET_FILE_INFO_TOOL, handler);
|
|
70
34
|
}
|
|
71
35
|
//# sourceMappingURL=get-file-info.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-file-info.js","sourceRoot":"","sources":["../../src/tools/get-file-info.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"get-file-info.js","sourceRoot":"","sources":["../../src/tools/get-file-info.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EAGjB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAK5B,SAAS,qBAAqB,CAC5B,IAA6C;IAE7C,OAAO;QACL,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,oBAAoB,CAAC,IAAI,CAAC;KACjC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,EAC/B,IAAI,GAGL;IACC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,iBAAiB,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,kBAAkB,GAAG;IACzB,KAAK,EAAE,eAAe;IACtB,WAAW,EACT,iFAAiF;QACjF,wFAAwF;QACxF,4EAA4E;QAC5E,+DAA+D;IACjE,WAAW,EAAE,sBAAsB;IACnC,YAAY,EAAE,uBAAuB,CAAC,KAAK;IAC3C,WAAW,EAAE;QACX,YAAY,EAAE,IAAI;QAClB,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,IAAI;KACpB;CACO,CAAC;AAEX,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,OAAO,GAAG,CACd,IAAqB,EAC6B,EAAE,CACpD,qBAAqB,CACnB,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAC7B,CAAC,KAAK,EAAE,EAAE,CAAC,sBAAsB,CAAC,KAAK,EAAE,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAC3E,CAAC;IAEJ,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-multiple-file-info.d.ts","sourceRoot":"","sources":["../../src/tools/get-multiple-file-info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyFzE,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAcvE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { formatBytes, joinLines } from '../config/formatting.js';
|
|
2
|
+
import { ErrorCode } from '../lib/errors.js';
|
|
3
|
+
import { getMultipleFileInfo } from '../lib/file-operations.js';
|
|
4
|
+
import { GetMultipleFileInfoInputSchema, GetMultipleFileInfoOutputSchema, } from '../schemas/index.js';
|
|
5
|
+
import { buildFileInfoPayload, formatFileInfoSummary, } from './shared/file-info.js';
|
|
6
|
+
import { buildToolErrorResponse, buildToolResponse, withToolErrorHandling, } from './tool-response.js';
|
|
7
|
+
function buildStructuredResult(result) {
|
|
8
|
+
return {
|
|
9
|
+
ok: true,
|
|
10
|
+
results: result.results.map((r) => ({
|
|
11
|
+
path: r.path,
|
|
12
|
+
info: r.info ? buildFileInfoPayload(r.info) : undefined,
|
|
13
|
+
error: r.error,
|
|
14
|
+
})),
|
|
15
|
+
summary: result.summary,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function buildTextResult(result) {
|
|
19
|
+
const fileBlocks = result.results.flatMap(formatFileInfoBlock);
|
|
20
|
+
const summary = `${result.summary.succeeded}/${result.summary.total} ok | ${formatBytes(result.summary.totalSize)}`;
|
|
21
|
+
return joinLines([`File info (${summary}):`, ...fileBlocks]);
|
|
22
|
+
}
|
|
23
|
+
function formatFileInfoBlock(item) {
|
|
24
|
+
if (!item.info) {
|
|
25
|
+
return [`${item.path} [error: ${item.error ?? 'unknown'}]`];
|
|
26
|
+
}
|
|
27
|
+
return [formatFileInfoSummary(item.path, item.info)];
|
|
28
|
+
}
|
|
29
|
+
async function handleGetMultipleFileInfo(args) {
|
|
30
|
+
const result = await getMultipleFileInfo(args.paths, {
|
|
31
|
+
includeMimeType: args.includeMimeType,
|
|
32
|
+
});
|
|
33
|
+
return buildToolResponse(buildTextResult(result), buildStructuredResult(result));
|
|
34
|
+
}
|
|
35
|
+
const GET_MULTIPLE_FILE_INFO_TOOL = {
|
|
36
|
+
title: 'Get Multiple File Info',
|
|
37
|
+
description: 'Retrieve detailed metadata about multiple files or directories in a single operation (parallel processing). ' +
|
|
38
|
+
'More efficient than calling get_file_info repeatedly. ' +
|
|
39
|
+
'Individual file errors do not fail the entire operation; each file reports success or error independently. ' +
|
|
40
|
+
'Returns: name, path, type, size, timestamps, permissions, MIME type, and symlink target for each path.',
|
|
41
|
+
inputSchema: GetMultipleFileInfoInputSchema,
|
|
42
|
+
outputSchema: GetMultipleFileInfoOutputSchema.shape,
|
|
43
|
+
annotations: {
|
|
44
|
+
readOnlyHint: true,
|
|
45
|
+
idempotentHint: true,
|
|
46
|
+
openWorldHint: true,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
export function registerGetMultipleFileInfoTool(server) {
|
|
50
|
+
const handler = (args) => withToolErrorHandling(() => handleGetMultipleFileInfo(args), (error) => buildToolErrorResponse(error, ErrorCode.E_UNKNOWN));
|
|
51
|
+
server.registerTool('get_multiple_file_info', GET_MULTIPLE_FILE_INFO_TOOL, handler);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=get-multiple-file-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-multiple-file-info.js","sourceRoot":"","sources":["../../src/tools/get-multiple-file-info.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CASxD"}
|
package/dist/tools/index.js
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
import { registerAnalyzeDirectoryTool } from './analyze-directory.js';
|
|
2
|
-
import { registerDirectoryTreeTool } from './directory-tree.js';
|
|
3
1
|
import { registerGetFileInfoTool } from './get-file-info.js';
|
|
2
|
+
import { registerGetMultipleFileInfoTool } from './get-multiple-file-info.js';
|
|
4
3
|
import { registerListAllowedDirectoriesTool } from './list-allowed-dirs.js';
|
|
5
4
|
import { registerListDirectoryTool } from './list-directory.js';
|
|
6
5
|
import { registerReadFileTool } from './read-file.js';
|
|
7
|
-
import { registerReadMediaFileTool } from './read-media-file.js';
|
|
8
6
|
import { registerReadMultipleFilesTool } from './read-multiple-files.js';
|
|
9
7
|
import { registerSearchContentTool } from './search-content.js';
|
|
10
|
-
import { registerSearchDefinitionsTool } from './search-definitions.js';
|
|
11
8
|
import { registerSearchFilesTool } from './search-files.js';
|
|
12
9
|
export function registerAllTools(server) {
|
|
13
10
|
registerListAllowedDirectoriesTool(server);
|
|
@@ -16,10 +13,7 @@ export function registerAllTools(server) {
|
|
|
16
13
|
registerReadFileTool(server);
|
|
17
14
|
registerReadMultipleFilesTool(server);
|
|
18
15
|
registerGetFileInfoTool(server);
|
|
16
|
+
registerGetMultipleFileInfoTool(server);
|
|
19
17
|
registerSearchContentTool(server);
|
|
20
|
-
registerSearchDefinitionsTool(server);
|
|
21
|
-
registerAnalyzeDirectoryTool(server);
|
|
22
|
-
registerDirectoryTreeTool(server);
|
|
23
|
-
registerReadMediaFileTool(server);
|
|
24
18
|
}
|
|
25
19
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,+BAA+B,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,kCAAkC,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,kCAAkC,CAAC,MAAM,CAAC,CAAC;IAC3C,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,+BAA+B,CAAC,MAAM,CAAC,CAAC;IACxC,yBAAyB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-allowed-dirs.d.ts","sourceRoot":"","sources":["../../src/tools/list-allowed-dirs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"list-allowed-dirs.d.ts","sourceRoot":"","sources":["../../src/tools/list-allowed-dirs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsIzE,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAa1E"}
|
|
@@ -1,31 +1,54 @@
|
|
|
1
1
|
import * as fs from 'node:fs/promises';
|
|
2
|
-
import {
|
|
2
|
+
import { joinLines } from '../config/formatting.js';
|
|
3
|
+
import { ErrorCode, isNodeError } from '../lib/errors.js';
|
|
3
4
|
import { getAllowedDirectories } from '../lib/path-validation.js';
|
|
4
5
|
import { ListAllowedDirectoriesOutputSchema } from '../schemas/index.js';
|
|
5
|
-
import { buildToolResponse } from './tool-response.js';
|
|
6
|
-
|
|
6
|
+
import { buildToolErrorResponse, buildToolResponse, withToolErrorHandling, } from './tool-response.js';
|
|
7
|
+
const ACCESS_STATUS_BY_CODE = {
|
|
8
|
+
EACCES: { accessible: true, readable: false },
|
|
9
|
+
EPERM: { accessible: true, readable: false },
|
|
10
|
+
ENOENT: { accessible: false, readable: false },
|
|
11
|
+
ENOTDIR: { accessible: false, readable: false },
|
|
12
|
+
};
|
|
13
|
+
function buildTextResult(dirs, accessStatus) {
|
|
7
14
|
if (dirs.length === 0) {
|
|
8
|
-
return 'No directories
|
|
15
|
+
return 'No directories allowed.';
|
|
16
|
+
}
|
|
17
|
+
const accessByPath = new Map(accessStatus.map((status) => [status.path, status]));
|
|
18
|
+
const lines = dirs.map((dir) => {
|
|
19
|
+
const access = accessByPath.get(dir);
|
|
20
|
+
const tag = buildAccessTag(access);
|
|
21
|
+
return tag ? `${dir} ${tag}` : dir;
|
|
22
|
+
});
|
|
23
|
+
return joinLines([`Allowed directories (${dirs.length}):`, ...lines]);
|
|
24
|
+
}
|
|
25
|
+
function buildAccessTag(access) {
|
|
26
|
+
if (!access)
|
|
27
|
+
return undefined;
|
|
28
|
+
if (!access.accessible)
|
|
29
|
+
return '[inaccessible]';
|
|
30
|
+
if (!access.readable)
|
|
31
|
+
return '[no read access]';
|
|
32
|
+
return '[readable]';
|
|
33
|
+
}
|
|
34
|
+
function resolveAccessFromError(error, dirPath) {
|
|
35
|
+
if (!isNodeError(error)) {
|
|
36
|
+
return { path: dirPath, accessible: false, readable: false };
|
|
9
37
|
}
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
38
|
+
const status = error.code ? ACCESS_STATUS_BY_CODE[error.code] : undefined;
|
|
39
|
+
if (!status) {
|
|
40
|
+
return { path: dirPath, accessible: false, readable: false };
|
|
13
41
|
}
|
|
14
|
-
return
|
|
42
|
+
return { path: dirPath, ...status };
|
|
15
43
|
}
|
|
16
44
|
async function checkDirectoryAccess(dirPath) {
|
|
17
45
|
try {
|
|
18
|
-
await fs.
|
|
46
|
+
const dir = await fs.opendir(dirPath);
|
|
47
|
+
await dir.close();
|
|
19
48
|
return { path: dirPath, accessible: true, readable: true };
|
|
20
49
|
}
|
|
21
|
-
catch {
|
|
22
|
-
|
|
23
|
-
await fs.access(dirPath, fs.constants.F_OK);
|
|
24
|
-
return { path: dirPath, accessible: true, readable: false };
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
return { path: dirPath, accessible: false, readable: false };
|
|
28
|
-
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
return resolveAccessFromError(error, dirPath);
|
|
29
52
|
}
|
|
30
53
|
}
|
|
31
54
|
function buildHint(count) {
|
|
@@ -49,13 +72,13 @@ async function handleListAllowedDirectories() {
|
|
|
49
72
|
accessStatus,
|
|
50
73
|
hint,
|
|
51
74
|
};
|
|
52
|
-
return buildToolResponse(
|
|
75
|
+
return buildToolResponse(buildTextResult(dirs, accessStatus), structured);
|
|
53
76
|
}
|
|
54
77
|
const LIST_ALLOWED_DIRECTORIES_TOOL = {
|
|
55
78
|
title: 'List Allowed Directories',
|
|
56
|
-
description: '
|
|
57
|
-
'Call this
|
|
58
|
-
'All other tools
|
|
79
|
+
description: 'List the directories this server is permitted to access, plus access status. ' +
|
|
80
|
+
'Call this first to understand the scope of available file operations. ' +
|
|
81
|
+
'All other tools only work within these directories for security.',
|
|
59
82
|
outputSchema: ListAllowedDirectoriesOutputSchema.shape,
|
|
60
83
|
annotations: {
|
|
61
84
|
readOnlyHint: true,
|
|
@@ -64,13 +87,7 @@ const LIST_ALLOWED_DIRECTORIES_TOOL = {
|
|
|
64
87
|
},
|
|
65
88
|
};
|
|
66
89
|
export function registerListAllowedDirectoriesTool(server) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return await handleListAllowedDirectories();
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
throw toRpcError(error, ErrorCode.E_UNKNOWN);
|
|
73
|
-
}
|
|
74
|
-
});
|
|
90
|
+
const handler = () => withToolErrorHandling(handleListAllowedDirectories, (error) => buildToolErrorResponse(error, ErrorCode.E_UNKNOWN));
|
|
91
|
+
server.registerTool('list_allowed_directories', LIST_ALLOWED_DIRECTORIES_TOOL, handler);
|
|
75
92
|
}
|
|
76
93
|
//# sourceMappingURL=list-allowed-dirs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-allowed-dirs.js","sourceRoot":"","sources":["../../src/tools/list-allowed-dirs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAMvC,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"list-allowed-dirs.js","sourceRoot":"","sources":["../../src/tools/list-allowed-dirs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-directory.d.ts","sourceRoot":"","sources":["../../src/tools/list-directory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"list-directory.d.ts","sourceRoot":"","sources":["../../src/tools/list-directory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkMzE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAYjE"}
|
|
@@ -1,61 +1,48 @@
|
|
|
1
1
|
import * as pathModule from 'node:path';
|
|
2
|
-
import {
|
|
2
|
+
import { formatBytes, formatOperationSummary, joinLines, } from '../config/formatting.js';
|
|
3
|
+
import { DEFAULT_LIST_MAX_ENTRIES, DEFAULT_MAX_DEPTH, } from '../lib/constants.js';
|
|
4
|
+
import { ErrorCode } from '../lib/errors.js';
|
|
3
5
|
import { listDirectory } from '../lib/file-operations.js';
|
|
4
6
|
import { ListDirectoryInputSchema, ListDirectoryOutputSchema, } from '../schemas/index.js';
|
|
5
|
-
import {
|
|
6
|
-
import { buildToolResponse } from './tool-response.js';
|
|
7
|
+
import { buildToolErrorResponse, buildToolResponse, withToolErrorHandling, } from './tool-response.js';
|
|
7
8
|
function getExtension(name, isFile) {
|
|
8
9
|
if (!isFile)
|
|
9
10
|
return undefined;
|
|
10
11
|
const ext = pathModule.extname(name);
|
|
11
12
|
return ext ? ext.slice(1) : undefined;
|
|
12
13
|
}
|
|
13
|
-
function formatDirectoryListing(entries, basePath) {
|
|
14
|
-
if (entries.length === 0)
|
|
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
|
-
function formatFileLines(files) {
|
|
41
|
-
if (files.length === 0)
|
|
42
|
-
return [];
|
|
43
|
-
return [
|
|
44
|
-
'Files:',
|
|
45
|
-
...files.map((file) => {
|
|
46
|
-
const size = file.size !== undefined ? ` (${formatBytes(file.size)})` : '';
|
|
47
|
-
const tag = file.type === 'symlink' ? '[LINK]' : '[FILE]';
|
|
48
|
-
const symlink = file.symlinkTarget ? ` -> ${file.symlinkTarget}` : '';
|
|
49
|
-
return ` ${tag} ${file.relativePath}${size}${symlink}`;
|
|
50
|
-
}),
|
|
51
|
-
];
|
|
14
|
+
function formatDirectoryListing(entries, basePath, summary) {
|
|
15
|
+
if (entries.length === 0) {
|
|
16
|
+
if (summary.entriesScanned && summary.entriesScanned > 0) {
|
|
17
|
+
if (summary.entriesVisible === 0) {
|
|
18
|
+
return 'No entries matched visibility filters (hidden/excludePatterns).';
|
|
19
|
+
}
|
|
20
|
+
return 'No entries matched the provided pattern.';
|
|
21
|
+
}
|
|
22
|
+
return 'Empty directory';
|
|
23
|
+
}
|
|
24
|
+
const dirs = entries.filter((e) => e.type === 'directory').length;
|
|
25
|
+
const files = entries.length - dirs;
|
|
26
|
+
const entryLines = entries.map((entry) => {
|
|
27
|
+
if (entry.type === 'directory') {
|
|
28
|
+
const symlink = entry.symlinkTarget ? ` -> ${entry.symlinkTarget}` : '';
|
|
29
|
+
return `[DIR] ${entry.relativePath}${symlink}`;
|
|
30
|
+
}
|
|
31
|
+
const size = entry.size !== undefined ? ` (${formatBytes(entry.size)})` : '';
|
|
32
|
+
const tag = entry.type === 'symlink' ? '[LINK]' : '[FILE]';
|
|
33
|
+
const symlink = entry.symlinkTarget ? ` -> ${entry.symlinkTarget}` : '';
|
|
34
|
+
return `${tag} ${entry.relativePath}${size}${symlink}`;
|
|
35
|
+
});
|
|
36
|
+
const lines = [`${basePath} (${dirs} dirs, ${files} files):`, ...entryLines];
|
|
37
|
+
return joinLines(lines);
|
|
52
38
|
}
|
|
53
39
|
const LIST_DIRECTORY_TOOL = {
|
|
54
40
|
title: 'List Directory',
|
|
55
|
-
description: 'List
|
|
56
|
-
'Returns
|
|
57
|
-
'Use recursive=true with maxDepth to
|
|
58
|
-
'
|
|
41
|
+
description: 'List entries in a directory with optional recursion. ' +
|
|
42
|
+
'Returns name (basename), relative path, type (file/directory/symlink), size, and modified date. ' +
|
|
43
|
+
'Use recursive=true with maxDepth to traverse nested folders. ' +
|
|
44
|
+
'Use excludePatterns to skip paths, or pattern to include only matches. ' +
|
|
45
|
+
'Symlinks are not followed; includeSymlinkTargets can show targets.',
|
|
59
46
|
inputSchema: ListDirectoryInputSchema,
|
|
60
47
|
outputSchema: ListDirectoryOutputSchema.shape,
|
|
61
48
|
annotations: {
|
|
@@ -65,10 +52,11 @@ const LIST_DIRECTORY_TOOL = {
|
|
|
65
52
|
},
|
|
66
53
|
};
|
|
67
54
|
function buildStructuredResult(result) {
|
|
55
|
+
const { entries, summary, path } = result;
|
|
68
56
|
return {
|
|
69
57
|
ok: true,
|
|
70
|
-
path
|
|
71
|
-
entries:
|
|
58
|
+
path,
|
|
59
|
+
entries: entries.map((e) => ({
|
|
72
60
|
name: e.name,
|
|
73
61
|
relativePath: e.relativePath,
|
|
74
62
|
type: e.type,
|
|
@@ -78,49 +66,67 @@ function buildStructuredResult(result) {
|
|
|
78
66
|
symlinkTarget: e.symlinkTarget,
|
|
79
67
|
})),
|
|
80
68
|
summary: {
|
|
81
|
-
totalEntries:
|
|
82
|
-
totalFiles:
|
|
83
|
-
totalDirectories:
|
|
84
|
-
maxDepthReached:
|
|
85
|
-
truncated:
|
|
86
|
-
|
|
87
|
-
|
|
69
|
+
totalEntries: summary.totalEntries,
|
|
70
|
+
totalFiles: summary.totalFiles,
|
|
71
|
+
totalDirectories: summary.totalDirectories,
|
|
72
|
+
maxDepthReached: summary.maxDepthReached,
|
|
73
|
+
truncated: summary.truncated,
|
|
74
|
+
stoppedReason: summary.stoppedReason,
|
|
75
|
+
skippedInaccessible: summary.skippedInaccessible,
|
|
76
|
+
symlinksNotFollowed: summary.symlinksNotFollowed,
|
|
77
|
+
entriesScanned: summary.entriesScanned,
|
|
78
|
+
entriesVisible: summary.entriesVisible,
|
|
88
79
|
},
|
|
89
80
|
};
|
|
90
81
|
}
|
|
91
82
|
function buildTextResult(result) {
|
|
92
|
-
|
|
83
|
+
const { entries, summary, path } = result;
|
|
84
|
+
let textOutput = formatDirectoryListing(entries, path, summary);
|
|
85
|
+
const truncatedReason = summary.stoppedReason === 'aborted'
|
|
86
|
+
? 'operation aborted'
|
|
87
|
+
: summary.stoppedReason === 'maxEntries'
|
|
88
|
+
? `reached max entries limit (${summary.totalEntries} returned)`
|
|
89
|
+
: undefined;
|
|
93
90
|
textOutput += formatOperationSummary({
|
|
94
|
-
truncated:
|
|
95
|
-
truncatedReason
|
|
96
|
-
tip:
|
|
97
|
-
|
|
98
|
-
|
|
91
|
+
truncated: summary.truncated,
|
|
92
|
+
truncatedReason,
|
|
93
|
+
tip: summary.stoppedReason === 'maxEntries'
|
|
94
|
+
? 'Increase maxEntries or reduce maxDepth to see more results.'
|
|
95
|
+
: undefined,
|
|
96
|
+
skippedInaccessible: summary.skippedInaccessible,
|
|
97
|
+
symlinksNotFollowed: summary.symlinksNotFollowed,
|
|
99
98
|
});
|
|
100
99
|
return textOutput;
|
|
101
100
|
}
|
|
102
|
-
async function handleListDirectory({ path: dirPath, recursive, includeHidden, maxDepth, maxEntries, sortBy, includeSymlinkTargets, pattern, }) {
|
|
103
|
-
const
|
|
104
|
-
recursive,
|
|
105
|
-
includeHidden,
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
101
|
+
async function handleListDirectory({ path: dirPath, recursive, includeHidden, excludePatterns, maxDepth, maxEntries, sortBy, includeSymlinkTargets, pattern, }, signal) {
|
|
102
|
+
const effectiveOptions = {
|
|
103
|
+
recursive: recursive ?? false,
|
|
104
|
+
includeHidden: includeHidden ?? false,
|
|
105
|
+
excludePatterns: excludePatterns ?? [],
|
|
106
|
+
maxDepth: maxDepth ?? DEFAULT_MAX_DEPTH,
|
|
107
|
+
maxEntries: maxEntries ?? DEFAULT_LIST_MAX_ENTRIES,
|
|
108
|
+
sortBy: sortBy ?? 'name',
|
|
109
|
+
includeSymlinkTargets: includeSymlinkTargets ?? false,
|
|
110
110
|
pattern,
|
|
111
|
+
};
|
|
112
|
+
const result = await listDirectory(dirPath, {
|
|
113
|
+
recursive: effectiveOptions.recursive,
|
|
114
|
+
includeHidden: effectiveOptions.includeHidden,
|
|
115
|
+
excludePatterns: effectiveOptions.excludePatterns,
|
|
116
|
+
maxDepth: effectiveOptions.maxDepth,
|
|
117
|
+
maxEntries: effectiveOptions.maxEntries,
|
|
118
|
+
sortBy: effectiveOptions.sortBy,
|
|
119
|
+
includeSymlinkTargets: effectiveOptions.includeSymlinkTargets,
|
|
120
|
+
pattern: effectiveOptions.pattern,
|
|
121
|
+
signal,
|
|
111
122
|
});
|
|
112
123
|
const structured = buildStructuredResult(result);
|
|
124
|
+
structured.effectiveOptions = effectiveOptions;
|
|
113
125
|
const textOutput = buildTextResult(result);
|
|
114
126
|
return buildToolResponse(textOutput, structured);
|
|
115
127
|
}
|
|
116
128
|
export function registerListDirectoryTool(server) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
return await handleListDirectory(args);
|
|
120
|
-
}
|
|
121
|
-
catch (error) {
|
|
122
|
-
throw toRpcError(error, ErrorCode.E_NOT_DIRECTORY, args.path);
|
|
123
|
-
}
|
|
124
|
-
});
|
|
129
|
+
const handler = (args, extra) => withToolErrorHandling(() => handleListDirectory(args, extra.signal), (error) => buildToolErrorResponse(error, ErrorCode.E_NOT_DIRECTORY, args.path));
|
|
130
|
+
server.registerTool('list_directory', LIST_DIRECTORY_TOOL, handler);
|
|
125
131
|
}
|
|
126
132
|
//# sourceMappingURL=list-directory.js.map
|