@google/gemini-cli-core 0.1.20 → 0.1.22
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 +27 -29
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/src/code_assist/converter.d.ts +1 -0
- package/dist/src/code_assist/converter.js +1 -0
- package/dist/src/code_assist/converter.js.map +1 -1
- package/dist/src/code_assist/oauth2.d.ts +1 -0
- package/dist/src/code_assist/oauth2.js +37 -20
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +51 -8
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.js +1 -1
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/setup.js +47 -16
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/code_assist/setup.test.js +114 -8
- package/dist/src/code_assist/setup.test.js.map +1 -1
- package/dist/src/config/config.d.ts +8 -3
- package/dist/src/config/config.js +25 -12
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +83 -1
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/core/client.d.ts +7 -12
- package/dist/src/core/client.js +67 -30
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +354 -0
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.js +19 -11
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +39 -15
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.js +6 -2
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +46 -65
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/logger.d.ts +22 -1
- package/dist/src/core/logger.js +103 -17
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/logger.test.js +86 -20
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.js +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +79 -36
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/prompts.js +4 -4
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +7 -0
- package/dist/src/generated/git-commit.js +10 -0
- package/dist/src/generated/git-commit.js.map +1 -0
- package/dist/src/ide/constants.d.ts +6 -0
- package/dist/src/ide/constants.js +7 -0
- package/dist/src/ide/constants.js.map +1 -0
- package/dist/src/ide/detect-ide.d.ts +2 -0
- package/dist/src/ide/detect-ide.js +22 -6
- package/dist/src/ide/detect-ide.js.map +1 -1
- package/dist/src/ide/detect-ide.test.d.ts +6 -0
- package/dist/src/ide/detect-ide.test.js +65 -0
- package/dist/src/ide/detect-ide.test.js.map +1 -0
- package/dist/src/ide/ide-client.d.ts +5 -1
- package/dist/src/ide/ide-client.js +57 -21
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-client.test.d.ts +6 -0
- package/dist/src/ide/ide-client.test.js +43 -0
- package/dist/src/ide/ide-client.test.js.map +1 -0
- package/dist/src/ide/ide-installer.js +5 -4
- package/dist/src/ide/ide-installer.js.map +1 -1
- package/dist/src/ide/process-utils.d.ts +14 -0
- package/dist/src/ide/process-utils.js +57 -0
- package/dist/src/ide/process-utils.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/oauth-provider.d.ts +0 -1
- package/dist/src/mcp/oauth-provider.js +176 -59
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-provider.test.js +132 -62
- package/dist/src/mcp/oauth-provider.test.js.map +1 -1
- package/dist/src/mcp/oauth-utils.d.ts +3 -1
- package/dist/src/mcp/oauth-utils.js +50 -12
- package/dist/src/mcp/oauth-utils.js.map +1 -1
- package/dist/src/mcp/oauth-utils.test.js +17 -2
- package/dist/src/mcp/oauth-utils.test.js.map +1 -1
- package/dist/src/services/loopDetectionService.js +5 -5
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +13 -3
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +23 -4
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +84 -33
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +11 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +143 -29
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +8 -2
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +17 -9
- 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/integration.test.circular.js +1 -0
- package/dist/src/telemetry/integration.test.circular.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +3 -1
- package/dist/src/telemetry/loggers.js +37 -4
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +27 -2
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +4 -0
- package/dist/src/telemetry/metrics.js +21 -8
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +31 -1
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/sdk.js +64 -36
- package/dist/src/telemetry/sdk.js.map +1 -1
- package/dist/src/telemetry/sdk.test.d.ts +6 -0
- package/dist/src/telemetry/sdk.test.js +82 -0
- package/dist/src/telemetry/sdk.test.js.map +1 -0
- package/dist/src/telemetry/types.d.ts +40 -14
- package/dist/src/telemetry/types.js +46 -23
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/test-utils/tools.d.ts +21 -6
- package/dist/src/test-utils/tools.js +78 -13
- package/dist/src/test-utils/tools.js.map +1 -1
- package/dist/src/tools/edit.js +2 -2
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/glob.js +2 -2
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/grep.js +2 -2
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/ls.d.ts +3 -22
- package/dist/src/tools/ls.js +81 -77
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/ls.test.js +62 -34
- package/dist/src/tools/ls.test.js.map +1 -1
- package/dist/src/tools/mcp-client.js +40 -10
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +31 -1
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +3 -5
- package/dist/src/tools/mcp-tool.js +62 -21
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +110 -51
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/memoryTool.d.ts +9 -13
- package/dist/src/tools/memoryTool.js +124 -117
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/memoryTool.test.js +28 -17
- package/dist/src/tools/memoryTool.test.js.map +1 -1
- package/dist/src/tools/read-file.js +2 -2
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-many-files.d.ts +4 -5
- package/dist/src/tools/read-many-files.js +112 -100
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +60 -37
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +4 -6
- package/dist/src/tools/shell.js +116 -105
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +52 -46
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/tool-error.d.ts +1 -0
- package/dist/src/tools/tool-error.js +1 -0
- package/dist/src/tools/tool-error.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +8 -3
- package/dist/src/tools/tool-registry.js +56 -30
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tools.d.ts +28 -86
- package/dist/src/tools/tools.js +67 -122
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/tools.test.js +91 -2
- package/dist/src/tools/tools.test.js.map +1 -1
- package/dist/src/tools/web-fetch.d.ts +4 -7
- package/dist/src/tools/web-fetch.js +62 -62
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +8 -4
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/web-search.d.ts +4 -5
- package/dist/src/tools/web-search.js +51 -50
- package/dist/src/tools/web-search.js.map +1 -1
- package/dist/src/tools/web-search.test.d.ts +6 -0
- package/dist/src/tools/web-search.test.js +139 -0
- package/dist/src/tools/web-search.test.js.map +1 -0
- package/dist/src/tools/write-file.d.ts +15 -10
- package/dist/src/tools/write-file.js +133 -141
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +57 -88
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/utils/browser.js +4 -3
- package/dist/src/utils/browser.js.map +1 -1
- package/dist/src/utils/editCorrector.js +13 -13
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editor.js +1 -1
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +10 -10
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/errorParsing.d.ts +8 -0
- package/dist/src/utils/errorParsing.js +93 -0
- package/dist/src/utils/errorParsing.js.map +1 -0
- package/dist/src/utils/errorParsing.test.d.ts +6 -0
- package/dist/src/utils/errorParsing.test.js +172 -0
- package/dist/src/utils/errorParsing.test.js.map +1 -0
- package/dist/src/utils/filesearch/crawler.d.ts +15 -0
- package/dist/src/utils/filesearch/crawler.js +50 -0
- package/dist/src/utils/filesearch/crawler.js.map +1 -0
- package/dist/src/utils/filesearch/crawler.test.d.ts +6 -0
- package/dist/src/utils/filesearch/crawler.test.js +468 -0
- package/dist/src/utils/filesearch/crawler.test.js.map +1 -0
- package/dist/src/utils/filesearch/fileSearch.d.ts +9 -53
- package/dist/src/utils/filesearch/fileSearch.js +63 -118
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.test.js +95 -197
- package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
- package/dist/src/utils/filesearch/ignore.d.ts +7 -0
- package/dist/src/utils/filesearch/ignore.js +25 -0
- package/dist/src/utils/filesearch/ignore.js.map +1 -1
- package/dist/src/utils/filesearch/ignore.test.js +89 -2
- package/dist/src/utils/filesearch/ignore.test.js.map +1 -1
- package/dist/src/utils/filesearch/result-cache.d.ts +1 -2
- package/dist/src/utils/filesearch/result-cache.js +1 -3
- package/dist/src/utils/filesearch/result-cache.js.map +1 -1
- package/dist/src/utils/filesearch/result-cache.test.js +3 -4
- package/dist/src/utils/filesearch/result-cache.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.js +3 -3
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +3 -2
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.js +3 -7
- package/dist/src/utils/memoryImportProcessor.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.test.js +17 -20
- package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
- package/dist/src/utils/paths.d.ts +7 -0
- package/dist/src/utils/paths.js +15 -0
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/paths.test.js +74 -2
- package/dist/src/utils/paths.test.js.map +1 -1
- package/dist/src/utils/quotaErrorDetection.d.ts +1 -5
- package/dist/src/utils/quotaErrorDetection.js.map +1 -1
- package/dist/src/utils/secure-browser-launcher.js +4 -3
- package/dist/src/utils/secure-browser-launcher.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +39 -0
- package/dist/src/utils/shell-utils.js +72 -2
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +132 -4
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/systemEncoding.js +1 -1
- package/dist/src/utils/systemEncoding.js.map +1 -1
- package/dist/src/utils/systemEncoding.test.js +23 -23
- package/dist/src/utils/systemEncoding.test.js.map +1 -1
- package/dist/src/utils/workspaceContext.d.ts +22 -7
- package/dist/src/utils/workspaceContext.js +81 -55
- package/dist/src/utils/workspaceContext.js.map +1 -1
- package/dist/src/utils/workspaceContext.test.js +221 -137
- package/dist/src/utils/workspaceContext.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -2
- package/dist/src/core/modelCheck.d.ts +0 -14
- package/dist/src/core/modelCheck.js +0 -62
- package/dist/src/core/modelCheck.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ide-client.js","sourceRoot":"","sources":["../../../src/ide/ide-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,
|
|
1
|
+
{"version":3,"file":"ide-client.js","sourceRoot":"","sources":["../../../src/ide/ide-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect } from 'vitest';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import { IdeClient } from './ide-client.js';
|
|
9
|
+
describe('IdeClient.validateWorkspacePath', () => {
|
|
10
|
+
it('should return valid if cwd is a subpath of the IDE workspace path', () => {
|
|
11
|
+
const result = IdeClient.validateWorkspacePath('/Users/person/gemini-cli', 'VS Code', '/Users/person/gemini-cli/sub-dir');
|
|
12
|
+
expect(result.isValid).toBe(true);
|
|
13
|
+
});
|
|
14
|
+
it('should return invalid if GEMINI_CLI_IDE_WORKSPACE_PATH is undefined', () => {
|
|
15
|
+
const result = IdeClient.validateWorkspacePath(undefined, 'VS Code', '/Users/person/gemini-cli/sub-dir');
|
|
16
|
+
expect(result.isValid).toBe(false);
|
|
17
|
+
expect(result.error).toContain('Failed to connect');
|
|
18
|
+
});
|
|
19
|
+
it('should return invalid if GEMINI_CLI_IDE_WORKSPACE_PATH is empty', () => {
|
|
20
|
+
const result = IdeClient.validateWorkspacePath('', 'VS Code', '/Users/person/gemini-cli/sub-dir');
|
|
21
|
+
expect(result.isValid).toBe(false);
|
|
22
|
+
expect(result.error).toContain('please open a workspace folder');
|
|
23
|
+
});
|
|
24
|
+
it('should return invalid if cwd is not within the IDE workspace path', () => {
|
|
25
|
+
const result = IdeClient.validateWorkspacePath('/some/other/path', 'VS Code', '/Users/person/gemini-cli/sub-dir');
|
|
26
|
+
expect(result.isValid).toBe(false);
|
|
27
|
+
expect(result.error).toContain('Directory mismatch');
|
|
28
|
+
});
|
|
29
|
+
it('should handle multiple workspace paths and return valid', () => {
|
|
30
|
+
const result = IdeClient.validateWorkspacePath(['/some/other/path', '/Users/person/gemini-cli'].join(path.delimiter), 'VS Code', '/Users/person/gemini-cli/sub-dir');
|
|
31
|
+
expect(result.isValid).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
it('should return invalid if cwd is not in any of the multiple workspace paths', () => {
|
|
34
|
+
const result = IdeClient.validateWorkspacePath(['/some/other/path', '/another/path'].join(path.delimiter), 'VS Code', '/Users/person/gemini-cli/sub-dir');
|
|
35
|
+
expect(result.isValid).toBe(false);
|
|
36
|
+
expect(result.error).toContain('Directory mismatch');
|
|
37
|
+
});
|
|
38
|
+
it.skipIf(process.platform !== 'win32')('should handle windows paths', () => {
|
|
39
|
+
const result = IdeClient.validateWorkspacePath('c:/some/other/path;d:/Users/person/gemini-cli', 'VS Code', 'd:/Users/person/gemini-cli/sub-dir');
|
|
40
|
+
expect(result.isValid).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=ide-client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ide-client.test.js","sourceRoot":"","sources":["../../../src/ide/ide-client.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import * as path from 'path';
|
|
|
9
9
|
import * as fs from 'fs';
|
|
10
10
|
import * as os from 'os';
|
|
11
11
|
import { DetectedIde } from './detect-ide.js';
|
|
12
|
+
import { GEMINI_CLI_COMPANION_EXTENSION_NAME } from './constants.js';
|
|
12
13
|
const VSCODE_COMMAND = process.platform === 'win32' ? 'code.cmd' : 'code';
|
|
13
14
|
async function findVsCodeCommand() {
|
|
14
15
|
// 1. Check PATH first.
|
|
@@ -35,7 +36,7 @@ async function findVsCodeCommand() {
|
|
|
35
36
|
}
|
|
36
37
|
else if (platform === 'win32') {
|
|
37
38
|
// Windows
|
|
38
|
-
locations.push(path.join(process.env
|
|
39
|
+
locations.push(path.join(process.env['ProgramFiles'] || 'C:\\Program Files', 'Microsoft VS Code', 'bin', 'code.cmd'), path.join(homeDir, 'AppData', 'Local', 'Programs', 'Microsoft VS Code', 'bin', 'code.cmd'));
|
|
39
40
|
}
|
|
40
41
|
for (const location of locations) {
|
|
41
42
|
if (fs.existsSync(location)) {
|
|
@@ -54,7 +55,7 @@ class VsCodeInstaller {
|
|
|
54
55
|
if (!commandPath) {
|
|
55
56
|
return {
|
|
56
57
|
success: false,
|
|
57
|
-
message: `VS Code CLI not found. Please ensure 'code' is in your system's PATH. For help, see https://code.visualstudio.com/docs/configure/command-line#_code-is-not-recognized-as-an-internal-or-external-command. You can also install the
|
|
58
|
+
message: `VS Code CLI not found. Please ensure 'code' is in your system's PATH. For help, see https://code.visualstudio.com/docs/configure/command-line#_code-is-not-recognized-as-an-internal-or-external-command. You can also install the '${GEMINI_CLI_COMPANION_EXTENSION_NAME}' extension manually from the VS Code marketplace.`,
|
|
58
59
|
};
|
|
59
60
|
}
|
|
60
61
|
const command = `"${commandPath}" --install-extension google.gemini-cli-vscode-ide-companion --force`;
|
|
@@ -62,13 +63,13 @@ class VsCodeInstaller {
|
|
|
62
63
|
child_process.execSync(command, { stdio: 'pipe' });
|
|
63
64
|
return {
|
|
64
65
|
success: true,
|
|
65
|
-
message: 'VS Code companion extension was installed successfully.
|
|
66
|
+
message: 'VS Code companion extension was installed successfully.',
|
|
66
67
|
};
|
|
67
68
|
}
|
|
68
69
|
catch (_error) {
|
|
69
70
|
return {
|
|
70
71
|
success: false,
|
|
71
|
-
message: `Failed to install VS Code companion extension. Please try installing
|
|
72
|
+
message: `Failed to install VS Code companion extension. Please try installing '${GEMINI_CLI_COMPANION_EXTENSION_NAME}' manually from the VS Code extension marketplace.`,
|
|
72
73
|
};
|
|
73
74
|
}
|
|
74
75
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ide-installer.js","sourceRoot":"","sources":["../../../src/ide/ide-installer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,aAAa,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"ide-installer.js","sourceRoot":"","sources":["../../../src/ide/ide-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Traverses up the process tree from the current process to find the top-level ancestor process ID.
|
|
8
|
+
* This is useful for identifying the main application process that spawned the current script,
|
|
9
|
+
* such as the main VS Code window process.
|
|
10
|
+
*
|
|
11
|
+
* @returns A promise that resolves to the numeric PID of the top-level process.
|
|
12
|
+
* @throws Will throw an error if the underlying shell commands fail unexpectedly.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getIdeProcessId(): Promise<number>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { exec } from 'child_process';
|
|
7
|
+
import { promisify } from 'util';
|
|
8
|
+
import os from 'os';
|
|
9
|
+
const execAsync = promisify(exec);
|
|
10
|
+
/**
|
|
11
|
+
* Traverses up the process tree from the current process to find the top-level ancestor process ID.
|
|
12
|
+
* This is useful for identifying the main application process that spawned the current script,
|
|
13
|
+
* such as the main VS Code window process.
|
|
14
|
+
*
|
|
15
|
+
* @returns A promise that resolves to the numeric PID of the top-level process.
|
|
16
|
+
* @throws Will throw an error if the underlying shell commands fail unexpectedly.
|
|
17
|
+
*/
|
|
18
|
+
export async function getIdeProcessId() {
|
|
19
|
+
const platform = os.platform();
|
|
20
|
+
let currentPid = process.pid;
|
|
21
|
+
// Loop upwards through the process tree, with a depth limit to prevent infinite loops.
|
|
22
|
+
const MAX_TRAVERSAL_DEPTH = 32;
|
|
23
|
+
for (let i = 0; i < MAX_TRAVERSAL_DEPTH; i++) {
|
|
24
|
+
let parentPid;
|
|
25
|
+
try {
|
|
26
|
+
// Use wmic for Windows
|
|
27
|
+
if (platform === 'win32') {
|
|
28
|
+
const command = `wmic process where "ProcessId=${currentPid}" get ParentProcessId /value`;
|
|
29
|
+
const { stdout } = await execAsync(command);
|
|
30
|
+
const match = stdout.match(/ParentProcessId=(\d+)/);
|
|
31
|
+
parentPid = match ? parseInt(match[1], 10) : 0; // Top of the tree is 0
|
|
32
|
+
}
|
|
33
|
+
// Use ps for macOS, Linux, and other Unix-like systems
|
|
34
|
+
else {
|
|
35
|
+
const command = `ps -o ppid= -p ${currentPid}`;
|
|
36
|
+
const { stdout } = await execAsync(command);
|
|
37
|
+
const ppid = parseInt(stdout.trim(), 10);
|
|
38
|
+
parentPid = isNaN(ppid) ? 1 : ppid; // Top of the tree is 1
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (_) {
|
|
42
|
+
// This can happen if a process in the chain dies during execution.
|
|
43
|
+
// We'll break the loop and return the last valid PID we found.
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
// Define the root PID for the current OS
|
|
47
|
+
const rootPid = platform === 'win32' ? 0 : 1;
|
|
48
|
+
// If the parent is the root process or invalid, we've found our target.
|
|
49
|
+
if (parentPid === rootPid || parentPid <= 0) {
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
// Move one level up the tree for the next iteration.
|
|
53
|
+
currentPid = parentPid;
|
|
54
|
+
}
|
|
55
|
+
return currentPid;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=process-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-utils.js","sourceRoot":"","sources":["../../../src/ide/process-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC/B,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAE7B,uFAAuF;IACvF,MAAM,mBAAmB,GAAG,EAAE,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,mBAAmB,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,IAAI,SAAiB,CAAC;QAEtB,IAAI,CAAC;YACH,uBAAuB;YACvB,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,iCAAiC,UAAU,8BAA8B,CAAC;gBAC1F,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBACpD,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;YACzE,CAAC;YACD,uDAAuD;iBAClD,CAAC;gBACJ,MAAM,OAAO,GAAG,kBAAkB,UAAU,EAAE,CAAC;gBAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBACzC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,uBAAuB;YAC7D,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,mEAAmE;YACnE,+DAA+D;YAC/D,MAAM;QACR,CAAC;QAED,yCAAyC;QACzC,MAAM,OAAO,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7C,wEAAwE;QACxE,IAAI,SAAS,KAAK,OAAO,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YAC5C,MAAM;QACR,CAAC;QACD,qDAAqD;QACrD,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -34,12 +34,14 @@ export * from './utils/systemEncoding.js';
|
|
|
34
34
|
export * from './utils/textUtils.js';
|
|
35
35
|
export * from './utils/formatters.js';
|
|
36
36
|
export * from './utils/filesearch/fileSearch.js';
|
|
37
|
+
export * from './utils/errorParsing.js';
|
|
37
38
|
export * from './services/fileDiscoveryService.js';
|
|
38
39
|
export * from './services/gitService.js';
|
|
39
40
|
export * from './ide/ide-client.js';
|
|
40
41
|
export * from './ide/ideContext.js';
|
|
41
42
|
export * from './ide/ide-installer.js';
|
|
42
43
|
export { getIdeInfo, DetectedIde, IdeInfo } from './ide/detect-ide.js';
|
|
44
|
+
export * from './ide/constants.js';
|
|
43
45
|
export * from './services/shellExecutionService.js';
|
|
44
46
|
export * from './tools/tools.js';
|
|
45
47
|
export * from './tools/tool-error.js';
|
package/dist/src/index.js
CHANGED
|
@@ -37,6 +37,7 @@ export * from './utils/systemEncoding.js';
|
|
|
37
37
|
export * from './utils/textUtils.js';
|
|
38
38
|
export * from './utils/formatters.js';
|
|
39
39
|
export * from './utils/filesearch/fileSearch.js';
|
|
40
|
+
export * from './utils/errorParsing.js';
|
|
40
41
|
// Export services
|
|
41
42
|
export * from './services/fileDiscoveryService.js';
|
|
42
43
|
export * from './services/gitService.js';
|
|
@@ -45,6 +46,7 @@ export * from './ide/ide-client.js';
|
|
|
45
46
|
export * from './ide/ideContext.js';
|
|
46
47
|
export * from './ide/ide-installer.js';
|
|
47
48
|
export { getIdeInfo, DetectedIde } from './ide/detect-ide.js';
|
|
49
|
+
export * from './ide/constants.js';
|
|
48
50
|
// Export Shell Execution Service
|
|
49
51
|
export * from './services/shellExecutionService.js';
|
|
50
52
|
// Export base tool definitions
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gBAAgB;AAChB,cAAc,oBAAoB,CAAC;AAEnC,oBAAoB;AACpB,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sCAAsC,CAAC;AAErD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AAEvC,mBAAmB;AACnB,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gBAAgB;AAChB,cAAc,oBAAoB,CAAC;AAEnC,oBAAoB;AACpB,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sCAAsC,CAAC;AAErD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AAEvC,mBAAmB;AACnB,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC;AACjD,cAAc,yBAAyB,CAAC;AAExC,kBAAkB;AAClB,cAAc,oCAAoC,CAAC;AACnD,cAAc,0BAA0B,CAAC;AAEzC,4BAA4B;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAW,MAAM,qBAAqB,CAAC;AACvE,cAAc,oBAAoB,CAAC;AAEnC,iCAAiC;AACjC,cAAc,qCAAqC,CAAC;AAEpD,+BAA+B;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AAEzC,sBAAsB;AACtB,cAAc,0BAA0B,CAAC;AAEzC,6BAA6B;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AAEpC,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAGL,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAMtC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,6BAA6B;AAC7B,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,cAAc,oBAAoB,CAAC"}
|
|
@@ -69,7 +69,6 @@ export declare class MCPOAuthProvider {
|
|
|
69
69
|
private static readonly REDIRECT_PORT;
|
|
70
70
|
private static readonly REDIRECT_PATH;
|
|
71
71
|
private static readonly HTTP_OK;
|
|
72
|
-
private static readonly HTTP_REDIRECT;
|
|
73
72
|
/**
|
|
74
73
|
* Register a client dynamically with the OAuth server.
|
|
75
74
|
*
|
|
@@ -17,7 +17,6 @@ export class MCPOAuthProvider {
|
|
|
17
17
|
static REDIRECT_PORT = 7777;
|
|
18
18
|
static REDIRECT_PATH = '/oauth/callback';
|
|
19
19
|
static HTTP_OK = 200;
|
|
20
|
-
static HTTP_REDIRECT = 302;
|
|
21
20
|
/**
|
|
22
21
|
* Register a client dynamically with the OAuth server.
|
|
23
22
|
*
|
|
@@ -57,8 +56,8 @@ export class MCPOAuthProvider {
|
|
|
57
56
|
* @returns OAuth configuration if discovered, null otherwise
|
|
58
57
|
*/
|
|
59
58
|
static async discoverOAuthFromMCPServer(mcpServerUrl) {
|
|
60
|
-
|
|
61
|
-
return OAuthUtils.discoverOAuthConfig(
|
|
59
|
+
// Use the full URL with path preserved for OAuth discovery
|
|
60
|
+
return OAuthUtils.discoverOAuthConfig(mcpServerUrl);
|
|
62
61
|
}
|
|
63
62
|
/**
|
|
64
63
|
* Generate PKCE parameters for OAuth flow.
|
|
@@ -180,13 +179,14 @@ export class MCPOAuthProvider {
|
|
|
180
179
|
params.append('audience', config.audiences.join(' '));
|
|
181
180
|
}
|
|
182
181
|
// Add resource parameter for MCP OAuth spec compliance
|
|
183
|
-
//
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
182
|
+
// Only add if we have an MCP server URL (indicates MCP OAuth flow, not standard OAuth)
|
|
183
|
+
if (mcpServerUrl) {
|
|
184
|
+
try {
|
|
185
|
+
params.append('resource', OAuthUtils.buildResourceParameter(mcpServerUrl));
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
console.warn(`Could not add resource parameter: ${getErrorMessage(error)}`);
|
|
189
|
+
}
|
|
190
190
|
}
|
|
191
191
|
const url = new URL(config.authorizationUrl);
|
|
192
192
|
params.forEach((value, key) => {
|
|
@@ -220,26 +220,76 @@ export class MCPOAuthProvider {
|
|
|
220
220
|
params.append('audience', config.audiences.join(' '));
|
|
221
221
|
}
|
|
222
222
|
// Add resource parameter for MCP OAuth spec compliance
|
|
223
|
-
//
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
223
|
+
// Only add if we have an MCP server URL (indicates MCP OAuth flow, not standard OAuth)
|
|
224
|
+
if (mcpServerUrl) {
|
|
225
|
+
const resourceUrl = mcpServerUrl;
|
|
226
|
+
try {
|
|
227
|
+
params.append('resource', OAuthUtils.buildResourceParameter(resourceUrl));
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
console.warn(`Could not add resource parameter: ${getErrorMessage(error)}`);
|
|
231
|
+
}
|
|
230
232
|
}
|
|
231
233
|
const response = await fetch(config.tokenUrl, {
|
|
232
234
|
method: 'POST',
|
|
233
235
|
headers: {
|
|
234
236
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
237
|
+
Accept: 'application/json, application/x-www-form-urlencoded',
|
|
235
238
|
},
|
|
236
239
|
body: params.toString(),
|
|
237
240
|
});
|
|
241
|
+
const responseText = await response.text();
|
|
242
|
+
const contentType = response.headers.get('content-type') || '';
|
|
238
243
|
if (!response.ok) {
|
|
239
|
-
|
|
240
|
-
|
|
244
|
+
// Try to parse error from form-urlencoded response
|
|
245
|
+
let errorMessage = null;
|
|
246
|
+
try {
|
|
247
|
+
const errorParams = new URLSearchParams(responseText);
|
|
248
|
+
const error = errorParams.get('error');
|
|
249
|
+
const errorDescription = errorParams.get('error_description');
|
|
250
|
+
if (error) {
|
|
251
|
+
errorMessage = `Token exchange failed: ${error} - ${errorDescription || 'No description'}`;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
// Fall back to raw error
|
|
256
|
+
}
|
|
257
|
+
throw new Error(errorMessage ||
|
|
258
|
+
`Token exchange failed: ${response.status} - ${responseText}`);
|
|
259
|
+
}
|
|
260
|
+
// Log unexpected content types for debugging
|
|
261
|
+
if (!contentType.includes('application/json') &&
|
|
262
|
+
!contentType.includes('application/x-www-form-urlencoded')) {
|
|
263
|
+
console.warn(`Token endpoint returned unexpected content-type: ${contentType}. ` +
|
|
264
|
+
`Expected application/json or application/x-www-form-urlencoded. ` +
|
|
265
|
+
`Will attempt to parse response.`);
|
|
266
|
+
}
|
|
267
|
+
// Try to parse as JSON first, fall back to form-urlencoded
|
|
268
|
+
try {
|
|
269
|
+
return JSON.parse(responseText);
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
// Parse form-urlencoded response
|
|
273
|
+
const tokenParams = new URLSearchParams(responseText);
|
|
274
|
+
const accessToken = tokenParams.get('access_token');
|
|
275
|
+
const tokenType = tokenParams.get('token_type') || 'Bearer';
|
|
276
|
+
const expiresIn = tokenParams.get('expires_in');
|
|
277
|
+
const refreshToken = tokenParams.get('refresh_token');
|
|
278
|
+
const scope = tokenParams.get('scope');
|
|
279
|
+
if (!accessToken) {
|
|
280
|
+
// Check for error in response
|
|
281
|
+
const error = tokenParams.get('error');
|
|
282
|
+
const errorDescription = tokenParams.get('error_description');
|
|
283
|
+
throw new Error(`Token exchange failed: ${error || 'no_access_token'} - ${errorDescription || responseText}`);
|
|
284
|
+
}
|
|
285
|
+
return {
|
|
286
|
+
access_token: accessToken,
|
|
287
|
+
token_type: tokenType,
|
|
288
|
+
expires_in: expiresIn ? parseInt(expiresIn, 10) : undefined,
|
|
289
|
+
refresh_token: refreshToken || undefined,
|
|
290
|
+
scope: scope || undefined,
|
|
291
|
+
};
|
|
241
292
|
}
|
|
242
|
-
return (await response.json());
|
|
243
293
|
}
|
|
244
294
|
/**
|
|
245
295
|
* Refresh an access token using a refresh token.
|
|
@@ -266,26 +316,75 @@ export class MCPOAuthProvider {
|
|
|
266
316
|
params.append('audience', config.audiences.join(' '));
|
|
267
317
|
}
|
|
268
318
|
// Add resource parameter for MCP OAuth spec compliance
|
|
269
|
-
//
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
319
|
+
// Only add if we have an MCP server URL (indicates MCP OAuth flow, not standard OAuth)
|
|
320
|
+
if (mcpServerUrl) {
|
|
321
|
+
try {
|
|
322
|
+
params.append('resource', OAuthUtils.buildResourceParameter(mcpServerUrl));
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
console.warn(`Could not add resource parameter: ${getErrorMessage(error)}`);
|
|
326
|
+
}
|
|
276
327
|
}
|
|
277
328
|
const response = await fetch(tokenUrl, {
|
|
278
329
|
method: 'POST',
|
|
279
330
|
headers: {
|
|
280
331
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
332
|
+
Accept: 'application/json, application/x-www-form-urlencoded',
|
|
281
333
|
},
|
|
282
334
|
body: params.toString(),
|
|
283
335
|
});
|
|
336
|
+
const responseText = await response.text();
|
|
337
|
+
const contentType = response.headers.get('content-type') || '';
|
|
284
338
|
if (!response.ok) {
|
|
285
|
-
|
|
286
|
-
|
|
339
|
+
// Try to parse error from form-urlencoded response
|
|
340
|
+
let errorMessage = null;
|
|
341
|
+
try {
|
|
342
|
+
const errorParams = new URLSearchParams(responseText);
|
|
343
|
+
const error = errorParams.get('error');
|
|
344
|
+
const errorDescription = errorParams.get('error_description');
|
|
345
|
+
if (error) {
|
|
346
|
+
errorMessage = `Token refresh failed: ${error} - ${errorDescription || 'No description'}`;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
catch {
|
|
350
|
+
// Fall back to raw error
|
|
351
|
+
}
|
|
352
|
+
throw new Error(errorMessage ||
|
|
353
|
+
`Token refresh failed: ${response.status} - ${responseText}`);
|
|
354
|
+
}
|
|
355
|
+
// Log unexpected content types for debugging
|
|
356
|
+
if (!contentType.includes('application/json') &&
|
|
357
|
+
!contentType.includes('application/x-www-form-urlencoded')) {
|
|
358
|
+
console.warn(`Token refresh endpoint returned unexpected content-type: ${contentType}. ` +
|
|
359
|
+
`Expected application/json or application/x-www-form-urlencoded. ` +
|
|
360
|
+
`Will attempt to parse response.`);
|
|
361
|
+
}
|
|
362
|
+
// Try to parse as JSON first, fall back to form-urlencoded
|
|
363
|
+
try {
|
|
364
|
+
return JSON.parse(responseText);
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
// Parse form-urlencoded response
|
|
368
|
+
const tokenParams = new URLSearchParams(responseText);
|
|
369
|
+
const accessToken = tokenParams.get('access_token');
|
|
370
|
+
const tokenType = tokenParams.get('token_type') || 'Bearer';
|
|
371
|
+
const expiresIn = tokenParams.get('expires_in');
|
|
372
|
+
const refreshToken = tokenParams.get('refresh_token');
|
|
373
|
+
const scope = tokenParams.get('scope');
|
|
374
|
+
if (!accessToken) {
|
|
375
|
+
// Check for error in response
|
|
376
|
+
const error = tokenParams.get('error');
|
|
377
|
+
const errorDescription = tokenParams.get('error_description');
|
|
378
|
+
throw new Error(`Token refresh failed: ${error || 'unknown_error'} - ${errorDescription || responseText}`);
|
|
379
|
+
}
|
|
380
|
+
return {
|
|
381
|
+
access_token: accessToken,
|
|
382
|
+
token_type: tokenType,
|
|
383
|
+
expires_in: expiresIn ? parseInt(expiresIn, 10) : undefined,
|
|
384
|
+
refresh_token: refreshToken || undefined,
|
|
385
|
+
scope: scope || undefined,
|
|
386
|
+
};
|
|
287
387
|
}
|
|
288
|
-
return (await response.json());
|
|
289
388
|
}
|
|
290
389
|
/**
|
|
291
390
|
* Perform the full OAuth authorization code flow with PKCE.
|
|
@@ -299,39 +398,51 @@ export class MCPOAuthProvider {
|
|
|
299
398
|
// If no authorization URL is provided, try to discover OAuth configuration
|
|
300
399
|
if (!config.authorizationUrl && mcpServerUrl) {
|
|
301
400
|
console.log('No authorization URL provided, attempting OAuth discovery...');
|
|
302
|
-
//
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
401
|
+
// First check if the server requires authentication via WWW-Authenticate header
|
|
402
|
+
try {
|
|
403
|
+
const headers = OAuthUtils.isSSEEndpoint(mcpServerUrl)
|
|
404
|
+
? { Accept: 'text/event-stream' }
|
|
405
|
+
: { Accept: 'application/json' };
|
|
406
|
+
const response = await fetch(mcpServerUrl, {
|
|
407
|
+
method: 'HEAD',
|
|
408
|
+
headers,
|
|
409
|
+
});
|
|
410
|
+
if (response.status === 401 || response.status === 307) {
|
|
411
|
+
const wwwAuthenticate = response.headers.get('www-authenticate');
|
|
412
|
+
if (wwwAuthenticate) {
|
|
413
|
+
const discoveredConfig = await OAuthUtils.discoverOAuthFromWWWAuthenticate(wwwAuthenticate);
|
|
414
|
+
if (discoveredConfig) {
|
|
415
|
+
// Merge discovered config with existing config, preserving clientId and clientSecret
|
|
416
|
+
config = {
|
|
417
|
+
...config,
|
|
418
|
+
authorizationUrl: discoveredConfig.authorizationUrl,
|
|
419
|
+
tokenUrl: discoveredConfig.tokenUrl,
|
|
420
|
+
scopes: discoveredConfig.scopes || config.scopes || [],
|
|
421
|
+
// Preserve existing client credentials
|
|
422
|
+
clientId: config.clientId,
|
|
423
|
+
clientSecret: config.clientSecret,
|
|
424
|
+
};
|
|
322
425
|
}
|
|
323
426
|
}
|
|
324
427
|
}
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
}
|
|
428
|
+
}
|
|
429
|
+
catch (error) {
|
|
430
|
+
console.debug(`Failed to check endpoint for authentication requirements: ${getErrorMessage(error)}`);
|
|
328
431
|
}
|
|
329
432
|
// If we still don't have OAuth config, try the standard discovery
|
|
330
433
|
if (!config.authorizationUrl) {
|
|
331
434
|
const discoveredConfig = await this.discoverOAuthFromMCPServer(mcpServerUrl);
|
|
332
435
|
if (discoveredConfig) {
|
|
333
|
-
config
|
|
334
|
-
|
|
436
|
+
// Merge discovered config with existing config, preserving clientId and clientSecret
|
|
437
|
+
config = {
|
|
438
|
+
...config,
|
|
439
|
+
authorizationUrl: discoveredConfig.authorizationUrl,
|
|
440
|
+
tokenUrl: discoveredConfig.tokenUrl,
|
|
441
|
+
scopes: discoveredConfig.scopes || config.scopes || [],
|
|
442
|
+
// Preserve existing client credentials
|
|
443
|
+
clientId: config.clientId,
|
|
444
|
+
clientSecret: config.clientSecret,
|
|
445
|
+
};
|
|
335
446
|
}
|
|
336
447
|
else {
|
|
337
448
|
throw new Error('Failed to discover OAuth configuration from MCP server');
|
|
@@ -405,9 +516,12 @@ export class MCPOAuthProvider {
|
|
|
405
516
|
// Exchange code for tokens
|
|
406
517
|
const tokenResponse = await this.exchangeCodeForToken(config, code, pkceParams.codeVerifier, mcpServerUrl);
|
|
407
518
|
// Convert to our token format
|
|
519
|
+
if (!tokenResponse.access_token) {
|
|
520
|
+
throw new Error('No access token received from token endpoint');
|
|
521
|
+
}
|
|
408
522
|
const token = {
|
|
409
523
|
accessToken: tokenResponse.access_token,
|
|
410
|
-
tokenType: tokenResponse.token_type,
|
|
524
|
+
tokenType: tokenResponse.token_type || 'Bearer',
|
|
411
525
|
refreshToken: tokenResponse.refresh_token,
|
|
412
526
|
scope: tokenResponse.scope,
|
|
413
527
|
};
|
|
@@ -420,11 +534,14 @@ export class MCPOAuthProvider {
|
|
|
420
534
|
console.log('Authentication successful! Token saved.');
|
|
421
535
|
// Verify token was saved
|
|
422
536
|
const savedToken = await MCPOAuthTokenStorage.getToken(serverName);
|
|
423
|
-
if (savedToken) {
|
|
424
|
-
|
|
537
|
+
if (savedToken && savedToken.token && savedToken.token.accessToken) {
|
|
538
|
+
const tokenPreview = savedToken.token.accessToken.length > 20
|
|
539
|
+
? `${savedToken.token.accessToken.substring(0, 20)}...`
|
|
540
|
+
: '[token]';
|
|
541
|
+
console.log(`Token verification successful: ${tokenPreview}`);
|
|
425
542
|
}
|
|
426
543
|
else {
|
|
427
|
-
console.error('Token verification failed: token not found after save');
|
|
544
|
+
console.error('Token verification failed: token not found or invalid after save');
|
|
428
545
|
}
|
|
429
546
|
}
|
|
430
547
|
catch (saveError) {
|