@google/gemini-cli-core 0.1.13 → 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 +50 -1
- package/dist/google-gemini-cli-core-0.1.15.tgz +0 -0
- package/dist/src/code_assist/codeAssist.js +2 -2
- package/dist/src/code_assist/codeAssist.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +9 -2
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +99 -7
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.d.ts +4 -6
- package/dist/src/code_assist/server.js +4 -69
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/setup.d.ts +6 -1
- package/dist/src/code_assist/setup.js +4 -1
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/code_assist/setup.test.js +4 -1
- package/dist/src/code_assist/setup.test.js.map +1 -1
- package/dist/src/code_assist/types.d.ts +2 -2
- package/dist/src/config/config.d.ts +43 -11
- package/dist/src/config/config.js +79 -27
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +34 -23
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/flashFallback.test.js +24 -48
- 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.d.ts +5 -2
- package/dist/src/core/client.js +64 -22
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +199 -2
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.d.ts +1 -1
- package/dist/src/core/contentGenerator.js +1 -1
- package/dist/src/core/contentGenerator.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.d.ts +4 -3
- package/dist/src/core/geminiChat.js +9 -11
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiRequest.js +2 -37
- package/dist/src/core/geminiRequest.js.map +1 -1
- package/dist/src/core/logger.d.ts +1 -0
- package/dist/src/core/logger.js +24 -4
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/logger.test.js +61 -10
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +5 -5
- package/dist/src/core/prompts.js +43 -19
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/prompts.test.js +121 -4
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/tokenLimits.js +1 -0
- package/dist/src/core/tokenLimits.js.map +1 -1
- package/dist/src/core/turn.d.ts +7 -2
- package/dist/src/core/turn.js +9 -0
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/core/turn.test.js +129 -0
- package/dist/src/core/turn.test.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 +40 -0
- package/dist/src/ide/ide-client.js +152 -0
- package/dist/src/ide/ide-client.js.map +1 -0
- 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.js +78 -0
- package/dist/src/ide/ide-installer.test.js.map +1 -0
- package/dist/src/ide/ideContext.d.ts +279 -0
- package/dist/src/ide/ideContext.js +102 -0
- package/dist/src/ide/ideContext.js.map +1 -0
- package/dist/src/ide/ideContext.test.js +265 -0
- package/dist/src/ide/ideContext.test.js.map +1 -0
- package/dist/src/index.d.ts +11 -1
- package/dist/src/index.js +14 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/google-auth-provider.d.ts +23 -0
- package/dist/src/mcp/google-auth-provider.js +63 -0
- package/dist/src/mcp/google-auth-provider.js.map +1 -0
- package/dist/src/mcp/google-auth-provider.test.d.ts +6 -0
- package/dist/src/mcp/google-auth-provider.test.js +54 -0
- package/dist/src/mcp/google-auth-provider.test.js.map +1 -0
- 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 +51 -5
- package/dist/src/services/loopDetectionService.js +140 -36
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/loopDetectionService.test.js +105 -99
- 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 +3 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +75 -33
- 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 +2 -0
- package/dist/src/telemetry/constants.js +2 -0
- package/dist/src/telemetry/constants.js.map +1 -1
- package/dist/src/telemetry/file-exporters.d.ts +28 -0
- package/dist/src/telemetry/file-exporters.js +62 -0
- package/dist/src/telemetry/file-exporters.js.map +1 -0
- 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 +3 -1
- package/dist/src/telemetry/loggers.js +33 -1
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/sdk.js +17 -6
- package/dist/src/telemetry/sdk.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 +16 -2
- package/dist/src/telemetry/types.js +25 -1
- 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 +14 -7
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +37 -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 +77 -10
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/ls.d.ts +5 -2
- package/dist/src/tools/ls.js +43 -13
- 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 +31 -3
- package/dist/src/tools/mcp-client.js +467 -38
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +99 -7
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.js +1 -1
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +34 -0
- package/dist/src/tools/mcp-tool.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 +125 -68
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/read-many-files.d.ts +5 -3
- package/dist/src/tools/read-many-files.js +83 -33
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +40 -4
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +3 -23
- package/dist/src/tools/shell.js +173 -300
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +278 -384
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +13 -1
- package/dist/src/tools/tool-registry.js +46 -2
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +13 -5
- 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.d.ts +2 -0
- package/dist/src/utils/bfsFileSearch.js +51 -24
- package/dist/src/utils/bfsFileSearch.js.map +1 -1
- package/dist/src/utils/bfsFileSearch.test.js +163 -103
- package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
- package/dist/src/utils/editCorrector.js +4 -4
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editCorrector.test.js +1 -1
- package/dist/src/utils/editor.js +16 -10
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +128 -28
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/errorReporting.d.ts +1 -1
- package/dist/src/utils/errorReporting.js +2 -2
- package/dist/src/utils/errorReporting.js.map +1 -1
- package/dist/src/utils/errorReporting.test.js +44 -38
- package/dist/src/utils/errorReporting.test.js.map +1 -1
- package/dist/src/utils/fileUtils.d.ts +4 -4
- package/dist/src/utils/fileUtils.js +31 -15
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/fileUtils.test.js +37 -37
- package/dist/src/utils/fileUtils.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/getFolderStructure.d.ts +3 -2
- package/dist/src/utils/getFolderStructure.js +27 -28
- package/dist/src/utils/getFolderStructure.js.map +1 -1
- package/dist/src/utils/getFolderStructure.test.js +169 -187
- package/dist/src/utils/getFolderStructure.test.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.js +4 -7
- package/dist/src/utils/gitIgnoreParser.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.test.js +70 -61
- package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.d.ts +2 -1
- package/dist/src/utils/memoryDiscovery.js +11 -5
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +160 -371
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- 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/partUtils.d.ts +14 -0
- package/dist/src/utils/partUtils.js +65 -0
- package/dist/src/utils/partUtils.js.map +1 -0
- package/dist/src/utils/partUtils.test.d.ts +6 -0
- package/dist/src/utils/partUtils.test.js +130 -0
- package/dist/src/utils/partUtils.test.js.map +1 -0
- package/dist/src/utils/paths.d.ts +11 -0
- package/dist/src/utils/paths.js +17 -1
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/quotaErrorDetection.js +0 -2
- package/dist/src/utils/quotaErrorDetection.js.map +1 -1
- package/dist/src/utils/retry.d.ts +3 -0
- package/dist/src/utils/retry.js +1 -1
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/schemaValidator.d.ts +1 -1
- package/dist/src/utils/schemaValidator.js +6 -3
- package/dist/src/utils/schemaValidator.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +78 -0
- package/dist/src/utils/shell-utils.js +306 -0
- package/dist/src/utils/shell-utils.js.map +1 -0
- package/dist/src/utils/shell-utils.test.d.ts +6 -0
- package/dist/src/utils/shell-utils.test.js +200 -0
- package/dist/src/utils/shell-utils.test.js.map +1 -0
- package/dist/src/utils/summarizer.js +1 -30
- package/dist/src/utils/summarizer.js.map +1 -1
- package/dist/src/utils/systemEncoding.d.ts +40 -0
- package/dist/src/utils/systemEncoding.js +149 -0
- package/dist/src/utils/systemEncoding.js.map +1 -0
- package/dist/src/utils/systemEncoding.test.d.ts +6 -0
- package/dist/src/utils/systemEncoding.test.js +368 -0
- package/dist/src/utils/systemEncoding.test.js.map +1 -0
- 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 +2 -1
- package/dist/google-gemini-cli-core-0.1.12.tgz +0 -0
- package/dist/src/core/geminiRequest.test.js +0 -72
- package/dist/src/core/geminiRequest.test.js.map +0 -1
- package/dist/src/services/ideContext.d.ts +0 -126
- package/dist/src/services/ideContext.js +0 -98
- package/dist/src/services/ideContext.js.map +0 -1
- package/dist/src/services/ideContext.test.js +0 -111
- package/dist/src/services/ideContext.test.js.map +0 -1
- /package/dist/src/{core/geminiRequest.test.d.ts → ide/ide-installer.test.d.ts} +0 -0
- /package/dist/src/{services → ide}/ideContext.test.d.ts +0 -0
|
@@ -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
|
*/
|
|
@@ -32,6 +38,10 @@ export declare enum MCPDiscoveryState {
|
|
|
32
38
|
/** Discovery has completed (with or without errors) */
|
|
33
39
|
COMPLETED = "completed"
|
|
34
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Map to track which MCP servers have been discovered to require OAuth
|
|
43
|
+
*/
|
|
44
|
+
export declare const mcpServerRequiresOAuth: Map<string, boolean>;
|
|
35
45
|
/**
|
|
36
46
|
* Event listeners for MCP server status changes
|
|
37
47
|
*/
|
|
@@ -66,7 +76,7 @@ export declare function getMCPDiscoveryState(): MCPDiscoveryState;
|
|
|
66
76
|
* @param toolRegistry The central registry where discovered tools will be registered.
|
|
67
77
|
* @returns A promise that resolves when the discovery process has been attempted for all servers.
|
|
68
78
|
*/
|
|
69
|
-
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>;
|
|
70
80
|
/** Visible for Testing */
|
|
71
81
|
export declare function populateMcpServerCommand(mcpServers: Record<string, MCPServerConfig>, mcpServerCommand: string | undefined): Record<string, MCPServerConfig>;
|
|
72
82
|
/**
|
|
@@ -79,7 +89,7 @@ export declare function populateMcpServerCommand(mcpServers: Record<string, MCPS
|
|
|
79
89
|
* @param toolRegistry The registry to register discovered tools with
|
|
80
90
|
* @returns Promise that resolves when discovery is complete
|
|
81
91
|
*/
|
|
82
|
-
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>;
|
|
83
93
|
/**
|
|
84
94
|
* Discovers and sanitizes tools from a connected MCP client.
|
|
85
95
|
* It retrieves function declarations from the client, filters out disabled tools,
|
|
@@ -92,6 +102,24 @@ export declare function connectAndDiscover(mcpServerName: string, mcpServerConfi
|
|
|
92
102
|
* @throws An error if no enabled tools are found or if the server provides invalid function declarations.
|
|
93
103
|
*/
|
|
94
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>;
|
|
95
123
|
/**
|
|
96
124
|
* Creates and connects an MCP client to a server based on the provided configuration.
|
|
97
125
|
* It determines the appropriate transport (Stdio, SSE, or Streamable HTTP) and
|
|
@@ -104,7 +132,7 @@ export declare function discoverTools(mcpServerName: string, mcpServerConfig: MC
|
|
|
104
132
|
*/
|
|
105
133
|
export declare function connectToMcpServer(mcpServerName: string, mcpServerConfig: MCPServerConfig, debugMode: boolean): Promise<Client>;
|
|
106
134
|
/** Visible for Testing */
|
|
107
|
-
export declare function createTransport(mcpServerName: string, mcpServerConfig: MCPServerConfig, debugMode: boolean): Transport
|
|
135
|
+
export declare function createTransport(mcpServerName: string, mcpServerConfig: MCPServerConfig, debugMode: boolean): Promise<Transport>;
|
|
108
136
|
/** Visible for testing */
|
|
109
137
|
export declare function isEnabled(funcDecl: FunctionDeclaration, mcpServerName: string, mcpServerConfig: MCPServerConfig): boolean;
|
|
110
138
|
export {};
|