@j0hanz/filesystem-mcp 1.19.0 → 2.0.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 +333 -838
- package/dist/cli-help.d.ts +3 -0
- package/dist/cli-help.d.ts.map +1 -0
- package/dist/cli-help.js +169 -0
- package/dist/cli-help.js.map +1 -0
- package/dist/cli.d.ts +28 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +168 -123
- package/dist/cli.js.map +1 -0
- package/dist/core/concurrency.d.ts +70 -0
- package/dist/core/concurrency.d.ts.map +1 -0
- package/dist/core/concurrency.js +173 -0
- package/dist/core/concurrency.js.map +1 -0
- package/dist/core/config.d.ts +19 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +11 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/cursor.d.ts +23 -0
- package/dist/core/cursor.d.ts.map +1 -0
- package/dist/core/cursor.js +62 -0
- package/dist/core/cursor.js.map +1 -0
- package/dist/core/errors.d.ts +96 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +356 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/file-uri.d.ts +24 -0
- package/dist/core/file-uri.d.ts.map +1 -0
- package/dist/core/file-uri.js +52 -0
- package/dist/core/file-uri.js.map +1 -0
- package/dist/core/fmt.d.ts +38 -0
- package/dist/core/fmt.d.ts.map +1 -0
- package/dist/core/fmt.js +109 -0
- package/dist/core/fmt.js.map +1 -0
- package/dist/core/fs.d.ts +108 -0
- package/dist/core/fs.d.ts.map +1 -0
- package/dist/core/fs.js +243 -0
- package/dist/core/fs.js.map +1 -0
- package/dist/core/glob.d.ts +41 -0
- package/dist/core/glob.d.ts.map +1 -0
- package/dist/core/glob.js +399 -0
- package/dist/core/glob.js.map +1 -0
- package/dist/core/input-required.d.ts +147 -0
- package/dist/core/input-required.d.ts.map +1 -0
- package/dist/core/input-required.js +261 -0
- package/dist/core/input-required.js.map +1 -0
- package/dist/core/mime.d.ts +15 -0
- package/dist/core/mime.d.ts.map +1 -0
- package/dist/core/mime.js +188 -0
- package/dist/core/mime.js.map +1 -0
- package/dist/core/observability.d.ts +10 -0
- package/dist/core/observability.d.ts.map +1 -0
- package/dist/core/observability.js +76 -0
- package/dist/core/observability.js.map +1 -0
- package/dist/core/page-store.d.ts +41 -0
- package/dist/core/page-store.d.ts.map +1 -0
- package/dist/core/page-store.js +74 -0
- package/dist/core/page-store.js.map +1 -0
- package/dist/core/path-completer.d.ts +10 -0
- package/dist/core/path-completer.d.ts.map +1 -0
- package/dist/core/path-completer.js +227 -0
- package/dist/core/path-completer.js.map +1 -0
- package/dist/core/path-discovery.d.ts +8 -0
- package/dist/core/path-discovery.d.ts.map +1 -0
- package/dist/core/path-discovery.js +105 -0
- package/dist/core/path-discovery.js.map +1 -0
- package/dist/core/path-utils.d.ts +9 -0
- package/dist/core/path-utils.d.ts.map +1 -0
- package/dist/core/path-utils.js +121 -0
- package/dist/core/path-utils.js.map +1 -0
- package/dist/core/path.d.ts +148 -0
- package/dist/core/path.d.ts.map +1 -0
- package/dist/core/path.js +674 -0
- package/dist/core/path.js.map +1 -0
- package/dist/core/primitives.d.ts +23 -0
- package/dist/core/primitives.d.ts.map +1 -0
- package/dist/core/primitives.js +54 -0
- package/dist/core/primitives.js.map +1 -0
- package/dist/core/read.d.ts +74 -0
- package/dist/core/read.d.ts.map +1 -0
- package/dist/core/read.js +562 -0
- package/dist/core/read.js.map +1 -0
- package/dist/core/schema.d.ts +139 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +345 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/search.d.ts +100 -0
- package/dist/core/search.d.ts.map +1 -0
- package/dist/core/search.js +248 -0
- package/dist/core/search.js.map +1 -0
- package/dist/core/sensitive.d.ts +6 -0
- package/dist/core/sensitive.d.ts.map +1 -0
- package/dist/core/sensitive.js +142 -0
- package/dist/core/sensitive.js.map +1 -0
- package/dist/core/store.d.ts +57 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +162 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/util.d.ts +26 -0
- package/dist/core/util.d.ts.map +1 -0
- package/dist/core/util.js +66 -0
- package/dist/core/util.js.map +1 -0
- package/dist/core/watcher-registry.d.ts +68 -0
- package/dist/core/watcher-registry.d.ts.map +1 -0
- package/dist/core/watcher-registry.js +312 -0
- package/dist/core/watcher-registry.js.map +1 -0
- package/dist/http-policy.d.ts +121 -0
- package/dist/http-policy.d.ts.map +1 -0
- package/dist/http-policy.js +340 -0
- package/dist/http-policy.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +77 -41
- package/dist/index.js.map +1 -0
- package/dist/instructions.d.ts +12 -0
- package/dist/instructions.d.ts.map +1 -0
- package/dist/instructions.js +71 -0
- package/dist/instructions.js.map +1 -0
- package/dist/prompts.d.ts +8 -6
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +74 -168
- package/dist/prompts.js.map +1 -0
- package/dist/resources.d.ts +73 -9
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +392 -163
- package/dist/resources.js.map +1 -0
- package/dist/server.d.ts +62 -1
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +139 -1
- package/dist/server.js.map +1 -0
- package/dist/tools/batch.d.ts +89 -0
- package/dist/tools/batch.d.ts.map +1 -0
- package/dist/tools/batch.js +157 -0
- package/dist/tools/batch.js.map +1 -0
- package/dist/tools/create.d.ts +2 -0
- package/dist/tools/create.d.ts.map +1 -0
- package/dist/tools/create.js +142 -0
- package/dist/tools/create.js.map +1 -0
- package/dist/tools/define.d.ts +110 -0
- package/dist/tools/define.d.ts.map +1 -0
- package/dist/tools/define.js +394 -0
- package/dist/tools/define.js.map +1 -0
- package/dist/tools/delete-file.d.ts +2 -4
- package/dist/tools/delete-file.d.ts.map +1 -0
- package/dist/tools/delete-file.js +330 -87
- package/dist/tools/delete-file.js.map +1 -0
- package/dist/tools/diff.d.ts +2 -0
- package/dist/tools/diff.d.ts.map +1 -0
- package/dist/tools/diff.js +94 -0
- package/dist/tools/diff.js.map +1 -0
- package/dist/tools/edit.d.ts +2 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +442 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/index.d.ts +26 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +52 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list.d.ts +2 -0
- package/dist/tools/list.d.ts.map +1 -0
- package/dist/tools/list.js +291 -0
- package/dist/tools/list.js.map +1 -0
- package/dist/tools/move.d.ts +2 -0
- package/dist/tools/move.d.ts.map +1 -0
- package/dist/tools/move.js +321 -0
- package/dist/tools/move.js.map +1 -0
- package/dist/tools/patch.d.ts +2 -0
- package/dist/tools/patch.d.ts.map +1 -0
- package/dist/tools/patch.js +155 -0
- package/dist/tools/patch.js.map +1 -0
- package/dist/tools/progress.d.ts +52 -0
- package/dist/tools/progress.d.ts.map +1 -0
- package/dist/tools/progress.js +172 -0
- package/dist/tools/progress.js.map +1 -0
- package/dist/tools/read.d.ts +2 -4
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +398 -152
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/replace-in-files.d.ts +2 -4
- package/dist/tools/replace-in-files.d.ts.map +1 -0
- package/dist/tools/replace-in-files.js +435 -264
- package/dist/tools/replace-in-files.js.map +1 -0
- package/dist/tools/roots.d.ts +2 -4
- package/dist/tools/roots.d.ts.map +1 -0
- package/dist/tools/roots.js +29 -52
- package/dist/tools/roots.js.map +1 -0
- package/dist/tools/search-content.d.ts +2 -4
- package/dist/tools/search-content.d.ts.map +1 -0
- package/dist/tools/search-content.js +262 -228
- package/dist/tools/search-content.js.map +1 -0
- package/dist/tools/search-files.d.ts +2 -4
- package/dist/tools/search-files.d.ts.map +1 -0
- package/dist/tools/search-files.js +162 -161
- package/dist/tools/search-files.js.map +1 -0
- package/dist/tools/stat.d.ts +2 -4
- package/dist/tools/stat.d.ts.map +1 -0
- package/dist/tools/stat.js +202 -62
- package/dist/tools/stat.js.map +1 -0
- package/dist/transport/http.d.ts +5 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +276 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/shared.d.ts +45 -0
- package/dist/transport/shared.d.ts.map +1 -0
- package/dist/transport/shared.js +65 -0
- package/dist/transport/shared.js.map +1 -0
- package/dist/transport/stdio.d.ts +32 -0
- package/dist/transport/stdio.d.ts.map +1 -0
- package/dist/transport/stdio.js +279 -0
- package/dist/transport/stdio.js.map +1 -0
- package/dist/transport.d.ts +5 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +4 -0
- package/dist/transport.js.map +1 -0
- package/package.json +37 -46
- package/dist/assets/logo.svg +0 -35
- package/dist/completions.d.ts +0 -2
- package/dist/completions.js +0 -572
- package/dist/config.d.ts +0 -119
- package/dist/config.js +0 -31
- package/dist/lib/abort.d.ts +0 -7
- package/dist/lib/abort.js +0 -81
- package/dist/lib/constants.d.ts +0 -42
- package/dist/lib/constants.js +0 -313
- package/dist/lib/errors.d.ts +0 -28
- package/dist/lib/errors.js +0 -301
- package/dist/lib/file-operations/core.d.ts +0 -53
- package/dist/lib/file-operations/core.js +0 -144
- package/dist/lib/file-operations/metadata.d.ts +0 -77
- package/dist/lib/file-operations/metadata.js +0 -878
- package/dist/lib/file-operations/search.d.ts +0 -46
- package/dist/lib/file-operations/search.js +0 -1194
- package/dist/lib/file-operations/traversal.d.ts +0 -40
- package/dist/lib/file-operations/traversal.js +0 -310
- package/dist/lib/fs-helpers.d.ts +0 -46
- package/dist/lib/fs-helpers.js +0 -606
- package/dist/lib/globs.d.ts +0 -2
- package/dist/lib/globs.js +0 -19
- package/dist/lib/logger.d.ts +0 -27
- package/dist/lib/logger.js +0 -91
- package/dist/lib/observability.d.ts +0 -33
- package/dist/lib/observability.js +0 -373
- package/dist/lib/paths.d.ts +0 -35
- package/dist/lib/paths.js +0 -634
- package/dist/lib/resource-store.d.ts +0 -28
- package/dist/lib/resource-store.js +0 -195
- package/dist/lib/utils.d.ts +0 -7
- package/dist/lib/utils.js +0 -37
- package/dist/lib/zod-codecs.d.ts +0 -2
- package/dist/lib/zod-codecs.js +0 -18
- package/dist/pkg-info.d.ts +0 -7
- package/dist/pkg-info.js +0 -9
- package/dist/resources/generated-instructions.d.ts +0 -1
- package/dist/resources/generated-instructions.js +0 -105
- package/dist/resources/tool-catalog.d.ts +0 -2
- package/dist/resources/tool-catalog.js +0 -78
- package/dist/resources/tool-info.d.ts +0 -9
- package/dist/resources/tool-info.js +0 -206
- package/dist/resources/workflows.d.ts +0 -1
- package/dist/resources/workflows.js +0 -72
- package/dist/schemas.d.ts +0 -505
- package/dist/schemas.js +0 -676
- package/dist/server/bootstrap.d.ts +0 -6
- package/dist/server/bootstrap.js +0 -563
- package/dist/server/event-store.d.ts +0 -18
- package/dist/server/event-store.js +0 -71
- package/dist/server/roots-manager.d.ts +0 -28
- package/dist/server/roots-manager.js +0 -227
- package/dist/server/task-store.d.ts +0 -10
- package/dist/server/task-store.js +0 -91
- package/dist/tools/apply-patch.d.ts +0 -4
- package/dist/tools/apply-patch.js +0 -235
- package/dist/tools/calculate-hash.d.ts +0 -4
- package/dist/tools/calculate-hash.js +0 -187
- package/dist/tools/contract.d.ts +0 -50
- package/dist/tools/contract.js +0 -1
- package/dist/tools/create-directory.d.ts +0 -4
- package/dist/tools/create-directory.js +0 -68
- package/dist/tools/diff-files.d.ts +0 -4
- package/dist/tools/diff-files.js +0 -136
- package/dist/tools/edit-file.d.ts +0 -4
- package/dist/tools/edit-file.js +0 -256
- package/dist/tools/icons.d.ts +0 -15
- package/dist/tools/icons.js +0 -24
- package/dist/tools/list-directory.d.ts +0 -4
- package/dist/tools/list-directory.js +0 -218
- package/dist/tools/move-file.d.ts +0 -4
- package/dist/tools/move-file.js +0 -178
- package/dist/tools/read-multiple.d.ts +0 -4
- package/dist/tools/read-multiple.js +0 -207
- package/dist/tools/shared.d.ts +0 -172
- package/dist/tools/shared.js +0 -599
- package/dist/tools/stat-many.d.ts +0 -4
- package/dist/tools/stat-many.js +0 -104
- package/dist/tools/task-support.d.ts +0 -29
- package/dist/tools/task-support.js +0 -472
- package/dist/tools/tree.d.ts +0 -4
- package/dist/tools/tree.js +0 -102
- package/dist/tools/write-file.d.ts +0 -4
- package/dist/tools/write-file.js +0 -60
- package/dist/tools.d.ts +0 -5
- package/dist/tools.js +0 -54
package/dist/tools/move-file.js
DELETED
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
import { cp, mkdir, rename, rm, stat } from 'node:fs/promises';
|
|
2
|
-
import { basename, dirname, join, resolve, sep } from 'node:path';
|
|
3
|
-
import { withAbort } from '../lib/abort.js';
|
|
4
|
-
import { ErrorCode, formatUnknownErrorMessage, isNodeError, McpError, } from '../lib/errors.js';
|
|
5
|
-
import { Logger } from '../lib/logger.js';
|
|
6
|
-
import { assertAllowedFileAccess, validateExistingPath, validatePathForWrite, } from '../lib/paths.js';
|
|
7
|
-
import { MoveFileInputSchema, MoveFileOutputSchema } from '../schemas.js';
|
|
8
|
-
import { FILE_MOVE_ICONS } from './icons.js';
|
|
9
|
-
import { buildStructuredError, buildToolErrorResponse, buildToolResponse, DESTRUCTIVE_WRITE_TOOL_ANNOTATIONS, executeToolWithDiagnostics, } from './shared.js';
|
|
10
|
-
import { registerStandardTool } from './task-support.js';
|
|
11
|
-
export const MOVE_FILE_TOOL = {
|
|
12
|
-
name: 'mv',
|
|
13
|
-
title: 'Move File',
|
|
14
|
-
description: 'Move or rename a file or directory.',
|
|
15
|
-
inputSchema: MoveFileInputSchema,
|
|
16
|
-
outputSchema: MoveFileOutputSchema,
|
|
17
|
-
annotations: DESTRUCTIVE_WRITE_TOOL_ANNOTATIONS,
|
|
18
|
-
icons: FILE_MOVE_ICONS,
|
|
19
|
-
gotchas: [
|
|
20
|
-
'On POSIX, an existing destination is silently overwritten; on Windows, rename fails with EEXIST if destination exists.',
|
|
21
|
-
],
|
|
22
|
-
taskSupport: 'forbidden',
|
|
23
|
-
};
|
|
24
|
-
function toMoveFailure(source, error, defaultCode = ErrorCode.UNKNOWN) {
|
|
25
|
-
return {
|
|
26
|
-
source,
|
|
27
|
-
error: buildStructuredError(error, defaultCode, source),
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
async function handleMoveError(error, src, validSource, targetPath, movedSources, failed, signal) {
|
|
31
|
-
if (isNodeError(error) && error.code === 'EXDEV') {
|
|
32
|
-
try {
|
|
33
|
-
await withAbort(cp(validSource, targetPath, { recursive: true }), signal);
|
|
34
|
-
}
|
|
35
|
-
catch (copyError) {
|
|
36
|
-
failed.push(toMoveFailure(src, copyError));
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
try {
|
|
40
|
-
await withAbort(rm(validSource, { recursive: true, force: true }), signal);
|
|
41
|
-
movedSources.push(validSource);
|
|
42
|
-
}
|
|
43
|
-
catch (deleteError) {
|
|
44
|
-
try {
|
|
45
|
-
await rm(targetPath, { recursive: true, force: true });
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
failed.push(toMoveFailure(src, new McpError(ErrorCode.UNKNOWN, `Cross-device move partial: data at both source and destination. ${formatUnknownErrorMessage(deleteError)}`, src)));
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
failed.push(toMoveFailure(src, new McpError(ErrorCode.UNKNOWN, `Cross-device move failed: source not removed. ${formatUnknownErrorMessage(deleteError)}`, src)));
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
failed.push(toMoveFailure(src, error));
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
async function processSingleMove(src, destIsDirectory, validDest, movedSources, failed, signal) {
|
|
59
|
-
let validSource;
|
|
60
|
-
try {
|
|
61
|
-
validSource = await validateExistingPath(src, signal);
|
|
62
|
-
assertAllowedFileAccess(src, validSource);
|
|
63
|
-
}
|
|
64
|
-
catch (error) {
|
|
65
|
-
failed.push(toMoveFailure(src, error, ErrorCode.ACCESS_DENIED));
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
const targetPath = destIsDirectory
|
|
69
|
-
? join(validDest, basename(validSource))
|
|
70
|
-
: validDest;
|
|
71
|
-
if (resolve(validSource) === resolve(targetPath)) {
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
if (resolve(targetPath).startsWith(resolve(validSource) + sep)) {
|
|
75
|
-
failed.push(toMoveFailure(src, new McpError(ErrorCode.INVALID_INPUT, 'Cannot move a directory into its own subdirectory', src), ErrorCode.INVALID_INPUT));
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
try {
|
|
79
|
-
await withAbort(rename(validSource, targetPath), signal);
|
|
80
|
-
movedSources.push(validSource);
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
await handleMoveError(error, src, validSource, targetPath, movedSources, failed, signal);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
async function getDestinationStatus(validDest) {
|
|
87
|
-
try {
|
|
88
|
-
const stats = await stat(validDest);
|
|
89
|
-
return stats.isDirectory();
|
|
90
|
-
}
|
|
91
|
-
catch (error) {
|
|
92
|
-
if (isNodeError(error) && error.code !== 'ENOENT') {
|
|
93
|
-
throw error;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return false;
|
|
97
|
-
}
|
|
98
|
-
function formatMoveMessage(moved, failed, destination) {
|
|
99
|
-
const movedItemStr = `item${moved === 1 ? '' : 's'}`;
|
|
100
|
-
const failedItemStr = `item${failed === 1 ? '' : 's'}`;
|
|
101
|
-
if (failed > 0) {
|
|
102
|
-
return `Moved ${moved} ${movedItemStr}; failed to move ${failed} ${failedItemStr}`;
|
|
103
|
-
}
|
|
104
|
-
return `Successfully moved ${moved} ${movedItemStr} to ${destination}`;
|
|
105
|
-
}
|
|
106
|
-
async function handleMoveFile(args, signal) {
|
|
107
|
-
const sources = args.sources ?? (args.source ? [args.source] : []);
|
|
108
|
-
if (sources.length === 0) {
|
|
109
|
-
throw new McpError(ErrorCode.INVALID_INPUT, 'No sources provided.');
|
|
110
|
-
}
|
|
111
|
-
const validDest = await validatePathForWrite(args.destination, signal);
|
|
112
|
-
const destIsDirectory = await getDestinationStatus(validDest);
|
|
113
|
-
if (sources.length > 1 && !destIsDirectory) {
|
|
114
|
-
throw new McpError(ErrorCode.INVALID_INPUT, 'Destination must be an existing directory for multiple sources.');
|
|
115
|
-
}
|
|
116
|
-
if (!destIsDirectory) {
|
|
117
|
-
await withAbort(mkdir(dirname(validDest), { recursive: true }), signal);
|
|
118
|
-
}
|
|
119
|
-
const movedSources = [];
|
|
120
|
-
const failed = [];
|
|
121
|
-
for (const src of sources) {
|
|
122
|
-
await processSingleMove(src, destIsDirectory, validDest, movedSources, failed, signal);
|
|
123
|
-
}
|
|
124
|
-
const message = formatMoveMessage(movedSources.length, failed.length, args.destination);
|
|
125
|
-
const movedSource = sources.length === 1 ? movedSources[0] : undefined;
|
|
126
|
-
const failedSuffix = failed.length > 0 ? ` (${failed.length} failed)` : '';
|
|
127
|
-
Logger.info(`mv: ${movedSources.length} item(s) → ${args.destination}${failedSuffix}`);
|
|
128
|
-
if (movedSources.length === 0 && failed.length > 0) {
|
|
129
|
-
const firstFailure = failed[0];
|
|
130
|
-
if (firstFailure) {
|
|
131
|
-
throw new McpError(firstFailure.error.code, message, firstFailure.error.path);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
return buildToolResponse(message, {
|
|
135
|
-
ok: failed.length === 0,
|
|
136
|
-
...(movedSource ? { source: movedSource } : {}),
|
|
137
|
-
sources: movedSources,
|
|
138
|
-
destination: validDest,
|
|
139
|
-
...(failed.length > 0 ? { failed } : {}),
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
export function registerMoveFileTool(server, options = {}) {
|
|
143
|
-
const handler = (args, ctx) => executeToolWithDiagnostics({
|
|
144
|
-
toolName: 'mv',
|
|
145
|
-
ctx,
|
|
146
|
-
outputSchema: MoveFileOutputSchema,
|
|
147
|
-
timedSignal: {},
|
|
148
|
-
context: { path: args.source ?? args.sources?.[0] },
|
|
149
|
-
run: async (signal) => {
|
|
150
|
-
const result = await handleMoveFile(args, signal);
|
|
151
|
-
void ctx.log?.('info', `mv: ${args.source ?? args.sources?.join(', ') ?? ''} \u2192 ${args.destination}`);
|
|
152
|
-
return result;
|
|
153
|
-
},
|
|
154
|
-
onError: (error) => buildToolErrorResponse(error, ErrorCode.UNKNOWN, args.source ?? args.sources?.[0]),
|
|
155
|
-
});
|
|
156
|
-
registerStandardTool(server, MOVE_FILE_TOOL, handler, options, {
|
|
157
|
-
progressMessage: (args) => {
|
|
158
|
-
const dest = basename(args.destination);
|
|
159
|
-
if (args.source && !args.sources?.length) {
|
|
160
|
-
return `${MOVE_FILE_TOOL.title}: ${basename(args.source)} → ${dest}`;
|
|
161
|
-
}
|
|
162
|
-
const count = (args.source ? 1 : 0) + (args.sources?.length ?? 0);
|
|
163
|
-
return `${MOVE_FILE_TOOL.title}: ${count} items → ${dest}`;
|
|
164
|
-
},
|
|
165
|
-
completionMessage: (args, result) => {
|
|
166
|
-
const dest = basename(args.destination);
|
|
167
|
-
if (args.source && !args.sources?.length) {
|
|
168
|
-
const src = basename(args.source);
|
|
169
|
-
if (result.isError)
|
|
170
|
-
return `${MOVE_FILE_TOOL.title}: ${src} → ${dest} • ${result.errorCode}`;
|
|
171
|
-
}
|
|
172
|
-
const count = (args.source ? 1 : 0) + (args.sources?.length ?? 0);
|
|
173
|
-
if (result.isError)
|
|
174
|
-
return `${MOVE_FILE_TOOL.title}: ${count} items → ${dest} • ${result.errorCode}`;
|
|
175
|
-
return `${MOVE_FILE_TOOL.title}: ${count} items → ${dest}`;
|
|
176
|
-
},
|
|
177
|
-
});
|
|
178
|
-
}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { McpServer } from '@modelcontextprotocol/server';
|
|
2
|
-
import { type ToolContract, type ToolRegistrationOptions } from './shared.js';
|
|
3
|
-
export declare const READ_MANY_TOOL: ToolContract;
|
|
4
|
-
export declare function registerReadMultipleFilesTool(server: McpServer, options?: ToolRegistrationOptions): void;
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
import { basename } from 'node:path';
|
|
2
|
-
import { DEFAULT_SEARCH_TIMEOUT_MS } from '../lib/constants.js';
|
|
3
|
-
import { classifyError, ErrorCode } from '../lib/errors.js';
|
|
4
|
-
import { readMultipleFiles } from '../lib/file-operations/metadata.js';
|
|
5
|
-
import { ReadMultipleFilesInputSchema, ReadMultipleFilesOutputSchema, } from '../schemas.js';
|
|
6
|
-
import { FILE_READ_ICONS } from './icons.js';
|
|
7
|
-
import { buildBatchPathContext, buildResourceLink, buildStructuredError, buildToolErrorResponse, buildToolResponse, createBatchProgressCallbacks, executeToolWithDiagnostics, maybeExternalizeTextContent, READ_ONLY_TOOL_ANNOTATIONS, resolveFinalProgressCurrent, } from './shared.js';
|
|
8
|
-
import { registerStandardTool, reportTaskStatus } from './task-support.js';
|
|
9
|
-
const READ_MANY_TOOL_NAME = 'read_many';
|
|
10
|
-
const FULL_FILE_CONTENTS_DESCRIPTION = 'Full file contents';
|
|
11
|
-
export const READ_MANY_TOOL = {
|
|
12
|
-
name: READ_MANY_TOOL_NAME,
|
|
13
|
-
title: 'Read Multiple Files',
|
|
14
|
-
description: 'Read multiple text files in one request with contents and metadata. ' +
|
|
15
|
-
'For a single file, use `read`.',
|
|
16
|
-
inputSchema: ReadMultipleFilesInputSchema,
|
|
17
|
-
outputSchema: ReadMultipleFilesOutputSchema,
|
|
18
|
-
annotations: READ_ONLY_TOOL_ANNOTATIONS,
|
|
19
|
-
icons: FILE_READ_ICONS,
|
|
20
|
-
taskSupport: 'optional',
|
|
21
|
-
};
|
|
22
|
-
const READ_MANY_TOOL_LABEL = READ_MANY_TOOL.title;
|
|
23
|
-
function buildReadManyResourceName(filePath) {
|
|
24
|
-
return `read:${basename(filePath)}`;
|
|
25
|
-
}
|
|
26
|
-
function toStructuredReadManyResult(result) {
|
|
27
|
-
const structuredResult = {
|
|
28
|
-
path: result.path,
|
|
29
|
-
};
|
|
30
|
-
if (result.content !== undefined)
|
|
31
|
-
structuredResult.content = result.content;
|
|
32
|
-
if (result.truncated)
|
|
33
|
-
structuredResult.truncated = true;
|
|
34
|
-
if (result.resourceUri)
|
|
35
|
-
structuredResult.resourceUri = result.resourceUri;
|
|
36
|
-
if (result.head !== undefined)
|
|
37
|
-
structuredResult.head = result.head;
|
|
38
|
-
if (result.tail !== undefined)
|
|
39
|
-
structuredResult.tail = result.tail;
|
|
40
|
-
if (result.startLine !== undefined) {
|
|
41
|
-
structuredResult.startLine = result.startLine;
|
|
42
|
-
}
|
|
43
|
-
if (result.endLine !== undefined)
|
|
44
|
-
structuredResult.endLine = result.endLine;
|
|
45
|
-
if (result.hasMoreLines)
|
|
46
|
-
structuredResult.hasMoreLines = true;
|
|
47
|
-
if (result.totalLines !== undefined) {
|
|
48
|
-
structuredResult.totalLines = result.totalLines;
|
|
49
|
-
}
|
|
50
|
-
if (result.linesRead !== undefined) {
|
|
51
|
-
structuredResult.linesRead = result.linesRead;
|
|
52
|
-
}
|
|
53
|
-
if (result.truncationReason) {
|
|
54
|
-
structuredResult.truncationReason = result.truncationReason;
|
|
55
|
-
}
|
|
56
|
-
if (result.error)
|
|
57
|
-
structuredResult.error = result.error;
|
|
58
|
-
return structuredResult;
|
|
59
|
-
}
|
|
60
|
-
function resolveReadManyTruncationReason(result) {
|
|
61
|
-
if (!result.truncated)
|
|
62
|
-
return undefined;
|
|
63
|
-
if (result.readMode === 'head')
|
|
64
|
-
return 'head';
|
|
65
|
-
if (result.readMode === 'tail')
|
|
66
|
-
return 'tail';
|
|
67
|
-
if (result.readMode === 'range')
|
|
68
|
-
return 'range';
|
|
69
|
-
return undefined;
|
|
70
|
-
}
|
|
71
|
-
function maybeExternalizeReadManyResult(result, resourceStore) {
|
|
72
|
-
const truncationReason = resolveReadManyTruncationReason(result);
|
|
73
|
-
const { error, ...rest } = result;
|
|
74
|
-
const baseResult = {
|
|
75
|
-
...rest,
|
|
76
|
-
...(error
|
|
77
|
-
? { error: buildStructuredError(error, ErrorCode.UNKNOWN, result.path) }
|
|
78
|
-
: {}),
|
|
79
|
-
...(truncationReason ? { truncationReason } : {}),
|
|
80
|
-
};
|
|
81
|
-
if (!result.content) {
|
|
82
|
-
return baseResult;
|
|
83
|
-
}
|
|
84
|
-
const externalized = maybeExternalizeTextContent(resourceStore, result.content, { name: buildReadManyResourceName(result.path), mimeType: 'text/plain' });
|
|
85
|
-
if (!externalized) {
|
|
86
|
-
return baseResult;
|
|
87
|
-
}
|
|
88
|
-
return {
|
|
89
|
-
...baseResult,
|
|
90
|
-
content: externalized.preview,
|
|
91
|
-
truncated: true,
|
|
92
|
-
resourceUri: externalized.entry.uri,
|
|
93
|
-
truncationReason: 'externalized',
|
|
94
|
-
expiresAt: externalized.entry.expiresAt,
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
function buildReadManyTextSection(result) {
|
|
98
|
-
const header = `=== ${result.path} ===`;
|
|
99
|
-
if (result.error) {
|
|
100
|
-
return `${header}\nError [${result.error.code}]: ${result.error.message}`;
|
|
101
|
-
}
|
|
102
|
-
return `${header}\n${result.content ?? ''}`;
|
|
103
|
-
}
|
|
104
|
-
function buildReadMultipleOptions(args, signal, onReadComplete) {
|
|
105
|
-
const options = {};
|
|
106
|
-
if (signal)
|
|
107
|
-
options.signal = signal;
|
|
108
|
-
if (args.head !== undefined)
|
|
109
|
-
options.head = args.head;
|
|
110
|
-
if (args.tail !== undefined)
|
|
111
|
-
options.tail = args.tail;
|
|
112
|
-
if (args.startLine !== undefined)
|
|
113
|
-
options.startLine = args.startLine;
|
|
114
|
-
if (args.endLine !== undefined)
|
|
115
|
-
options.endLine = args.endLine;
|
|
116
|
-
if (onReadComplete)
|
|
117
|
-
options.onReadComplete = onReadComplete;
|
|
118
|
-
return options;
|
|
119
|
-
}
|
|
120
|
-
function buildReadManyResponsePayload(results, resourceStore) {
|
|
121
|
-
const resourceLinks = [];
|
|
122
|
-
const structuredResults = [];
|
|
123
|
-
const textSections = [];
|
|
124
|
-
let succeeded = 0;
|
|
125
|
-
for (const result of results) {
|
|
126
|
-
const mappedResult = maybeExternalizeReadManyResult(result, resourceStore);
|
|
127
|
-
structuredResults.push(toStructuredReadManyResult(mappedResult));
|
|
128
|
-
textSections.push(buildReadManyTextSection(mappedResult));
|
|
129
|
-
if (mappedResult.resourceUri) {
|
|
130
|
-
resourceLinks.push(buildResourceLink({
|
|
131
|
-
uri: mappedResult.resourceUri,
|
|
132
|
-
name: buildReadManyResourceName(mappedResult.path),
|
|
133
|
-
description: FULL_FILE_CONTENTS_DESCRIPTION,
|
|
134
|
-
...(mappedResult.expiresAt
|
|
135
|
-
? { expiresAt: mappedResult.expiresAt }
|
|
136
|
-
: {}),
|
|
137
|
-
}));
|
|
138
|
-
}
|
|
139
|
-
if (mappedResult.error === undefined)
|
|
140
|
-
succeeded += 1;
|
|
141
|
-
}
|
|
142
|
-
const total = structuredResults.length;
|
|
143
|
-
return {
|
|
144
|
-
resourceLinks,
|
|
145
|
-
structuredResults,
|
|
146
|
-
summary: {
|
|
147
|
-
total,
|
|
148
|
-
succeeded,
|
|
149
|
-
failed: total - succeeded,
|
|
150
|
-
},
|
|
151
|
-
text: textSections.join('\n\n'),
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
async function handleReadMultipleFiles(args, signal, resourceStore, onReadComplete) {
|
|
155
|
-
const options = buildReadMultipleOptions(args, signal, onReadComplete);
|
|
156
|
-
const results = await readMultipleFiles(args.paths, options);
|
|
157
|
-
const payload = buildReadManyResponsePayload(results, resourceStore);
|
|
158
|
-
const structured = {
|
|
159
|
-
ok: true,
|
|
160
|
-
results: payload.structuredResults,
|
|
161
|
-
summary: payload.summary,
|
|
162
|
-
};
|
|
163
|
-
return buildToolResponse(payload.text, structured, payload.resourceLinks);
|
|
164
|
-
}
|
|
165
|
-
export function registerReadMultipleFilesTool(server, options = {}) {
|
|
166
|
-
const handler = (args, ctx) => {
|
|
167
|
-
const primaryPath = args.paths[0] ?? '';
|
|
168
|
-
return executeToolWithDiagnostics({
|
|
169
|
-
toolName: READ_MANY_TOOL_NAME,
|
|
170
|
-
ctx,
|
|
171
|
-
outputSchema: ReadMultipleFilesOutputSchema,
|
|
172
|
-
timedSignal: { timeoutMs: DEFAULT_SEARCH_TIMEOUT_MS },
|
|
173
|
-
context: { path: primaryPath },
|
|
174
|
-
run: async (signal) => {
|
|
175
|
-
const context = buildBatchPathContext(args.paths, 'files');
|
|
176
|
-
const { progress, onItemComplete: rawOnItemComplete } = createBatchProgressCallbacks(ctx, {
|
|
177
|
-
toolLabel: READ_MANY_TOOL_LABEL,
|
|
178
|
-
context,
|
|
179
|
-
totalItems: args.paths.length,
|
|
180
|
-
itemVerb: 'read',
|
|
181
|
-
});
|
|
182
|
-
let itemsDone = 0;
|
|
183
|
-
const onItemComplete = () => {
|
|
184
|
-
rawOnItemComplete();
|
|
185
|
-
itemsDone++;
|
|
186
|
-
void reportTaskStatus(`${READ_MANY_TOOL_LABEL}: ${context} [${itemsDone}/${args.paths.length} read]`);
|
|
187
|
-
};
|
|
188
|
-
try {
|
|
189
|
-
const result = await handleReadMultipleFiles(args, signal, options.resourceStore, onItemComplete);
|
|
190
|
-
const sc = result.structuredContent;
|
|
191
|
-
const total = sc.summary?.total ?? 0;
|
|
192
|
-
const failed = sc.summary?.failed ?? 0;
|
|
193
|
-
const suffix = failed ? `${failed} failed` : 'done';
|
|
194
|
-
const finalCurrent = resolveFinalProgressCurrent(progress, total);
|
|
195
|
-
progress.complete(`${READ_MANY_TOOL_LABEL}: ${context} • ${suffix}`, finalCurrent);
|
|
196
|
-
return result;
|
|
197
|
-
}
|
|
198
|
-
catch (error) {
|
|
199
|
-
progress.fail(`${READ_MANY_TOOL_LABEL}: ${context} • ${classifyError(error)}`);
|
|
200
|
-
throw error;
|
|
201
|
-
}
|
|
202
|
-
},
|
|
203
|
-
onError: (error) => buildToolErrorResponse(error, ErrorCode.NOT_FILE, primaryPath),
|
|
204
|
-
});
|
|
205
|
-
};
|
|
206
|
-
registerStandardTool(server, READ_MANY_TOOL, handler, options);
|
|
207
|
-
}
|
package/dist/tools/shared.d.ts
DELETED
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
import type { ContentBlock, Icon, LoggingLevel, Notification, RequestMeta, ServerContext } from '@modelcontextprotocol/server';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { ErrorCode } from '../lib/errors.js';
|
|
4
|
-
import type { ResourceStore } from '../lib/resource-store.js';
|
|
5
|
-
import type { FileInfo } from '../config.js';
|
|
6
|
-
export { type ToolContract } from './contract.js';
|
|
7
|
-
export declare const READ_ONLY_TOOL_ANNOTATIONS: {
|
|
8
|
-
readonly readOnlyHint: true;
|
|
9
|
-
readonly idempotentHint: true;
|
|
10
|
-
readonly destructiveHint: false;
|
|
11
|
-
readonly openWorldHint: false;
|
|
12
|
-
};
|
|
13
|
-
export declare const DESTRUCTIVE_WRITE_TOOL_ANNOTATIONS: {
|
|
14
|
-
readonly readOnlyHint: false;
|
|
15
|
-
readonly idempotentHint: false;
|
|
16
|
-
readonly destructiveHint: true;
|
|
17
|
-
readonly openWorldHint: false;
|
|
18
|
-
};
|
|
19
|
-
export declare const IDEMPOTENT_WRITE_TOOL_ANNOTATIONS: {
|
|
20
|
-
readonly readOnlyHint: false;
|
|
21
|
-
readonly idempotentHint: true;
|
|
22
|
-
readonly destructiveHint: false;
|
|
23
|
-
readonly openWorldHint: false;
|
|
24
|
-
};
|
|
25
|
-
export type TaskSupportLevel = 'optional' | 'required' | 'forbidden';
|
|
26
|
-
export declare function resolveToolTaskSupportLevel(topLevelTaskSupport: unknown, executionTaskSupport: unknown): TaskSupportLevel | undefined;
|
|
27
|
-
export declare function maybeStripStructuredContentFromResult<T extends object>(result: T): T;
|
|
28
|
-
type ResourceEntry = ReturnType<ResourceStore['putText']>;
|
|
29
|
-
export declare function maybeExternalizeTextContent(resourceStore: ResourceStore | undefined, content: string, params: {
|
|
30
|
-
name: string;
|
|
31
|
-
mimeType?: string;
|
|
32
|
-
}): {
|
|
33
|
-
entry: ResourceEntry;
|
|
34
|
-
preview: string;
|
|
35
|
-
} | undefined;
|
|
36
|
-
export declare function buildResourceLink(params: {
|
|
37
|
-
uri: string;
|
|
38
|
-
name: string;
|
|
39
|
-
mimeType?: string;
|
|
40
|
-
description?: string;
|
|
41
|
-
expiresAt?: string;
|
|
42
|
-
}): ContentBlock;
|
|
43
|
-
export declare function buildStructuredError(error: unknown, defaultCode: ErrorCode, path?: string): {
|
|
44
|
-
code: ErrorCode;
|
|
45
|
-
message: string;
|
|
46
|
-
path?: string;
|
|
47
|
-
suggestion?: string;
|
|
48
|
-
};
|
|
49
|
-
export declare function buildToolResponse<T>(text: string, structuredContent: T, extraContent?: ContentBlock[]): {
|
|
50
|
-
content: ContentBlock[];
|
|
51
|
-
structuredContent: T;
|
|
52
|
-
};
|
|
53
|
-
export type ToolResponse<T> = ReturnType<typeof buildToolResponse<T>> & {
|
|
54
|
-
isError?: never;
|
|
55
|
-
} & Record<string, unknown>;
|
|
56
|
-
interface ToolErrorResponse extends Record<string, unknown> {
|
|
57
|
-
content: ContentBlock[];
|
|
58
|
-
isError: true;
|
|
59
|
-
errorCode: ErrorCode;
|
|
60
|
-
}
|
|
61
|
-
export type ToolResult<T> = ToolResponse<T> | ToolErrorResponse;
|
|
62
|
-
export declare function withValidatedArgs<Args, Result>(schema: z.ZodType<Args>, handler: (args: Args, ctx: ToolContext) => Promise<ToolResult<Result>>): (args: unknown, ctx: ToolContext | ServerContext) => Promise<ToolResult<Result>>;
|
|
63
|
-
/**
|
|
64
|
-
* App-level tracing metadata passed through {@linkcode RequestMeta}.
|
|
65
|
-
* These fields are preserved by the SDK's loose `RequestMeta` type.
|
|
66
|
-
*/
|
|
67
|
-
interface TracingMeta {
|
|
68
|
-
traceparent?: string | undefined;
|
|
69
|
-
tracestate?: string | undefined;
|
|
70
|
-
baggage?: string | undefined;
|
|
71
|
-
}
|
|
72
|
-
export interface ToolContext {
|
|
73
|
-
signal?: AbortSignal;
|
|
74
|
-
sessionId?: string;
|
|
75
|
-
_meta?: (RequestMeta & TracingMeta) | undefined;
|
|
76
|
-
sendNotification?: (notification: Notification) => Promise<void>;
|
|
77
|
-
log?: (level: LoggingLevel, data: unknown, logger?: string) => Promise<void>;
|
|
78
|
-
}
|
|
79
|
-
export declare function toToolContext(ctx?: ToolContext | ServerContext): ToolContext;
|
|
80
|
-
export interface IconInfo {
|
|
81
|
-
src: string;
|
|
82
|
-
mimeType: string;
|
|
83
|
-
}
|
|
84
|
-
export declare function withDefaultIcons<T extends object>(tool: T, iconInfo: IconInfo | undefined): T & {
|
|
85
|
-
icons?: Icon[];
|
|
86
|
-
};
|
|
87
|
-
export interface ToolRegistrationOptions {
|
|
88
|
-
resourceStore?: ResourceStore;
|
|
89
|
-
isInitialized?: () => boolean;
|
|
90
|
-
serverIcon?: string;
|
|
91
|
-
iconInfo?: IconInfo;
|
|
92
|
-
}
|
|
93
|
-
interface FileInfoPayload {
|
|
94
|
-
name: string;
|
|
95
|
-
path: string;
|
|
96
|
-
type: FileInfo['type'];
|
|
97
|
-
size: number;
|
|
98
|
-
tokenEstimate?: number;
|
|
99
|
-
created: string;
|
|
100
|
-
modified: string;
|
|
101
|
-
accessed: string;
|
|
102
|
-
permissions: string;
|
|
103
|
-
isHidden: boolean;
|
|
104
|
-
mimeType?: string;
|
|
105
|
-
symlinkTarget?: string;
|
|
106
|
-
}
|
|
107
|
-
export declare function buildFileInfoPayload(info: FileInfo): FileInfoPayload;
|
|
108
|
-
interface ToolExecutionOptions<T> {
|
|
109
|
-
toolName: string;
|
|
110
|
-
ctx: ToolContext;
|
|
111
|
-
outputSchema?: z.ZodType<T>;
|
|
112
|
-
run: (signal: AbortSignal | undefined) => ToolResponse<T> | Promise<ToolResponse<T>>;
|
|
113
|
-
onError: (error: unknown) => ToolResult<T>;
|
|
114
|
-
context?: Record<string, unknown>;
|
|
115
|
-
timedSignal?: {
|
|
116
|
-
timeoutMs?: number;
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
export declare function executeToolWithDiagnostics<T>(options: ToolExecutionOptions<T>): Promise<ToolResult<T>>;
|
|
120
|
-
export declare function buildToolErrorResponse(error: unknown, defaultCode: ErrorCode, path?: string): ToolErrorResponse;
|
|
121
|
-
export declare function createProgressReporter(ctx: ToolContext): (progress: {
|
|
122
|
-
total?: number;
|
|
123
|
-
current: number;
|
|
124
|
-
message?: string;
|
|
125
|
-
}) => void;
|
|
126
|
-
export declare function notifyProgress(ctx: ToolContext, progress: {
|
|
127
|
-
current: number;
|
|
128
|
-
total?: number;
|
|
129
|
-
message?: string;
|
|
130
|
-
}): void;
|
|
131
|
-
interface ToolProgressSession {
|
|
132
|
-
update: (progress: {
|
|
133
|
-
current: number;
|
|
134
|
-
total?: number;
|
|
135
|
-
message: string;
|
|
136
|
-
}) => void;
|
|
137
|
-
increment: (messageForCurrent: (current: number) => string) => void;
|
|
138
|
-
complete: (message: string, minimumCurrent?: number) => void;
|
|
139
|
-
fail: (message: string, minimumCurrent?: number) => void;
|
|
140
|
-
getCurrent: () => number;
|
|
141
|
-
}
|
|
142
|
-
interface BatchProgressCallbacks {
|
|
143
|
-
progress: ToolProgressSession;
|
|
144
|
-
onItemComplete: () => void;
|
|
145
|
-
}
|
|
146
|
-
export declare function createToolProgressSession(ctx: ToolContext, startMessage: string, initialTotal?: number): ToolProgressSession;
|
|
147
|
-
export declare function createBatchProgressCallbacks(ctx: ToolContext, params: {
|
|
148
|
-
toolLabel: string;
|
|
149
|
-
context: string;
|
|
150
|
-
totalItems: number;
|
|
151
|
-
itemVerb: string;
|
|
152
|
-
}): BatchProgressCallbacks;
|
|
153
|
-
export declare function resolveFinalProgressCurrent(progress: ToolProgressSession, ...candidates: number[]): number;
|
|
154
|
-
export declare function wrapToolHandler<Args, Result>(handler: (args: Args, ctx: ToolContext) => Promise<ToolResult<Result>>, options: {
|
|
155
|
-
guard?: (() => boolean) | undefined;
|
|
156
|
-
progressMessage?: (args: Args) => string;
|
|
157
|
-
completionMessage?: (args: Args, result: ToolResult<Result>) => string | undefined;
|
|
158
|
-
}): (args: Args, ctx?: ToolContext | ServerContext) => Promise<ToolResult<Result>>;
|
|
159
|
-
/**
|
|
160
|
-
* Returns `pathValue` if non-empty; otherwise resolves to the single allowed
|
|
161
|
-
* directory from module-level state managed by `RootsManager`. Throws when the
|
|
162
|
-
* path is ambiguous (multiple roots) or when no roots are configured.
|
|
163
|
-
*
|
|
164
|
-
* NOTE: Depends on `getAllowedDirectories()` which reads module-level state
|
|
165
|
-
* updated by `RootsManager`. Ensure the server is initialized before calling.
|
|
166
|
-
* See `src/server/roots-manager.ts` for the update lifecycle.
|
|
167
|
-
*/
|
|
168
|
-
export declare function resolvePathOrRoot(pathValue: string | undefined): string;
|
|
169
|
-
export declare function encodeOffsetCursor(offset: number): string;
|
|
170
|
-
export declare function decodeOffsetCursor(cursor: string): number;
|
|
171
|
-
export declare function buildBatchPathContext(paths: readonly string[], unitLabel?: string): string;
|
|
172
|
-
export declare function truncateProgressPattern(pattern: string, maxLength?: number): string;
|