@google/gemini-cli-core 0.1.14 → 0.1.15-nightly.250731.0c6f7884
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 +28 -0
- package/dist/google-gemini-cli-core-0.1.15.tgz +0 -0
- package/dist/src/code_assist/oauth2.test.js +14 -14
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/config/config.d.ts +21 -7
- package/dist/src/config/config.js +35 -13
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +33 -0
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/flashFallback.test.js +23 -47
- package/dist/src/config/flashFallback.test.js.map +1 -1
- package/dist/src/config/models.d.ts +1 -0
- package/dist/src/config/models.js +1 -0
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/core/client.js +37 -17
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +162 -16
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.d.ts +1 -3
- package/dist/src/core/coreToolScheduler.js +1 -3
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +76 -1
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +1 -0
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/logger.d.ts +1 -0
- package/dist/src/core/logger.js +22 -8
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/logger.test.js +60 -9
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/prompts.js +1 -1
- package/dist/src/core/tokenLimits.js +1 -0
- package/dist/src/core/tokenLimits.js.map +1 -1
- package/dist/src/ide/detect-ide.d.ts +10 -0
- package/dist/src/ide/detect-ide.js +24 -0
- package/dist/src/ide/detect-ide.js.map +1 -0
- package/dist/src/ide/ide-client.d.ts +19 -7
- package/dist/src/ide/ide-client.js +110 -37
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-installer.d.ts +15 -0
- package/dist/src/ide/ide-installer.js +111 -0
- package/dist/src/ide/ide-installer.js.map +1 -0
- package/dist/src/ide/ide-installer.test.d.ts +6 -0
- package/dist/src/ide/ide-installer.test.js +78 -0
- package/dist/src/ide/ide-installer.test.js.map +1 -0
- package/dist/src/ide/ideContext.d.ts +212 -107
- package/dist/src/ide/ideContext.js +45 -44
- package/dist/src/ide/ideContext.js.map +1 -1
- package/dist/src/ide/ideContext.test.js +254 -100
- package/dist/src/ide/ideContext.test.js.map +1 -1
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.js +10 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/oauth-provider.d.ts +5 -1
- package/dist/src/mcp/oauth-provider.js +36 -11
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-provider.test.js +2 -2
- package/dist/src/mcp/oauth-provider.test.js.map +1 -1
- package/dist/src/mcp/oauth-token-storage.d.ts +3 -1
- package/dist/src/mcp/oauth-token-storage.js +3 -1
- package/dist/src/mcp/oauth-token-storage.js.map +1 -1
- package/dist/src/mcp/oauth-utils.js +2 -2
- package/dist/src/mcp/oauth-utils.js.map +1 -1
- package/dist/src/mcp/oauth-utils.test.js +1 -1
- package/dist/src/mcp/oauth-utils.test.js.map +1 -1
- package/dist/src/prompts/mcp-prompts.d.ts +8 -0
- package/dist/src/prompts/mcp-prompts.js +13 -0
- package/dist/src/prompts/mcp-prompts.js.map +1 -0
- package/dist/src/prompts/prompt-registry.d.ts +26 -0
- package/dist/src/prompts/prompt-registry.js +47 -0
- package/dist/src/prompts/prompt-registry.js.map +1 -0
- package/dist/src/services/fileDiscoveryService.test.js +101 -60
- package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
- package/dist/src/services/gitService.test.js +67 -86
- package/dist/src/services/gitService.test.js.map +1 -1
- package/dist/src/services/loopDetectionService.d.ts +3 -0
- package/dist/src/services/loopDetectionService.js +18 -0
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/loopDetectionService.test.js +90 -11
- package/dist/src/services/loopDetectionService.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.d.ts +70 -0
- package/dist/src/services/shellExecutionService.js +152 -0
- package/dist/src/services/shellExecutionService.js.map +1 -0
- package/dist/src/services/shellExecutionService.test.d.ts +6 -0
- package/dist/src/services/shellExecutionService.test.js +258 -0
- package/dist/src/services/shellExecutionService.test.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +2 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +58 -31
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +3 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +7 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/constants.d.ts +1 -0
- package/dist/src/telemetry/constants.js +1 -0
- package/dist/src/telemetry/constants.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +2 -2
- package/dist/src/telemetry/index.js +2 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +2 -1
- package/dist/src/telemetry/loggers.js +17 -1
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/telemetry.test.js +2 -0
- package/dist/src/telemetry/telemetry.test.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +8 -1
- package/dist/src/telemetry/types.js +12 -0
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/test-utils/mockWorkspaceContext.d.ts +13 -0
- package/dist/src/test-utils/mockWorkspaceContext.js +24 -0
- package/dist/src/test-utils/mockWorkspaceContext.js.map +1 -0
- package/dist/src/tools/edit.js +4 -3
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +25 -1
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/glob.js +53 -17
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/glob.test.js +32 -6
- package/dist/src/tools/glob.test.js.map +1 -1
- package/dist/src/tools/grep.d.ts +1 -1
- package/dist/src/tools/grep.js +81 -29
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +76 -9
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/ls.js +4 -3
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/ls.test.d.ts +6 -0
- package/dist/src/tools/ls.test.js +356 -0
- package/dist/src/tools/ls.test.js.map +1 -0
- package/dist/src/tools/mcp-client.d.ts +26 -2
- package/dist/src/tools/mcp-client.js +64 -21
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +53 -1
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/memoryTool.d.ts +17 -2
- package/dist/src/tools/memoryTool.js +130 -13
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/memoryTool.test.js +88 -3
- package/dist/src/tools/memoryTool.test.js.map +1 -1
- package/dist/src/tools/modifiable-tool.test.js +51 -62
- package/dist/src/tools/modifiable-tool.test.js.map +1 -1
- package/dist/src/tools/read-file.js +8 -6
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-file.test.js +29 -1
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/read-many-files.js +22 -12
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +35 -2
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +1 -0
- package/dist/src/tools/shell.js +145 -185
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +275 -95
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/tool-registry.js +3 -3
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +10 -2
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/write-file.js +5 -3
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +36 -2
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/utils/bfsFileSearch.js +51 -27
- package/dist/src/utils/bfsFileSearch.js.map +1 -1
- package/dist/src/utils/bfsFileSearch.test.js +57 -0
- package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
- package/dist/src/utils/flashFallback.integration.test.js +8 -0
- package/dist/src/utils/flashFallback.integration.test.js.map +1 -1
- package/dist/src/utils/formatters.d.ts +6 -0
- package/dist/src/utils/formatters.js +16 -0
- package/dist/src/utils/formatters.js.map +1 -0
- package/dist/src/utils/nextSpeakerChecker.js +2 -2
- package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
- package/dist/src/utils/nextSpeakerChecker.test.js +2 -2
- package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
- package/dist/src/utils/retry.d.ts +3 -0
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +37 -3
- package/dist/src/utils/shell-utils.js +110 -47
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +146 -396
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/textUtils.d.ts +13 -0
- package/dist/src/utils/textUtils.js +28 -0
- package/dist/src/utils/textUtils.js.map +1 -0
- package/dist/src/utils/workspaceContext.d.ts +47 -0
- package/dist/src/utils/workspaceContext.js +106 -0
- package/dist/src/utils/workspaceContext.js.map +1 -0
- package/dist/src/utils/workspaceContext.test.d.ts +6 -0
- package/dist/src/utils/workspaceContext.test.js +209 -0
- package/dist/src/utils/workspaceContext.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/google-gemini-cli-core-0.1.13.tgz +0 -0
package/dist/src/tools/ls.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ls.js","sourceRoot":"","sources":["../../../src/tools/ls.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAU,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"ls.js","sourceRoot":"","sources":["../../../src/tools/ls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
7
|
+
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
vi.mock('fs', () => ({
|
|
11
|
+
default: {
|
|
12
|
+
statSync: vi.fn(),
|
|
13
|
+
readdirSync: vi.fn(),
|
|
14
|
+
},
|
|
15
|
+
statSync: vi.fn(),
|
|
16
|
+
readdirSync: vi.fn(),
|
|
17
|
+
}));
|
|
18
|
+
import { LSTool } from './ls.js';
|
|
19
|
+
describe('LSTool', () => {
|
|
20
|
+
let lsTool;
|
|
21
|
+
let mockConfig;
|
|
22
|
+
let mockWorkspaceContext;
|
|
23
|
+
let mockFileService;
|
|
24
|
+
const mockPrimaryDir = '/home/user/project';
|
|
25
|
+
const mockSecondaryDir = '/home/user/other-project';
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
vi.resetAllMocks();
|
|
28
|
+
// Mock WorkspaceContext
|
|
29
|
+
mockWorkspaceContext = {
|
|
30
|
+
getDirectories: vi
|
|
31
|
+
.fn()
|
|
32
|
+
.mockReturnValue([mockPrimaryDir, mockSecondaryDir]),
|
|
33
|
+
isPathWithinWorkspace: vi
|
|
34
|
+
.fn()
|
|
35
|
+
.mockImplementation((path) => path.startsWith(mockPrimaryDir) ||
|
|
36
|
+
path.startsWith(mockSecondaryDir)),
|
|
37
|
+
addDirectory: vi.fn(),
|
|
38
|
+
};
|
|
39
|
+
// Mock FileService
|
|
40
|
+
mockFileService = {
|
|
41
|
+
shouldGitIgnoreFile: vi.fn().mockReturnValue(false),
|
|
42
|
+
shouldGeminiIgnoreFile: vi.fn().mockReturnValue(false),
|
|
43
|
+
};
|
|
44
|
+
// Mock Config
|
|
45
|
+
mockConfig = {
|
|
46
|
+
getTargetDir: vi.fn().mockReturnValue(mockPrimaryDir),
|
|
47
|
+
getWorkspaceContext: vi.fn().mockReturnValue(mockWorkspaceContext),
|
|
48
|
+
getFileService: vi.fn().mockReturnValue(mockFileService),
|
|
49
|
+
getFileFilteringOptions: vi.fn().mockReturnValue({
|
|
50
|
+
respectGitIgnore: true,
|
|
51
|
+
respectGeminiIgnore: true,
|
|
52
|
+
}),
|
|
53
|
+
};
|
|
54
|
+
lsTool = new LSTool(mockConfig);
|
|
55
|
+
});
|
|
56
|
+
describe('parameter validation', () => {
|
|
57
|
+
it('should accept valid absolute paths within workspace', () => {
|
|
58
|
+
const params = {
|
|
59
|
+
path: '/home/user/project/src',
|
|
60
|
+
};
|
|
61
|
+
const error = lsTool.validateToolParams(params);
|
|
62
|
+
expect(error).toBeNull();
|
|
63
|
+
});
|
|
64
|
+
it('should reject relative paths', () => {
|
|
65
|
+
const params = {
|
|
66
|
+
path: './src',
|
|
67
|
+
};
|
|
68
|
+
const error = lsTool.validateToolParams(params);
|
|
69
|
+
expect(error).toBe('Path must be absolute: ./src');
|
|
70
|
+
});
|
|
71
|
+
it('should reject paths outside workspace with clear error message', () => {
|
|
72
|
+
const params = {
|
|
73
|
+
path: '/etc/passwd',
|
|
74
|
+
};
|
|
75
|
+
const error = lsTool.validateToolParams(params);
|
|
76
|
+
expect(error).toBe('Path must be within one of the workspace directories: /home/user/project, /home/user/other-project');
|
|
77
|
+
});
|
|
78
|
+
it('should accept paths in secondary workspace directory', () => {
|
|
79
|
+
const params = {
|
|
80
|
+
path: '/home/user/other-project/lib',
|
|
81
|
+
};
|
|
82
|
+
const error = lsTool.validateToolParams(params);
|
|
83
|
+
expect(error).toBeNull();
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
describe('execute', () => {
|
|
87
|
+
it('should list files in a directory', async () => {
|
|
88
|
+
const testPath = '/home/user/project/src';
|
|
89
|
+
const mockFiles = ['file1.ts', 'file2.ts', 'subdir'];
|
|
90
|
+
const mockStats = {
|
|
91
|
+
isDirectory: vi.fn(),
|
|
92
|
+
mtime: new Date(),
|
|
93
|
+
size: 1024,
|
|
94
|
+
};
|
|
95
|
+
vi.mocked(fs.statSync).mockImplementation((path) => {
|
|
96
|
+
const pathStr = path.toString();
|
|
97
|
+
if (pathStr === testPath) {
|
|
98
|
+
return { isDirectory: () => true };
|
|
99
|
+
}
|
|
100
|
+
// For individual files
|
|
101
|
+
if (pathStr.toString().endsWith('subdir')) {
|
|
102
|
+
return { ...mockStats, isDirectory: () => true, size: 0 };
|
|
103
|
+
}
|
|
104
|
+
return { ...mockStats, isDirectory: () => false };
|
|
105
|
+
});
|
|
106
|
+
vi.mocked(fs.readdirSync).mockReturnValue(mockFiles);
|
|
107
|
+
const result = await lsTool.execute({ path: testPath }, new AbortController().signal);
|
|
108
|
+
expect(result.llmContent).toContain('[DIR] subdir');
|
|
109
|
+
expect(result.llmContent).toContain('file1.ts');
|
|
110
|
+
expect(result.llmContent).toContain('file2.ts');
|
|
111
|
+
expect(result.returnDisplay).toBe('Listed 3 item(s).');
|
|
112
|
+
});
|
|
113
|
+
it('should list files from secondary workspace directory', async () => {
|
|
114
|
+
const testPath = '/home/user/other-project/lib';
|
|
115
|
+
const mockFiles = ['module1.js', 'module2.js'];
|
|
116
|
+
vi.mocked(fs.statSync).mockImplementation((path) => {
|
|
117
|
+
if (path.toString() === testPath) {
|
|
118
|
+
return { isDirectory: () => true };
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
isDirectory: () => false,
|
|
122
|
+
mtime: new Date(),
|
|
123
|
+
size: 2048,
|
|
124
|
+
};
|
|
125
|
+
});
|
|
126
|
+
vi.mocked(fs.readdirSync).mockReturnValue(mockFiles);
|
|
127
|
+
const result = await lsTool.execute({ path: testPath }, new AbortController().signal);
|
|
128
|
+
expect(result.llmContent).toContain('module1.js');
|
|
129
|
+
expect(result.llmContent).toContain('module2.js');
|
|
130
|
+
expect(result.returnDisplay).toBe('Listed 2 item(s).');
|
|
131
|
+
});
|
|
132
|
+
it('should handle empty directories', async () => {
|
|
133
|
+
const testPath = '/home/user/project/empty';
|
|
134
|
+
vi.mocked(fs.statSync).mockReturnValue({
|
|
135
|
+
isDirectory: () => true,
|
|
136
|
+
});
|
|
137
|
+
vi.mocked(fs.readdirSync).mockReturnValue([]);
|
|
138
|
+
const result = await lsTool.execute({ path: testPath }, new AbortController().signal);
|
|
139
|
+
expect(result.llmContent).toBe('Directory /home/user/project/empty is empty.');
|
|
140
|
+
expect(result.returnDisplay).toBe('Directory is empty.');
|
|
141
|
+
});
|
|
142
|
+
it('should respect ignore patterns', async () => {
|
|
143
|
+
const testPath = '/home/user/project/src';
|
|
144
|
+
const mockFiles = ['test.js', 'test.spec.js', 'index.js'];
|
|
145
|
+
vi.mocked(fs.statSync).mockImplementation((path) => {
|
|
146
|
+
const pathStr = path.toString();
|
|
147
|
+
if (pathStr === testPath) {
|
|
148
|
+
return { isDirectory: () => true };
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
isDirectory: () => false,
|
|
152
|
+
mtime: new Date(),
|
|
153
|
+
size: 1024,
|
|
154
|
+
};
|
|
155
|
+
});
|
|
156
|
+
vi.mocked(fs.readdirSync).mockReturnValue(mockFiles);
|
|
157
|
+
const result = await lsTool.execute({ path: testPath, ignore: ['*.spec.js'] }, new AbortController().signal);
|
|
158
|
+
expect(result.llmContent).toContain('test.js');
|
|
159
|
+
expect(result.llmContent).toContain('index.js');
|
|
160
|
+
expect(result.llmContent).not.toContain('test.spec.js');
|
|
161
|
+
expect(result.returnDisplay).toBe('Listed 2 item(s).');
|
|
162
|
+
});
|
|
163
|
+
it('should respect gitignore patterns', async () => {
|
|
164
|
+
const testPath = '/home/user/project/src';
|
|
165
|
+
const mockFiles = ['file1.js', 'file2.js', 'ignored.js'];
|
|
166
|
+
vi.mocked(fs.statSync).mockImplementation((path) => {
|
|
167
|
+
const pathStr = path.toString();
|
|
168
|
+
if (pathStr === testPath) {
|
|
169
|
+
return { isDirectory: () => true };
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
isDirectory: () => false,
|
|
173
|
+
mtime: new Date(),
|
|
174
|
+
size: 1024,
|
|
175
|
+
};
|
|
176
|
+
});
|
|
177
|
+
vi.mocked(fs.readdirSync).mockReturnValue(mockFiles);
|
|
178
|
+
mockFileService.shouldGitIgnoreFile.mockImplementation((path) => path.includes('ignored.js'));
|
|
179
|
+
const result = await lsTool.execute({ path: testPath }, new AbortController().signal);
|
|
180
|
+
expect(result.llmContent).toContain('file1.js');
|
|
181
|
+
expect(result.llmContent).toContain('file2.js');
|
|
182
|
+
expect(result.llmContent).not.toContain('ignored.js');
|
|
183
|
+
expect(result.returnDisplay).toBe('Listed 2 item(s). (1 git-ignored)');
|
|
184
|
+
});
|
|
185
|
+
it('should respect geminiignore patterns', async () => {
|
|
186
|
+
const testPath = '/home/user/project/src';
|
|
187
|
+
const mockFiles = ['file1.js', 'file2.js', 'private.js'];
|
|
188
|
+
vi.mocked(fs.statSync).mockImplementation((path) => {
|
|
189
|
+
const pathStr = path.toString();
|
|
190
|
+
if (pathStr === testPath) {
|
|
191
|
+
return { isDirectory: () => true };
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
isDirectory: () => false,
|
|
195
|
+
mtime: new Date(),
|
|
196
|
+
size: 1024,
|
|
197
|
+
};
|
|
198
|
+
});
|
|
199
|
+
vi.mocked(fs.readdirSync).mockReturnValue(mockFiles);
|
|
200
|
+
mockFileService.shouldGeminiIgnoreFile.mockImplementation((path) => path.includes('private.js'));
|
|
201
|
+
const result = await lsTool.execute({ path: testPath }, new AbortController().signal);
|
|
202
|
+
expect(result.llmContent).toContain('file1.js');
|
|
203
|
+
expect(result.llmContent).toContain('file2.js');
|
|
204
|
+
expect(result.llmContent).not.toContain('private.js');
|
|
205
|
+
expect(result.returnDisplay).toBe('Listed 2 item(s). (1 gemini-ignored)');
|
|
206
|
+
});
|
|
207
|
+
it('should handle non-directory paths', async () => {
|
|
208
|
+
const testPath = '/home/user/project/file.txt';
|
|
209
|
+
vi.mocked(fs.statSync).mockReturnValue({
|
|
210
|
+
isDirectory: () => false,
|
|
211
|
+
});
|
|
212
|
+
const result = await lsTool.execute({ path: testPath }, new AbortController().signal);
|
|
213
|
+
expect(result.llmContent).toContain('Path is not a directory');
|
|
214
|
+
expect(result.returnDisplay).toBe('Error: Path is not a directory.');
|
|
215
|
+
});
|
|
216
|
+
it('should handle non-existent paths', async () => {
|
|
217
|
+
const testPath = '/home/user/project/does-not-exist';
|
|
218
|
+
vi.mocked(fs.statSync).mockImplementation(() => {
|
|
219
|
+
throw new Error('ENOENT: no such file or directory');
|
|
220
|
+
});
|
|
221
|
+
const result = await lsTool.execute({ path: testPath }, new AbortController().signal);
|
|
222
|
+
expect(result.llmContent).toContain('Error listing directory');
|
|
223
|
+
expect(result.returnDisplay).toBe('Error: Failed to list directory.');
|
|
224
|
+
});
|
|
225
|
+
it('should sort directories first, then files alphabetically', async () => {
|
|
226
|
+
const testPath = '/home/user/project/src';
|
|
227
|
+
const mockFiles = ['z-file.ts', 'a-dir', 'b-file.ts', 'c-dir'];
|
|
228
|
+
vi.mocked(fs.statSync).mockImplementation((path) => {
|
|
229
|
+
if (path.toString() === testPath) {
|
|
230
|
+
return { isDirectory: () => true };
|
|
231
|
+
}
|
|
232
|
+
if (path.toString().endsWith('-dir')) {
|
|
233
|
+
return {
|
|
234
|
+
isDirectory: () => true,
|
|
235
|
+
mtime: new Date(),
|
|
236
|
+
size: 0,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
isDirectory: () => false,
|
|
241
|
+
mtime: new Date(),
|
|
242
|
+
size: 1024,
|
|
243
|
+
};
|
|
244
|
+
});
|
|
245
|
+
vi.mocked(fs.readdirSync).mockReturnValue(mockFiles);
|
|
246
|
+
const result = await lsTool.execute({ path: testPath }, new AbortController().signal);
|
|
247
|
+
const lines = (typeof result.llmContent === 'string' ? result.llmContent : '').split('\n');
|
|
248
|
+
const entries = lines.slice(1).filter((line) => line.trim()); // Skip header
|
|
249
|
+
expect(entries[0]).toBe('[DIR] a-dir');
|
|
250
|
+
expect(entries[1]).toBe('[DIR] c-dir');
|
|
251
|
+
expect(entries[2]).toBe('b-file.ts');
|
|
252
|
+
expect(entries[3]).toBe('z-file.ts');
|
|
253
|
+
});
|
|
254
|
+
it('should handle permission errors gracefully', async () => {
|
|
255
|
+
const testPath = '/home/user/project/restricted';
|
|
256
|
+
vi.mocked(fs.statSync).mockReturnValue({
|
|
257
|
+
isDirectory: () => true,
|
|
258
|
+
});
|
|
259
|
+
vi.mocked(fs.readdirSync).mockImplementation(() => {
|
|
260
|
+
throw new Error('EACCES: permission denied');
|
|
261
|
+
});
|
|
262
|
+
const result = await lsTool.execute({ path: testPath }, new AbortController().signal);
|
|
263
|
+
expect(result.llmContent).toContain('Error listing directory');
|
|
264
|
+
expect(result.llmContent).toContain('permission denied');
|
|
265
|
+
expect(result.returnDisplay).toBe('Error: Failed to list directory.');
|
|
266
|
+
});
|
|
267
|
+
it('should validate parameters and return error for invalid params', async () => {
|
|
268
|
+
const result = await lsTool.execute({ path: '../outside' }, new AbortController().signal);
|
|
269
|
+
expect(result.llmContent).toContain('Invalid parameters provided');
|
|
270
|
+
expect(result.returnDisplay).toBe('Error: Failed to execute tool.');
|
|
271
|
+
});
|
|
272
|
+
it('should handle errors accessing individual files during listing', async () => {
|
|
273
|
+
const testPath = '/home/user/project/src';
|
|
274
|
+
const mockFiles = ['accessible.ts', 'inaccessible.ts'];
|
|
275
|
+
vi.mocked(fs.statSync).mockImplementation((path) => {
|
|
276
|
+
if (path.toString() === testPath) {
|
|
277
|
+
return { isDirectory: () => true };
|
|
278
|
+
}
|
|
279
|
+
if (path.toString().endsWith('inaccessible.ts')) {
|
|
280
|
+
throw new Error('EACCES: permission denied');
|
|
281
|
+
}
|
|
282
|
+
return {
|
|
283
|
+
isDirectory: () => false,
|
|
284
|
+
mtime: new Date(),
|
|
285
|
+
size: 1024,
|
|
286
|
+
};
|
|
287
|
+
});
|
|
288
|
+
vi.mocked(fs.readdirSync).mockReturnValue(mockFiles);
|
|
289
|
+
// Spy on console.error to verify it's called
|
|
290
|
+
const consoleErrorSpy = vi
|
|
291
|
+
.spyOn(console, 'error')
|
|
292
|
+
.mockImplementation(() => { });
|
|
293
|
+
const result = await lsTool.execute({ path: testPath }, new AbortController().signal);
|
|
294
|
+
// Should still list the accessible file
|
|
295
|
+
expect(result.llmContent).toContain('accessible.ts');
|
|
296
|
+
expect(result.llmContent).not.toContain('inaccessible.ts');
|
|
297
|
+
expect(result.returnDisplay).toBe('Listed 1 item(s).');
|
|
298
|
+
// Verify error was logged
|
|
299
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Error accessing'));
|
|
300
|
+
consoleErrorSpy.mockRestore();
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
describe('getDescription', () => {
|
|
304
|
+
it('should return shortened relative path', () => {
|
|
305
|
+
const params = {
|
|
306
|
+
path: path.join(mockPrimaryDir, 'deeply', 'nested', 'directory'),
|
|
307
|
+
};
|
|
308
|
+
const description = lsTool.getDescription(params);
|
|
309
|
+
expect(description).toBe(path.join('deeply', 'nested', 'directory'));
|
|
310
|
+
});
|
|
311
|
+
it('should handle paths in secondary workspace', () => {
|
|
312
|
+
const params = {
|
|
313
|
+
path: path.join(mockSecondaryDir, 'lib'),
|
|
314
|
+
};
|
|
315
|
+
const description = lsTool.getDescription(params);
|
|
316
|
+
expect(description).toBe(path.join('..', 'other-project', 'lib'));
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
describe('workspace boundary validation', () => {
|
|
320
|
+
it('should accept paths in primary workspace directory', () => {
|
|
321
|
+
const params = { path: `${mockPrimaryDir}/src` };
|
|
322
|
+
expect(lsTool.validateToolParams(params)).toBeNull();
|
|
323
|
+
});
|
|
324
|
+
it('should accept paths in secondary workspace directory', () => {
|
|
325
|
+
const params = { path: `${mockSecondaryDir}/lib` };
|
|
326
|
+
expect(lsTool.validateToolParams(params)).toBeNull();
|
|
327
|
+
});
|
|
328
|
+
it('should reject paths outside all workspace directories', () => {
|
|
329
|
+
const params = { path: '/etc/passwd' };
|
|
330
|
+
const error = lsTool.validateToolParams(params);
|
|
331
|
+
expect(error).toContain('Path must be within one of the workspace directories');
|
|
332
|
+
expect(error).toContain(mockPrimaryDir);
|
|
333
|
+
expect(error).toContain(mockSecondaryDir);
|
|
334
|
+
});
|
|
335
|
+
it('should list files from secondary workspace directory', async () => {
|
|
336
|
+
const testPath = `${mockSecondaryDir}/tests`;
|
|
337
|
+
const mockFiles = ['test1.spec.ts', 'test2.spec.ts'];
|
|
338
|
+
vi.mocked(fs.statSync).mockImplementation((path) => {
|
|
339
|
+
if (path.toString() === testPath) {
|
|
340
|
+
return { isDirectory: () => true };
|
|
341
|
+
}
|
|
342
|
+
return {
|
|
343
|
+
isDirectory: () => false,
|
|
344
|
+
mtime: new Date(),
|
|
345
|
+
size: 512,
|
|
346
|
+
};
|
|
347
|
+
});
|
|
348
|
+
vi.mocked(fs.readdirSync).mockReturnValue(mockFiles);
|
|
349
|
+
const result = await lsTool.execute({ path: testPath }, new AbortController().signal);
|
|
350
|
+
expect(result.llmContent).toContain('test1.spec.ts');
|
|
351
|
+
expect(result.llmContent).toContain('test2.spec.ts');
|
|
352
|
+
expect(result.returnDisplay).toBe('Listed 2 item(s).');
|
|
353
|
+
});
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
//# sourceMappingURL=ls.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ls.test.js","sourceRoot":"","sources":["../../../src/tools/ls.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,11 +5,17 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
7
7
|
import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
8
|
+
import { Prompt, GetPromptResult } from '@modelcontextprotocol/sdk/types.js';
|
|
8
9
|
import { MCPServerConfig } from '../config/config.js';
|
|
9
10
|
import { DiscoveredMCPTool } from './mcp-tool.js';
|
|
10
11
|
import { FunctionDeclaration } from '@google/genai';
|
|
11
12
|
import { ToolRegistry } from './tool-registry.js';
|
|
13
|
+
import { PromptRegistry } from '../prompts/prompt-registry.js';
|
|
12
14
|
export declare const MCP_DEFAULT_TIMEOUT_MSEC: number;
|
|
15
|
+
export type DiscoveredMCPPrompt = Prompt & {
|
|
16
|
+
serverName: string;
|
|
17
|
+
invoke: (params: Record<string, unknown>) => Promise<GetPromptResult>;
|
|
18
|
+
};
|
|
13
19
|
/**
|
|
14
20
|
* Enum representing the connection status of an MCP server
|
|
15
21
|
*/
|
|
@@ -70,7 +76,7 @@ export declare function getMCPDiscoveryState(): MCPDiscoveryState;
|
|
|
70
76
|
* @param toolRegistry The central registry where discovered tools will be registered.
|
|
71
77
|
* @returns A promise that resolves when the discovery process has been attempted for all servers.
|
|
72
78
|
*/
|
|
73
|
-
export declare function discoverMcpTools(mcpServers: Record<string, MCPServerConfig>, mcpServerCommand: string | undefined, toolRegistry: ToolRegistry, debugMode: boolean): Promise<void>;
|
|
79
|
+
export declare function discoverMcpTools(mcpServers: Record<string, MCPServerConfig>, mcpServerCommand: string | undefined, toolRegistry: ToolRegistry, promptRegistry: PromptRegistry, debugMode: boolean): Promise<void>;
|
|
74
80
|
/** Visible for Testing */
|
|
75
81
|
export declare function populateMcpServerCommand(mcpServers: Record<string, MCPServerConfig>, mcpServerCommand: string | undefined): Record<string, MCPServerConfig>;
|
|
76
82
|
/**
|
|
@@ -83,7 +89,7 @@ export declare function populateMcpServerCommand(mcpServers: Record<string, MCPS
|
|
|
83
89
|
* @param toolRegistry The registry to register discovered tools with
|
|
84
90
|
* @returns Promise that resolves when discovery is complete
|
|
85
91
|
*/
|
|
86
|
-
export declare function connectAndDiscover(mcpServerName: string, mcpServerConfig: MCPServerConfig, toolRegistry: ToolRegistry, debugMode: boolean): Promise<void>;
|
|
92
|
+
export declare function connectAndDiscover(mcpServerName: string, mcpServerConfig: MCPServerConfig, toolRegistry: ToolRegistry, promptRegistry: PromptRegistry, debugMode: boolean): Promise<void>;
|
|
87
93
|
/**
|
|
88
94
|
* Discovers and sanitizes tools from a connected MCP client.
|
|
89
95
|
* It retrieves function declarations from the client, filters out disabled tools,
|
|
@@ -96,6 +102,24 @@ export declare function connectAndDiscover(mcpServerName: string, mcpServerConfi
|
|
|
96
102
|
* @throws An error if no enabled tools are found or if the server provides invalid function declarations.
|
|
97
103
|
*/
|
|
98
104
|
export declare function discoverTools(mcpServerName: string, mcpServerConfig: MCPServerConfig, mcpClient: Client): Promise<DiscoveredMCPTool[]>;
|
|
105
|
+
/**
|
|
106
|
+
* Discovers and logs prompts from a connected MCP client.
|
|
107
|
+
* It retrieves prompt declarations from the client and logs their names.
|
|
108
|
+
*
|
|
109
|
+
* @param mcpServerName The name of the MCP server.
|
|
110
|
+
* @param mcpClient The active MCP client instance.
|
|
111
|
+
*/
|
|
112
|
+
export declare function discoverPrompts(mcpServerName: string, mcpClient: Client, promptRegistry: PromptRegistry): Promise<void>;
|
|
113
|
+
/**
|
|
114
|
+
* Invokes a prompt on a connected MCP client.
|
|
115
|
+
*
|
|
116
|
+
* @param mcpServerName The name of the MCP server.
|
|
117
|
+
* @param mcpClient The active MCP client instance.
|
|
118
|
+
* @param promptName The name of the prompt to invoke.
|
|
119
|
+
* @param promptParams The parameters to pass to the prompt.
|
|
120
|
+
* @returns A promise that resolves to the result of the prompt invocation.
|
|
121
|
+
*/
|
|
122
|
+
export declare function invokeMcpPrompt(mcpServerName: string, mcpClient: Client, promptName: string, promptParams: Record<string, unknown>): Promise<GetPromptResult>;
|
|
99
123
|
/**
|
|
100
124
|
* Creates and connects an MCP client to a server based on the provided configuration.
|
|
101
125
|
* It determines the appropriate transport (Stdio, SSE, or Streamable HTTP) and
|
|
@@ -7,6 +7,7 @@ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
|
7
7
|
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
8
8
|
import { SSEClientTransport, } from '@modelcontextprotocol/sdk/client/sse.js';
|
|
9
9
|
import { StreamableHTTPClientTransport, } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
10
|
+
import { ListPromptsResultSchema, GetPromptResultSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
10
11
|
import { parse } from 'shell-quote';
|
|
11
12
|
import { AuthProviderType } from '../config/config.js';
|
|
12
13
|
import { GoogleCredentialProvider } from '../mcp/google-auth-provider.js';
|
|
@@ -44,7 +45,7 @@ export var MCPDiscoveryState;
|
|
|
44
45
|
/**
|
|
45
46
|
* Map to track the status of each MCP server within the core package
|
|
46
47
|
*/
|
|
47
|
-
const
|
|
48
|
+
const serverStatuses = new Map();
|
|
48
49
|
/**
|
|
49
50
|
* Track the overall MCP discovery state
|
|
50
51
|
*/
|
|
@@ -73,7 +74,7 @@ export function removeMCPStatusChangeListener(listener) {
|
|
|
73
74
|
* Update the status of an MCP server
|
|
74
75
|
*/
|
|
75
76
|
function updateMCPServerStatus(serverName, status) {
|
|
76
|
-
|
|
77
|
+
serverStatuses.set(serverName, status);
|
|
77
78
|
// Notify all listeners
|
|
78
79
|
for (const listener of statusChangeListeners) {
|
|
79
80
|
listener(serverName, status);
|
|
@@ -83,13 +84,13 @@ function updateMCPServerStatus(serverName, status) {
|
|
|
83
84
|
* Get the current status of an MCP server
|
|
84
85
|
*/
|
|
85
86
|
export function getMCPServerStatus(serverName) {
|
|
86
|
-
return
|
|
87
|
+
return serverStatuses.get(serverName) || MCPServerStatus.DISCONNECTED;
|
|
87
88
|
}
|
|
88
89
|
/**
|
|
89
90
|
* Get all MCP server statuses
|
|
90
91
|
*/
|
|
91
92
|
export function getAllMCPServerStatuses() {
|
|
92
|
-
return new Map(
|
|
93
|
+
return new Map(serverStatuses);
|
|
93
94
|
}
|
|
94
95
|
/**
|
|
95
96
|
* Get the current MCP discovery state
|
|
@@ -97,17 +98,6 @@ export function getAllMCPServerStatuses() {
|
|
|
97
98
|
export function getMCPDiscoveryState() {
|
|
98
99
|
return mcpDiscoveryState;
|
|
99
100
|
}
|
|
100
|
-
/**
|
|
101
|
-
* Parse www-authenticate header to extract OAuth metadata URI.
|
|
102
|
-
*
|
|
103
|
-
* @param wwwAuthenticate The www-authenticate header value
|
|
104
|
-
* @returns The resource metadata URI if found, null otherwise
|
|
105
|
-
*/
|
|
106
|
-
function _parseWWWAuthenticate(wwwAuthenticate) {
|
|
107
|
-
// Parse header like: Bearer realm="MCP Server", resource_metadata_uri="https://..."
|
|
108
|
-
const resourceMetadataMatch = wwwAuthenticate.match(/resource_metadata_uri="([^"]+)"/);
|
|
109
|
-
return resourceMetadataMatch ? resourceMetadataMatch[1] : null;
|
|
110
|
-
}
|
|
111
101
|
/**
|
|
112
102
|
* Extract WWW-Authenticate header from error message string.
|
|
113
103
|
* This is a more robust approach than regex matching.
|
|
@@ -233,11 +223,11 @@ async function createTransportWithOAuth(mcpServerName, mcpServerConfig, accessTo
|
|
|
233
223
|
* @param toolRegistry The central registry where discovered tools will be registered.
|
|
234
224
|
* @returns A promise that resolves when the discovery process has been attempted for all servers.
|
|
235
225
|
*/
|
|
236
|
-
export async function discoverMcpTools(mcpServers, mcpServerCommand, toolRegistry, debugMode) {
|
|
226
|
+
export async function discoverMcpTools(mcpServers, mcpServerCommand, toolRegistry, promptRegistry, debugMode) {
|
|
237
227
|
mcpDiscoveryState = MCPDiscoveryState.IN_PROGRESS;
|
|
238
228
|
try {
|
|
239
229
|
mcpServers = populateMcpServerCommand(mcpServers, mcpServerCommand);
|
|
240
|
-
const discoveryPromises = Object.entries(mcpServers).map(([mcpServerName, mcpServerConfig]) => connectAndDiscover(mcpServerName, mcpServerConfig, toolRegistry, debugMode));
|
|
230
|
+
const discoveryPromises = Object.entries(mcpServers).map(([mcpServerName, mcpServerConfig]) => connectAndDiscover(mcpServerName, mcpServerConfig, toolRegistry, promptRegistry, debugMode));
|
|
241
231
|
await Promise.all(discoveryPromises);
|
|
242
232
|
}
|
|
243
233
|
finally {
|
|
@@ -270,7 +260,7 @@ export function populateMcpServerCommand(mcpServers, mcpServerCommand) {
|
|
|
270
260
|
* @param toolRegistry The registry to register discovered tools with
|
|
271
261
|
* @returns Promise that resolves when discovery is complete
|
|
272
262
|
*/
|
|
273
|
-
export async function connectAndDiscover(mcpServerName, mcpServerConfig, toolRegistry, debugMode) {
|
|
263
|
+
export async function connectAndDiscover(mcpServerName, mcpServerConfig, toolRegistry, promptRegistry, debugMode) {
|
|
274
264
|
updateMCPServerStatus(mcpServerName, MCPServerStatus.CONNECTING);
|
|
275
265
|
try {
|
|
276
266
|
const mcpClient = await connectToMcpServer(mcpServerName, mcpServerConfig, debugMode);
|
|
@@ -280,6 +270,7 @@ export async function connectAndDiscover(mcpServerName, mcpServerConfig, toolReg
|
|
|
280
270
|
console.error(`MCP ERROR (${mcpServerName}):`, error.toString());
|
|
281
271
|
updateMCPServerStatus(mcpServerName, MCPServerStatus.DISCONNECTED);
|
|
282
272
|
};
|
|
273
|
+
await discoverPrompts(mcpServerName, mcpClient, promptRegistry);
|
|
283
274
|
const tools = await discoverTools(mcpServerName, mcpServerConfig, mcpClient);
|
|
284
275
|
for (const tool of tools) {
|
|
285
276
|
toolRegistry.registerTool(tool);
|
|
@@ -320,15 +311,67 @@ export async function discoverTools(mcpServerName, mcpServerConfig, mcpClient) {
|
|
|
320
311
|
}
|
|
321
312
|
discoveredTools.push(new DiscoveredMCPTool(mcpCallableTool, mcpServerName, funcDecl.name, funcDecl.description ?? '', funcDecl.parametersJsonSchema ?? { type: 'object', properties: {} }, mcpServerConfig.timeout ?? MCP_DEFAULT_TIMEOUT_MSEC, mcpServerConfig.trust));
|
|
322
313
|
}
|
|
323
|
-
if (discoveredTools.length === 0) {
|
|
324
|
-
throw Error('No enabled tools found');
|
|
325
|
-
}
|
|
326
314
|
return discoveredTools;
|
|
327
315
|
}
|
|
328
316
|
catch (error) {
|
|
329
317
|
throw new Error(`Error discovering tools: ${error}`);
|
|
330
318
|
}
|
|
331
319
|
}
|
|
320
|
+
/**
|
|
321
|
+
* Discovers and logs prompts from a connected MCP client.
|
|
322
|
+
* It retrieves prompt declarations from the client and logs their names.
|
|
323
|
+
*
|
|
324
|
+
* @param mcpServerName The name of the MCP server.
|
|
325
|
+
* @param mcpClient The active MCP client instance.
|
|
326
|
+
*/
|
|
327
|
+
export async function discoverPrompts(mcpServerName, mcpClient, promptRegistry) {
|
|
328
|
+
try {
|
|
329
|
+
const response = await mcpClient.request({ method: 'prompts/list', params: {} }, ListPromptsResultSchema);
|
|
330
|
+
for (const prompt of response.prompts) {
|
|
331
|
+
promptRegistry.registerPrompt({
|
|
332
|
+
...prompt,
|
|
333
|
+
serverName: mcpServerName,
|
|
334
|
+
invoke: (params) => invokeMcpPrompt(mcpServerName, mcpClient, prompt.name, params),
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
catch (error) {
|
|
339
|
+
// It's okay if this fails, not all servers will have prompts.
|
|
340
|
+
// Don't log an error if the method is not found, which is a common case.
|
|
341
|
+
if (error instanceof Error &&
|
|
342
|
+
!error.message?.includes('Method not found')) {
|
|
343
|
+
console.error(`Error discovering prompts from ${mcpServerName}: ${getErrorMessage(error)}`);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Invokes a prompt on a connected MCP client.
|
|
349
|
+
*
|
|
350
|
+
* @param mcpServerName The name of the MCP server.
|
|
351
|
+
* @param mcpClient The active MCP client instance.
|
|
352
|
+
* @param promptName The name of the prompt to invoke.
|
|
353
|
+
* @param promptParams The parameters to pass to the prompt.
|
|
354
|
+
* @returns A promise that resolves to the result of the prompt invocation.
|
|
355
|
+
*/
|
|
356
|
+
export async function invokeMcpPrompt(mcpServerName, mcpClient, promptName, promptParams) {
|
|
357
|
+
try {
|
|
358
|
+
const response = await mcpClient.request({
|
|
359
|
+
method: 'prompts/get',
|
|
360
|
+
params: {
|
|
361
|
+
name: promptName,
|
|
362
|
+
arguments: promptParams,
|
|
363
|
+
},
|
|
364
|
+
}, GetPromptResultSchema);
|
|
365
|
+
return response;
|
|
366
|
+
}
|
|
367
|
+
catch (error) {
|
|
368
|
+
if (error instanceof Error &&
|
|
369
|
+
!error.message?.includes('Method not found')) {
|
|
370
|
+
console.error(`Error invoking prompt '${promptName}' from ${mcpServerName} ${promptParams}: ${getErrorMessage(error)}`);
|
|
371
|
+
}
|
|
372
|
+
throw error;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
332
375
|
/**
|
|
333
376
|
* Creates and connects an MCP client to a server based on the provided configuration.
|
|
334
377
|
* It determines the appropriate transport (Stdio, SSE, or Streamable HTTP) and
|