@remcp/runtime 0.2.150 → 0.2.152

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.
@@ -0,0 +1,374 @@
1
+ import { fileToolHandlers, searchToolHandlers, terminalToolHandlers, systemToolHandlers, statsToolHandlers, configToolHandlers, readOnly, readOnlyNonIdempotent, additive, mutating, command, TEXT_OUTPUT_SCHEMA, NULLABLE_NUMBER_SCHEMA, NULLABLE_STRING_SCHEMA, START_PROCESS_OUTPUT_SCHEMA, READ_PROCESS_OUTPUT_SCHEMA, WAIT_PROCESS_OUTPUT_SCHEMA, INTERACT_PROCESS_OUTPUT_SCHEMA, TERMINATE_PROCESS_OUTPUT_SCHEMA, LIST_SESSIONS_OUTPUT_SCHEMA } from './core-catalog-shared.mjs';
2
+
3
+ export const coreToolDefinitionsPart2 = [
4
+ {
5
+ name: 'copy_paths',
6
+ title: 'Copy paths',
7
+ description: 'Copy two or more paths, or copy a directory recursively, in one call. Each item has its own source and destination. For exactly one regular file use copy_file.',
8
+ inputSchema: {
9
+ type: 'object',
10
+ properties: {
11
+ paths: {
12
+ type: 'array',
13
+ description: 'Pairs to copy, at most 200 per call.',
14
+ items: {
15
+ type: 'object',
16
+ properties: {
17
+ source: { type: 'string', description: 'Absolute path to copy.' },
18
+ destination: { type: 'string', description: 'Absolute destination path.' },
19
+ },
20
+ required: ['source', 'destination'],
21
+ additionalProperties: false,
22
+ },
23
+ },
24
+ overwrite: { type: 'boolean', description: 'Replace an existing destination. Default true.' },
25
+ },
26
+ required: ['paths'],
27
+ additionalProperties: false,
28
+ },
29
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
30
+ handler: fileToolHandlers.copy_paths,
31
+ },
32
+ {
33
+ name: 'move_paths',
34
+ title: 'Move paths',
35
+ description: 'Move or rename two or more files/directories in one batch, each with its own source and destination. Falls back to copy-and-delete across filesystems. For one source/destination pair use move_file.',
36
+ inputSchema: {
37
+ type: 'object',
38
+ properties: {
39
+ paths: {
40
+ type: 'array',
41
+ description: 'Pairs to move, at most 200 per call.',
42
+ items: {
43
+ type: 'object',
44
+ properties: {
45
+ source: { type: 'string', description: 'Absolute path to move.' },
46
+ destination: { type: 'string', description: 'Absolute destination path.' },
47
+ },
48
+ required: ['source', 'destination'],
49
+ additionalProperties: false,
50
+ },
51
+ },
52
+ overwrite: { type: 'boolean', description: 'Replace an existing destination. Default true.' },
53
+ },
54
+ required: ['paths'],
55
+ additionalProperties: false,
56
+ },
57
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
58
+ handler: fileToolHandlers.move_paths,
59
+ },
60
+ {
61
+ name: 'delete_path',
62
+ title: 'Delete path',
63
+ description: 'Delete exactly one file or directory. Directories are removed with their contents unless recursive is false; the filesystem root is refused. Use delete_paths for two or more targets, or move_to_trash when deletion should be reversible.',
64
+ inputSchema: {
65
+ type: 'object',
66
+ properties: {
67
+ path: { type: 'string', description: 'Absolute path to delete.' },
68
+ recursive: { type: 'boolean', description: 'Delete a non-empty directory with its contents. Default true.' },
69
+ },
70
+ required: ['path'],
71
+ additionalProperties: false,
72
+ },
73
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
74
+ handler: fileToolHandlers.delete_path,
75
+ },
76
+ {
77
+ name: 'delete_paths',
78
+ title: 'Delete paths',
79
+ description: 'Delete two or more files/directories in one batch and report each result. For one target use delete_path. Use move_to_trash instead when deletion should be reversible.',
80
+ inputSchema: {
81
+ type: 'object',
82
+ properties: {
83
+ paths: { type: 'array', items: { type: 'string' }, description: 'Absolute paths to delete, at most 500 per call.' },
84
+ recursive: { type: 'boolean', description: 'Delete non-empty directories with their contents. Default true.' },
85
+ },
86
+ required: ['paths'],
87
+ additionalProperties: false,
88
+ },
89
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
90
+ handler: fileToolHandlers.delete_paths,
91
+ },
92
+ {
93
+ name: 'create_archive',
94
+ title: 'Create archive',
95
+ description: 'Pack files and directories into a tar, tar.gz, or zip archive on the device, so a whole tree can be transferred or backed up in one call.',
96
+ inputSchema: {
97
+ type: 'object',
98
+ properties: {
99
+ paths: { type: 'array', items: { type: 'string' }, description: 'Absolute paths of the files and directories to include.' },
100
+ destination: { type: 'string', description: 'Absolute path of the archive to create.' },
101
+ format: { type: 'string', enum: ['tar', 'tar.gz', 'zip'], description: 'Archive format. Default tar.gz, or zip when the destination ends in .zip.' },
102
+ },
103
+ required: ['paths', 'destination'],
104
+ additionalProperties: false,
105
+ },
106
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
107
+ handler: fileToolHandlers.create_archive,
108
+ },
109
+ {
110
+ name: 'extract_archive',
111
+ title: 'Extract archive',
112
+ description: 'Extract a tar, tar.gz, tar.bz2, tar.xz, or zip archive on the device into a directory, creating it when needed.',
113
+ inputSchema: {
114
+ type: 'object',
115
+ properties: {
116
+ archive: { type: 'string', description: 'Absolute path of the archive to extract.' },
117
+ destination: { type: 'string', description: 'Absolute directory to extract into. Defaults to the archive directory.' },
118
+ },
119
+ required: ['archive'],
120
+ additionalProperties: false,
121
+ },
122
+ annotations: mutating,
123
+ handler: fileToolHandlers.extract_archive,
124
+ },
125
+ {
126
+ name: 'take_screenshot',
127
+ title: 'Take screenshot',
128
+ description: 'Capture the entire desktop only when full-screen pixels are actually needed. Prefer ui_snapshot or browser_snapshot for semantic inspection, and screenshot_region for one window, monitor, or rectangle. This tool uses the platform screenshot portal/utility and returns an image.',
129
+ inputSchema: {
130
+ type: 'object',
131
+ properties: {
132
+ directory: { type: 'string', description: 'Absolute directory to write the temporary PNG into. Defaults to the system temp directory.' },
133
+ keep: { type: 'boolean', description: 'Keep the PNG on disk instead of deleting it after it is returned. Default false.' },
134
+ },
135
+ additionalProperties: false,
136
+ },
137
+ // keep=true and oversized fallbacks persist a timestamped PNG, so a repeated call can add files.
138
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
139
+ handler: fileToolHandlers.take_screenshot,
140
+ },
141
+ {
142
+ name: 'start_search',
143
+ title: 'Start search',
144
+ description: 'Start a filename or content search on this computer and return the first matches without reading every matched file in full. Use read_files instead when a glob is already known and the contents of all matching files are the desired result. Content searches return "path:line: text" rows. Use get_more_search_results to page and stop_search to stop a long search.',
145
+ inputSchema: {
146
+ type: 'object',
147
+ properties: {
148
+ path: { type: 'string', description: 'Absolute path of the directory or file to search.' },
149
+ pattern: { type: 'string', description: 'Regular expression for content searches, or a glob such as "*.ts" when searchType is files.' },
150
+ searchType: { type: 'string', enum: ['content', 'files'], description: 'Search file contents (default) or file names.' },
151
+ filePattern: { type: 'string', description: 'Optional relative glob that limits which files are searched, such as "*.ts".' },
152
+ ignoreCase: { type: 'boolean', description: 'Case-insensitive content matching.' },
153
+ maxResults: { type: 'number', description: 'Stop the search after this many results. Default 200.' },
154
+ includeHidden: { type: 'boolean', description: 'Include hidden files and directories.' },
155
+ includeIgnored: { type: 'boolean', description: 'Also search directories normally skipped, such as node_modules, dist, build, and virtualenvs.' },
156
+ contextLines: { type: 'number', description: 'Number of context lines to return around each content match, up to 10.' },
157
+ literalSearch: { type: 'boolean', description: 'Treat the pattern as literal text instead of a regular expression.' },
158
+ },
159
+ required: ['path', 'pattern'],
160
+ additionalProperties: false,
161
+ },
162
+ annotations: readOnlyNonIdempotent,
163
+ handler: searchToolHandlers.start_search,
164
+ },
165
+ {
166
+ name: 'get_more_search_results',
167
+ title: 'Get more search results',
168
+ description: 'Read more results from a search started with start_search. Offset is zero-based; a negative offset returns the last N results.',
169
+ inputSchema: {
170
+ type: 'object',
171
+ properties: {
172
+ sessionId: { type: 'string', description: 'Search id returned by start_search.' },
173
+ offset: { type: 'number', description: 'Zero-based first result to return. Negative values read from the end.' },
174
+ length: { type: 'number', description: 'Maximum number of results to return. Default 100.' },
175
+ },
176
+ required: ['sessionId'],
177
+ additionalProperties: false,
178
+ },
179
+ annotations: readOnly,
180
+ handler: searchToolHandlers.get_more_search_results,
181
+ },
182
+ {
183
+ name: 'stop_search',
184
+ title: 'Stop search',
185
+ description: 'Stop a running search. Results collected so far stay readable until the search is cleaned up.',
186
+ inputSchema: {
187
+ type: 'object',
188
+ properties: {
189
+ sessionId: { type: 'string', description: 'Search id returned by start_search.' },
190
+ },
191
+ required: ['sessionId'],
192
+ additionalProperties: false,
193
+ },
194
+ annotations: additive,
195
+ handler: searchToolHandlers.stop_search,
196
+ },
197
+ {
198
+ name: 'list_searches',
199
+ title: 'List searches',
200
+ description: 'List active and recent searches on this computer with their status and result counts.',
201
+ inputSchema: { type: 'object', properties: {}, additionalProperties: false },
202
+ annotations: readOnly,
203
+ handler: searchToolHandlers.list_searches,
204
+ },
205
+ {
206
+ name: 'start_process',
207
+ title: 'Start process',
208
+ description: 'Run a shell command, script, build, test suite, or terminal server and return its initial output. Prefer dedicated semantic tools for jobs they already cover: launch_app for GUI apps, service for service-manager operations, power_action for lock/sleep/restart/shutdown, network for routine network inspection/tests, event_log for OS logs, installed_apps for software inventory, environment for environment facts, and open_path/reveal_path for opening or revealing files. The process keeps running so read_process_output or interact_with_process can be used later.',
209
+ inputSchema: {
210
+ type: 'object',
211
+ properties: {
212
+ command: { type: 'string', description: 'Shell command to run.' },
213
+ timeout_ms: { type: 'number', description: 'How long to wait for initial output before returning, in milliseconds. Default 1000.' },
214
+ },
215
+ required: ['command'],
216
+ additionalProperties: false,
217
+ },
218
+ annotations: command,
219
+ outputSchema: START_PROCESS_OUTPUT_SCHEMA,
220
+ handler: terminalToolHandlers.start_process,
221
+ },
222
+ {
223
+ name: 'read_process_output',
224
+ title: 'Read process output',
225
+ description: 'Read buffered output from a session started with start_process. Without an offset it returns output produced since the previous read.',
226
+ inputSchema: {
227
+ type: 'object',
228
+ properties: {
229
+ pid: { type: 'number', description: 'Session pid returned by start_process.' },
230
+ offset: { type: 'number', description: 'Zero-based line number to start from, counted across everything the session has produced; a negative value reads the last N lines. Omit for new output. Lines evicted by the buffer cap are no longer available.' },
231
+ length: { type: 'number', description: 'Maximum number of lines to return.' },
232
+ timeout_ms: { type: 'number', description: 'How long to wait for new output when no offset is given, in milliseconds.' },
233
+ },
234
+ required: ['pid'],
235
+ additionalProperties: false,
236
+ },
237
+ // Reading without an explicit offset advances the session cursor, so retries can return
238
+ // different output even after the process exits. It never modifies user files.
239
+ annotations: readOnlyNonIdempotent,
240
+ outputSchema: READ_PROCESS_OUTPUT_SCHEMA,
241
+ handler: terminalToolHandlers.read_process_output,
242
+ },
243
+ {
244
+ name: 'interact_with_process',
245
+ title: 'Interact with process',
246
+ description: 'Send one line of input to a running session and return the output it produces. Use this for REPLs and other interactive commands.',
247
+ inputSchema: {
248
+ type: 'object',
249
+ properties: {
250
+ pid: { type: 'number', description: 'Session pid returned by start_process.' },
251
+ input: { type: 'string', description: 'Line of input to send; a newline is appended.' },
252
+ timeout_ms: { type: 'number', description: 'How long to wait for the response, in milliseconds. Default 1000.' },
253
+ },
254
+ required: ['pid', 'input'],
255
+ additionalProperties: false,
256
+ },
257
+ annotations: command,
258
+ outputSchema: INTERACT_PROCESS_OUTPUT_SCHEMA,
259
+ handler: terminalToolHandlers.interact_with_process,
260
+ },
261
+ {
262
+ name: 'wait_for_process_output',
263
+ title: 'Wait for process output',
264
+ description: 'Wait until output from a running session matches a regular expression or literal string, then return the output collected since the previous read. Use this instead of polling read_process_output in a loop.',
265
+ inputSchema: {
266
+ type: 'object',
267
+ properties: {
268
+ pid: { type: 'number', description: 'Session pid returned by start_process.' },
269
+ pattern: { type: 'string', description: 'Regular expression or literal text to wait for.' },
270
+ timeout_ms: { type: 'number', description: 'How long to wait before returning the output collected so far, in milliseconds. Default 10000.' },
271
+ },
272
+ required: ['pid', 'pattern'],
273
+ additionalProperties: false,
274
+ },
275
+ annotations: readOnlyNonIdempotent,
276
+ outputSchema: WAIT_PROCESS_OUTPUT_SCHEMA,
277
+ handler: terminalToolHandlers.wait_for_process_output,
278
+ },
279
+ {
280
+ name: 'force_terminate',
281
+ title: 'Stop session',
282
+ description: 'Stop a ReMCP terminal session started with start_process, escalating from SIGTERM to SIGKILL when it does not exit. Use kill_process for an arbitrary operating-system PID that is not a ReMCP terminal session.',
283
+ inputSchema: {
284
+ type: 'object',
285
+ properties: {
286
+ pid: { type: 'number', description: 'Session pid returned by start_process.' },
287
+ },
288
+ required: ['pid'],
289
+ additionalProperties: false,
290
+ },
291
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false },
292
+ outputSchema: TERMINATE_PROCESS_OUTPUT_SCHEMA,
293
+ handler: terminalToolHandlers.force_terminate,
294
+ },
295
+ {
296
+ name: 'list_sessions',
297
+ title: 'List sessions',
298
+ description: 'List only terminal sessions started through ReMCP start_process, with status and runtime. Use list_processes for the computer-wide operating-system process list.',
299
+ inputSchema: { type: 'object', properties: {}, additionalProperties: false },
300
+ annotations: readOnly,
301
+ outputSchema: LIST_SESSIONS_OUTPUT_SCHEMA,
302
+ handler: terminalToolHandlers.list_sessions,
303
+ },
304
+ {
305
+ name: 'get_system_info',
306
+ title: 'Get system info',
307
+ description: 'Report machine health and host facts for the paired computer: operating system and kernel, CPU model/load, memory pressure, free disk space, uptime, and default shell. Use environment for PATH/shell/runtime environment variables and get_runtime_info for ReMCP-specific version, policy, roots, and limits.',
308
+ inputSchema: { type: 'object', properties: {}, additionalProperties: false },
309
+ annotations: readOnly,
310
+ handler: systemToolHandlers.get_system_info,
311
+ },
312
+ {
313
+ name: 'list_processes',
314
+ title: 'List processes',
315
+ description: 'List the computer-wide operating-system processes, highest CPU first, with pid, parent pid, CPU/memory usage, and command. Use list_sessions when the question is only about commands started through ReMCP start_process. Values that look like secrets are masked.',
316
+ inputSchema: {
317
+ type: 'object',
318
+ properties: {
319
+ limit: { type: 'number', description: 'Maximum number of processes to return. Default 100, maximum 1000.' },
320
+ },
321
+ additionalProperties: false,
322
+ },
323
+ annotations: readOnly,
324
+ handler: systemToolHandlers.list_processes,
325
+ },
326
+ {
327
+ name: 'kill_process',
328
+ title: 'Kill process',
329
+ description: 'Terminate an arbitrary operating-system process by pid. If the pid belongs to a ReMCP terminal session created by start_process, prefer force_terminate so ReMCP updates the session consistently and handles its process tree. Terminates the process and its children on Windows.',
330
+ inputSchema: {
331
+ type: 'object',
332
+ properties: {
333
+ pid: { type: 'number', description: 'Process id to terminate.' },
334
+ },
335
+ required: ['pid'],
336
+ additionalProperties: false,
337
+ },
338
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false },
339
+ handler: systemToolHandlers.kill_process,
340
+ },
341
+ {
342
+ name: 'get_runtime_info',
343
+ title: 'Get runtime info',
344
+ description: 'Report this computer\'s local ReMCP runtime: version, allowed roots, command policy, output limits, settable preferences, and usage-metric setting. Use get_system_info for OS/CPU/memory/disk facts and hosted get_configuration for deployment/account configuration. Read-only; use set_config_value only for telemetryEnabled, maxReadLines, maxBufferedLines, or maxOutputBytes. Access roots and command security stay local to the computer.',
345
+ inputSchema: { type: 'object', properties: {}, additionalProperties: false },
346
+ annotations: readOnly,
347
+ handler: statsToolHandlers.get_runtime_info,
348
+ },
349
+ {
350
+ name: 'get_runtime_stats',
351
+ title: 'Get runtime stats',
352
+ description: 'Report counters from the current local runtime session on this machine: tool calls/failures, blocked commands, active terminal/search sessions, and usage-metric queue state. Use hosted get_usage_statistics for account-level historical usage aggregated across devices and days.',
353
+ inputSchema: { type: 'object', properties: {}, additionalProperties: false },
354
+ annotations: readOnly,
355
+ handler: statsToolHandlers.get_runtime_stats,
356
+ },
357
+ {
358
+ name: 'set_config_value',
359
+ title: 'Change runtime setting',
360
+ description: 'Change one of this local runtime’s own preferences on the selected computer: telemetryEnabled, maxReadLines, maxBufferedLines or maxOutputBytes. This is not account-level device administration; use hosted device_action for ping, rename, enable/disable or removal. Access roots, blocked commands, shell/guardrails and the write limit remain local-only.',
361
+ inputSchema: {
362
+ type: 'object',
363
+ properties: {
364
+ key: { type: 'string', description: 'telemetryEnabled (true/false), maxReadLines, maxBufferedLines or maxOutputBytes.' },
365
+ value: { description: 'New value: a boolean for telemetryEnabled, a number for the limits.' },
366
+ },
367
+ required: ['key', 'value'],
368
+ additionalProperties: false,
369
+ },
370
+ // Preference only, and the same call twice leaves the same state.
371
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
372
+ handler: configToolHandlers.set_config_value,
373
+ },
374
+ ];
@@ -0,0 +1,92 @@
1
+ import { archiveBackendAvailable, fileToolHandlers } from './tools/files.mjs';
2
+ import { searchToolHandlers } from './tools/search.mjs';
3
+ import { terminalToolHandlers } from './tools/terminal.mjs';
4
+ import { systemToolHandlers } from './tools/system.mjs';
5
+ import { statsToolHandlers } from './tools/stats.mjs';
6
+ import { configToolHandlers } from './tools/config.mjs';
7
+
8
+ // Every tool answers with a text result (image tools add an image part as well), so the
9
+ // declared output schema is the same shape everywhere and clients can rely on it.
10
+ export const TEXT_OUTPUT_SCHEMA = {
11
+ type: 'object',
12
+ properties: {
13
+ text: { type: 'string', description: 'Human-readable result of the tool call.' },
14
+ },
15
+ required: ['text'],
16
+ additionalProperties: false,
17
+ };
18
+
19
+ export const NULLABLE_NUMBER_SCHEMA = { anyOf:[{ type:'number' }, { type:'null' }] };
20
+ export const NULLABLE_STRING_SCHEMA = { anyOf:[{ type:'string' }, { type:'null' }] };
21
+ export const TERMINAL_SESSION_PROPERTIES = {
22
+ pid:{ type:'number', description:'Process/session id used by follow-up terminal tools.' },
23
+ status:{ type:'string', description:'running or exited, with an exit code/signal when known.' },
24
+ runtimeMs:{ type:'number' },
25
+ lines:{ type:'number', description:'Total output lines produced by the session.' },
26
+ exited:{ type:'boolean' },
27
+ exitCode:NULLABLE_NUMBER_SCHEMA,
28
+ signal:NULLABLE_STRING_SCHEMA,
29
+ };
30
+ function terminalOutputSchema(extraProperties = {}, extraRequired = []) {
31
+ return {
32
+ type:'object',
33
+ properties:{ ...TERMINAL_SESSION_PROPERTIES, ...extraProperties },
34
+ required:['pid','status','runtimeMs','lines','exited','exitCode','signal', ...extraRequired],
35
+ additionalProperties:false,
36
+ };
37
+ }
38
+ export const START_PROCESS_OUTPUT_SCHEMA = terminalOutputSchema({
39
+ command:{ type:'string' },
40
+ output:{ type:'string' },
41
+ partial:{ type:'string' },
42
+ warning:{ type:'string' },
43
+ }, ['command','output']);
44
+ export const READ_PROCESS_OUTPUT_SCHEMA = terminalOutputSchema({
45
+ range:{ type:'string' },
46
+ output:{ type:'string' },
47
+ explicitOffset:{ type:'boolean' },
48
+ }, ['range','output','explicitOffset']);
49
+ export const WAIT_PROCESS_OUTPUT_SCHEMA = terminalOutputSchema({
50
+ pattern:{ type:'string' },
51
+ matched:{ type:'boolean' },
52
+ bufferedMatch:{ type:'boolean' },
53
+ timeoutMs:{ type:'number' },
54
+ output:{ type:'string' },
55
+ }, ['pattern','matched','bufferedMatch','timeoutMs','output']);
56
+ export const INTERACT_PROCESS_OUTPUT_SCHEMA = terminalOutputSchema({
57
+ output:{ type:'string' },
58
+ }, ['output']);
59
+ export const TERMINATE_PROCESS_OUTPUT_SCHEMA = terminalOutputSchema({
60
+ terminated:{ type:'boolean' },
61
+ alreadyExited:{ type:'boolean' },
62
+ escalated:{ type:'boolean' },
63
+ }, ['terminated','alreadyExited','escalated']);
64
+ export const LIST_SESSIONS_OUTPUT_SCHEMA = {
65
+ type:'object',
66
+ properties:{
67
+ sessions:{
68
+ type:'array',
69
+ items:{
70
+ type:'object',
71
+ properties:{
72
+ ...TERMINAL_SESSION_PROPERTIES,
73
+ blocked:{ type:'string' },
74
+ command:{ type:'string' },
75
+ },
76
+ required:['pid','status','runtimeMs','lines','exited','exitCode','signal','blocked','command'],
77
+ additionalProperties:false,
78
+ },
79
+ },
80
+ },
81
+ required:['sessions'],
82
+ additionalProperties:false,
83
+ };
84
+
85
+ export const readOnly = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false };
86
+ export const readOnlyNonIdempotent = { readOnlyHint: true, destructiveHint: false, idempotentHint: false, openWorldHint: false };
87
+ export const additive = { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false };
88
+ export const mutating = { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false };
89
+ export const command = { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true };
90
+
91
+
92
+ export { archiveBackendAvailable, fileToolHandlers, searchToolHandlers, terminalToolHandlers, systemToolHandlers, statsToolHandlers, configToolHandlers };