@google/gemini-cli-core 0.12.0-nightly.20251027.cb0947c5 → 0.13.0-nightly.20251030.42c79c64
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 +7 -5
- 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/oauth-credential-storage.js +5 -4
- package/dist/src/code_assist/oauth-credential-storage.js.map +1 -1
- package/dist/src/code_assist/oauth-credential-storage.test.js +15 -3
- package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +8 -9
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +32 -32
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/config/config.d.ts +11 -5
- package/dist/src/config/config.js +33 -10
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +62 -15
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/storage.d.ts +1 -0
- package/dist/src/config/storage.js +3 -0
- package/dist/src/config/storage.js.map +1 -1
- package/dist/src/core/apiKeyCredentialStorage.d.ts +17 -0
- package/dist/src/core/apiKeyCredentialStorage.js +64 -0
- package/dist/src/core/apiKeyCredentialStorage.js.map +1 -0
- package/dist/src/core/apiKeyCredentialStorage.test.d.ts +6 -0
- package/dist/src/core/apiKeyCredentialStorage.test.js +66 -0
- package/dist/src/core/apiKeyCredentialStorage.test.js.map +1 -0
- package/dist/src/core/contentGenerator.d.ts +1 -1
- package/dist/src/core/contentGenerator.js +41 -33
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +24 -0
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.js +109 -96
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/fakeContentGenerator.d.ts +20 -13
- package/dist/src/core/fakeContentGenerator.js +21 -24
- package/dist/src/core/fakeContentGenerator.js.map +1 -1
- package/dist/src/core/fakeContentGenerator.test.js +71 -84
- package/dist/src/core/fakeContentGenerator.test.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.d.ts +1 -0
- package/dist/src/core/loggingContentGenerator.js +113 -33
- package/dist/src/core/loggingContentGenerator.js.map +1 -1
- package/dist/src/core/recordingContentGenerator.d.ts +18 -0
- package/dist/src/core/recordingContentGenerator.js +77 -0
- package/dist/src/core/recordingContentGenerator.js.map +1 -0
- package/dist/src/core/recordingContentGenerator.test.d.ts +6 -0
- package/dist/src/core/recordingContentGenerator.test.js +101 -0
- package/dist/src/core/recordingContentGenerator.test.js.map +1 -0
- package/dist/src/fallback/handler.js +2 -0
- package/dist/src/fallback/handler.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/google-auth-provider.d.ts +0 -2
- package/dist/src/mcp/google-auth-provider.js +6 -40
- package/dist/src/mcp/google-auth-provider.js.map +1 -1
- package/dist/src/mcp/google-auth-provider.test.js +2 -63
- package/dist/src/mcp/google-auth-provider.test.js.map +1 -1
- package/dist/src/mcp/sa-impersonation-provider.js +3 -2
- package/dist/src/mcp/sa-impersonation-provider.js.map +1 -1
- package/dist/src/mcp/token-storage/keychain-token-storage.d.ts +6 -2
- package/dist/src/mcp/token-storage/keychain-token-storage.js +57 -2
- package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
- package/dist/src/mcp/token-storage/keychain-token-storage.test.js +33 -0
- package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -1
- package/dist/src/mcp/token-storage/types.d.ts +6 -0
- package/dist/src/mcp/token-storage/types.js.map +1 -1
- package/dist/src/policy/policy-engine.js +4 -0
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +6 -5
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -0
- package/dist/src/telemetry/index.js +1 -0
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/loggers.js +10 -17
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +182 -33
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +1 -1
- package/dist/src/telemetry/metrics.js +1 -1
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/semantic.d.ts +82 -0
- package/dist/src/telemetry/semantic.js +269 -0
- package/dist/src/telemetry/semantic.js.map +1 -0
- package/dist/src/telemetry/semantic.test.d.ts +6 -0
- package/dist/src/telemetry/semantic.test.js +387 -0
- package/dist/src/telemetry/semantic.test.js.map +1 -0
- package/dist/src/telemetry/trace.d.ts +46 -0
- package/dist/src/telemetry/trace.js +121 -0
- package/dist/src/telemetry/trace.js.map +1 -0
- package/dist/src/telemetry/types.d.ts +39 -18
- package/dist/src/telemetry/types.js +113 -36
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.js +6 -6
- package/dist/src/telemetry/uiTelemetry.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.test.js +88 -66
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
- package/dist/src/tools/glob.test.js +203 -199
- package/dist/src/tools/glob.test.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.js +2 -1
- package/dist/src/tools/mcp-client-manager.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +4 -1
- package/dist/src/tools/mcp-client.js +71 -92
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +16 -6
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +1 -1
- package/dist/src/tools/mcp-tool.js +11 -9
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/shell.d.ts +2 -2
- package/dist/src/tools/shell.js +8 -7
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +3 -0
- package/dist/src/tools/tool-registry.js +9 -2
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tools.d.ts +1 -2
- package/dist/src/tools/tools.js +20 -3
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/write-todos.js +4 -1
- package/dist/src/tools/write-todos.js.map +1 -1
- package/dist/src/utils/events.d.ts +19 -1
- package/dist/src/utils/events.js +9 -0
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/extensionLoader.d.ts +38 -0
- package/dist/src/utils/extensionLoader.js +20 -0
- package/dist/src/utils/extensionLoader.js.map +1 -0
- package/dist/src/utils/memoryDiscovery.d.ts +11 -2
- package/dist/src/utils/memoryDiscovery.js +140 -2
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +153 -37
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/package.d.ts +12 -0
- package/dist/src/utils/package.js +15 -0
- package/dist/src/utils/package.js.map +1 -0
- package/dist/src/utils/workspaceContext.js +1 -1
- package/dist/src/utils/workspaceContext.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { appendFileSync } from 'node:fs';
|
|
7
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
8
|
+
import { safeJsonStringify } from '../utils/safeJsonStringify.js';
|
|
9
|
+
import { RecordingContentGenerator } from './recordingContentGenerator.js';
|
|
10
|
+
vi.mock('node:fs', () => ({
|
|
11
|
+
appendFileSync: vi.fn(),
|
|
12
|
+
}));
|
|
13
|
+
describe('RecordingContentGenerator', () => {
|
|
14
|
+
let mockRealGenerator;
|
|
15
|
+
let recorder;
|
|
16
|
+
const filePath = '/test/file/responses.json';
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
mockRealGenerator = {
|
|
19
|
+
generateContent: vi.fn(),
|
|
20
|
+
generateContentStream: vi.fn(),
|
|
21
|
+
countTokens: vi.fn(),
|
|
22
|
+
embedContent: vi.fn(),
|
|
23
|
+
};
|
|
24
|
+
recorder = new RecordingContentGenerator(mockRealGenerator, filePath);
|
|
25
|
+
vi.clearAllMocks();
|
|
26
|
+
});
|
|
27
|
+
it('should record generateContent responses', async () => {
|
|
28
|
+
const mockResponse = {
|
|
29
|
+
candidates: [
|
|
30
|
+
{ content: { parts: [{ text: 'response' }], role: 'model' } },
|
|
31
|
+
],
|
|
32
|
+
usageMetadata: { totalTokenCount: 10 },
|
|
33
|
+
};
|
|
34
|
+
mockRealGenerator.generateContent.mockResolvedValue(mockResponse);
|
|
35
|
+
const response = await recorder.generateContent({}, 'id1');
|
|
36
|
+
expect(response).toEqual(mockResponse);
|
|
37
|
+
expect(mockRealGenerator.generateContent).toHaveBeenCalledWith({}, 'id1');
|
|
38
|
+
expect(appendFileSync).toHaveBeenCalledWith(filePath, safeJsonStringify({
|
|
39
|
+
method: 'generateContent',
|
|
40
|
+
response: mockResponse,
|
|
41
|
+
}) + '\n');
|
|
42
|
+
});
|
|
43
|
+
it('should record generateContentStream responses', async () => {
|
|
44
|
+
const mockResponse1 = {
|
|
45
|
+
candidates: [
|
|
46
|
+
{ content: { parts: [{ text: 'response1' }], role: 'model' } },
|
|
47
|
+
],
|
|
48
|
+
usageMetadata: { totalTokenCount: 10 },
|
|
49
|
+
};
|
|
50
|
+
const mockResponse2 = {
|
|
51
|
+
candidates: [
|
|
52
|
+
{ content: { parts: [{ text: 'response2' }], role: 'model' } },
|
|
53
|
+
],
|
|
54
|
+
usageMetadata: { totalTokenCount: 20 },
|
|
55
|
+
};
|
|
56
|
+
async function* mockStream() {
|
|
57
|
+
yield mockResponse1;
|
|
58
|
+
yield mockResponse2;
|
|
59
|
+
}
|
|
60
|
+
mockRealGenerator.generateContentStream.mockResolvedValue(mockStream());
|
|
61
|
+
const stream = await recorder.generateContentStream({}, 'id1');
|
|
62
|
+
const responses = [];
|
|
63
|
+
for await (const response of stream) {
|
|
64
|
+
responses.push(response);
|
|
65
|
+
}
|
|
66
|
+
expect(responses).toEqual([mockResponse1, mockResponse2]);
|
|
67
|
+
expect(mockRealGenerator.generateContentStream).toHaveBeenCalledWith({}, 'id1');
|
|
68
|
+
expect(appendFileSync).toHaveBeenCalledWith(filePath, safeJsonStringify({
|
|
69
|
+
method: 'generateContentStream',
|
|
70
|
+
response: responses,
|
|
71
|
+
}) + '\n');
|
|
72
|
+
});
|
|
73
|
+
it('should record countTokens responses', async () => {
|
|
74
|
+
const mockResponse = {
|
|
75
|
+
totalTokens: 100,
|
|
76
|
+
cachedContentTokenCount: 10,
|
|
77
|
+
};
|
|
78
|
+
mockRealGenerator.countTokens.mockResolvedValue(mockResponse);
|
|
79
|
+
const response = await recorder.countTokens({});
|
|
80
|
+
expect(response).toEqual(mockResponse);
|
|
81
|
+
expect(mockRealGenerator.countTokens).toHaveBeenCalledWith({});
|
|
82
|
+
expect(appendFileSync).toHaveBeenCalledWith(filePath, safeJsonStringify({
|
|
83
|
+
method: 'countTokens',
|
|
84
|
+
response: mockResponse,
|
|
85
|
+
}) + '\n');
|
|
86
|
+
});
|
|
87
|
+
it('should record embedContent responses', async () => {
|
|
88
|
+
const mockResponse = {
|
|
89
|
+
embeddings: [{ values: [1, 2, 3] }],
|
|
90
|
+
};
|
|
91
|
+
mockRealGenerator.embedContent.mockResolvedValue(mockResponse);
|
|
92
|
+
const response = await recorder.embedContent({});
|
|
93
|
+
expect(response).toEqual(mockResponse);
|
|
94
|
+
expect(mockRealGenerator.embedContent).toHaveBeenCalledWith({});
|
|
95
|
+
expect(appendFileSync).toHaveBeenCalledWith(filePath, safeJsonStringify({
|
|
96
|
+
method: 'embedContent',
|
|
97
|
+
response: mockResponse,
|
|
98
|
+
}) + '\n');
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
//# sourceMappingURL=recordingContentGenerator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recordingContentGenerator.test.js","sourceRoot":"","sources":["../../../src/core/recordingContentGenerator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { AuthType } from '../core/contentGenerator.js';
|
|
7
7
|
import { DEFAULT_GEMINI_FLASH_MODEL } from '../config/models.js';
|
|
8
8
|
import { logFlashFallback, FlashFallbackEvent } from '../telemetry/index.js';
|
|
9
|
+
import { coreEvents } from '../utils/events.js';
|
|
9
10
|
export async function handleFallback(config, failedModel, authType, error) {
|
|
10
11
|
// Applicability Checks
|
|
11
12
|
if (authType !== AuthType.LOGIN_WITH_GOOGLE)
|
|
@@ -43,6 +44,7 @@ export async function handleFallback(config, failedModel, authType, error) {
|
|
|
43
44
|
function activateFallbackMode(config, authType) {
|
|
44
45
|
if (!config.isInFallbackMode()) {
|
|
45
46
|
config.setFallbackMode(true);
|
|
47
|
+
coreEvents.emitFallbackModeChanged(true);
|
|
46
48
|
if (authType) {
|
|
47
49
|
logFlashFallback(config, new FlashFallbackEvent(authType));
|
|
48
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/fallback/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/fallback/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,WAAmB,EACnB,QAAiB,EACjB,KAAe;IAEf,uBAAuB;IACvB,IAAI,QAAQ,KAAK,QAAQ,CAAC,iBAAiB;QAAE,OAAO,IAAI,CAAC;IAEzD,MAAM,aAAa,GAAG,0BAA0B,CAAC;IAEjD,IAAI,WAAW,KAAK,aAAa;QAAE,OAAO,IAAI,CAAC;IAE/C,gCAAgC;IAChC,MAAM,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAC;IACzD,IAAI,OAAO,oBAAoB,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAE5D,IAAI,CAAC;QACH,oDAAoD;QACpD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACvC,WAAW,EACX,aAAa,EACb,KAAK,CACN,CAAC;QAEF,kCAAkC;QAClC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,OAAO;gBACV,oEAAoE;gBACpE,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACvC,OAAO,IAAI,CAAC,CAAC,uCAAuC;YAEtD,KAAK,MAAM;gBACT,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACvC,OAAO,KAAK,CAAC;YAEf,KAAK,MAAM;gBACT,OAAO,KAAK,CAAC;YAEf;gBACE,MAAM,IAAI,KAAK,CACb,mEAAmE,MAAM,GAAG,CAC7E,CAAC;QACN,CAAC;IACH,CAAC;IAAC,OAAO,YAAY,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,YAAY,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAc,EAAE,QAA4B;IACxE,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,EAAE,CAAC;QAC/B,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7B,UAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,QAAQ,EAAE,CAAC;YACb,gBAAgB,CAAC,MAAM,EAAE,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
export declare const GIT_COMMIT_INFO = "
|
|
7
|
-
export declare const CLI_VERSION = "0.
|
|
6
|
+
export declare const GIT_COMMIT_INFO = "42c79c64";
|
|
7
|
+
export declare const CLI_VERSION = "0.13.0-nightly.20251030.42c79c64";
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
*/
|
|
6
6
|
// This file is auto-generated by the build script (scripts/generate-git-commit-info.js)
|
|
7
7
|
// Do not edit this file manually.
|
|
8
|
-
export const GIT_COMMIT_INFO = '
|
|
9
|
-
export const CLI_VERSION = '0.
|
|
8
|
+
export const GIT_COMMIT_INFO = '42c79c64';
|
|
9
|
+
export const CLI_VERSION = '0.13.0-nightly.20251030.42c79c64';
|
|
10
10
|
//# sourceMappingURL=git-commit.js.map
|
package/dist/src/index.d.ts
CHANGED
|
@@ -23,11 +23,13 @@ export * from './core/turn.js';
|
|
|
23
23
|
export * from './core/geminiRequest.js';
|
|
24
24
|
export * from './core/coreToolScheduler.js';
|
|
25
25
|
export * from './core/nonInteractiveToolExecutor.js';
|
|
26
|
+
export * from './core/recordingContentGenerator.js';
|
|
26
27
|
export * from './fallback/types.js';
|
|
27
28
|
export * from './code_assist/codeAssist.js';
|
|
28
29
|
export * from './code_assist/oauth2.js';
|
|
29
30
|
export * from './code_assist/server.js';
|
|
30
31
|
export * from './code_assist/types.js';
|
|
32
|
+
export * from './core/apiKeyCredentialStorage.js';
|
|
31
33
|
export * from './utils/paths.js';
|
|
32
34
|
export * from './utils/schemaValidator.js';
|
|
33
35
|
export * from './utils/errors.js';
|
|
@@ -56,6 +58,8 @@ export * from './utils/promptIdContext.js';
|
|
|
56
58
|
export * from './utils/thoughtUtils.js';
|
|
57
59
|
export * from './utils/debugLogger.js';
|
|
58
60
|
export * from './utils/events.js';
|
|
61
|
+
export * from './utils/extensionLoader.js';
|
|
62
|
+
export * from './utils/package.js';
|
|
59
63
|
export * from './services/fileDiscoveryService.js';
|
|
60
64
|
export * from './services/gitService.js';
|
|
61
65
|
export * from './services/chatRecordingService.js';
|
package/dist/src/index.js
CHANGED
|
@@ -26,11 +26,13 @@ export * from './core/turn.js';
|
|
|
26
26
|
export * from './core/geminiRequest.js';
|
|
27
27
|
export * from './core/coreToolScheduler.js';
|
|
28
28
|
export * from './core/nonInteractiveToolExecutor.js';
|
|
29
|
+
export * from './core/recordingContentGenerator.js';
|
|
29
30
|
export * from './fallback/types.js';
|
|
30
31
|
export * from './code_assist/codeAssist.js';
|
|
31
32
|
export * from './code_assist/oauth2.js';
|
|
32
33
|
export * from './code_assist/server.js';
|
|
33
34
|
export * from './code_assist/types.js';
|
|
35
|
+
export * from './core/apiKeyCredentialStorage.js';
|
|
34
36
|
// Export utilities
|
|
35
37
|
export * from './utils/paths.js';
|
|
36
38
|
export * from './utils/schemaValidator.js';
|
|
@@ -60,6 +62,8 @@ export * from './utils/promptIdContext.js';
|
|
|
60
62
|
export * from './utils/thoughtUtils.js';
|
|
61
63
|
export * from './utils/debugLogger.js';
|
|
62
64
|
export * from './utils/events.js';
|
|
65
|
+
export * from './utils/extensionLoader.js';
|
|
66
|
+
export * from './utils/package.js';
|
|
63
67
|
// Export services
|
|
64
68
|
export * from './services/fileDiscoveryService.js';
|
|
65
69
|
export * from './services/gitService.js';
|
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;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAElD,wBAAwB;AACxB,cAAc,0BAA0B,CAAC;AAEzC,oBAAoB;AACpB,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gBAAgB;AAChB,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAElD,wBAAwB;AACxB,cAAc,0BAA0B,CAAC;AAEzC,oBAAoB;AACpB,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,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;AACrD,cAAc,qCAAqC,CAAC;AAEpD,cAAc,qBAAqB,CAAC;AAEpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mCAAmC,CAAC;AAElD,mBAAmB;AACnB,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6CAA6C,CAAC;AAC5D,cAAc,kCAAkC,CAAC;AACjD,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AAEnC,kBAAkB;AAClB,cAAc,oCAAoC,CAAC;AACnD,cAAc,0BAA0B,CAAC;AACzC,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAEhD,4BAA4B;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,eAAe,EAAgB,MAAM,qBAAqB,CAAC;AACpE,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAE/B,iCAAiC;AACjC,cAAc,qCAAqC,CAAC;AAEpD,+BAA+B;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AAEtC,sBAAsB;AACtB,cAAc,0BAA0B,CAAC;AAEzC,6BAA6B;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,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;AACpC,cAAc,wBAAwB,CAAC;AAEvC,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAK3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAMpE,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;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,oBAAoB;AACpB,cAAc,uBAAuB,CAAC"}
|
|
@@ -9,8 +9,6 @@ import type { MCPServerConfig } from '../config/config.js';
|
|
|
9
9
|
export declare class GoogleCredentialProvider implements OAuthClientProvider {
|
|
10
10
|
private readonly config?;
|
|
11
11
|
private readonly auth;
|
|
12
|
-
private readonly useIdToken;
|
|
13
|
-
private readonly audience?;
|
|
14
12
|
private cachedToken?;
|
|
15
13
|
private tokenExpiryTime?;
|
|
16
14
|
readonly redirectUrl = "";
|
|
@@ -4,15 +4,11 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { GoogleAuth } from 'google-auth-library';
|
|
7
|
-
import {
|
|
8
|
-
const CLOUD_RUN_HOST_REGEX = /^(.*\.)?run\.app$/;
|
|
9
|
-
// An array of hosts that are allowed to use the Google Credential provider.
|
|
7
|
+
import { FIVE_MIN_BUFFER_MS } from './oauth-utils.js';
|
|
10
8
|
const ALLOWED_HOSTS = [/^.+\.googleapis\.com$/, /^(.*\.)?luci\.app$/];
|
|
11
9
|
export class GoogleCredentialProvider {
|
|
12
10
|
config;
|
|
13
11
|
auth;
|
|
14
|
-
useIdToken = false;
|
|
15
|
-
audience;
|
|
16
12
|
cachedToken;
|
|
17
13
|
tokenExpiryTime;
|
|
18
14
|
// Properties required by OAuthClientProvider, with no-op values
|
|
@@ -32,24 +28,15 @@ export class GoogleCredentialProvider {
|
|
|
32
28
|
throw new Error('URL must be provided in the config for Google Credentials provider');
|
|
33
29
|
}
|
|
34
30
|
const hostname = new URL(url).hostname;
|
|
35
|
-
|
|
36
|
-
if (!this.config?.allow_unscoped_id_tokens_cloud_run && isRunAppHost) {
|
|
37
|
-
throw new Error(`To enable the Cloud Run MCP Server at ${url} please set allow_unscoped_id_tokens_cloud_run:true in the MCP Server config.`);
|
|
38
|
-
}
|
|
39
|
-
if (this.config?.allow_unscoped_id_tokens_cloud_run && isRunAppHost) {
|
|
40
|
-
this.useIdToken = true;
|
|
41
|
-
}
|
|
42
|
-
this.audience = hostname;
|
|
43
|
-
if (!this.useIdToken &&
|
|
44
|
-
!ALLOWED_HOSTS.some((pattern) => pattern.test(hostname))) {
|
|
31
|
+
if (!ALLOWED_HOSTS.some((pattern) => pattern.test(hostname))) {
|
|
45
32
|
throw new Error(`Host "${hostname}" is not an allowed host for Google Credential provider.`);
|
|
46
33
|
}
|
|
47
|
-
|
|
48
|
-
if (!
|
|
49
|
-
throw new Error('Scopes must be provided in the oauth config for Google Credentials provider
|
|
34
|
+
const scopes = this.config?.oauth?.scopes;
|
|
35
|
+
if (!scopes || scopes.length === 0) {
|
|
36
|
+
throw new Error('Scopes must be provided in the oauth config for Google Credentials provider');
|
|
50
37
|
}
|
|
51
38
|
this.auth = new GoogleAuth({
|
|
52
|
-
scopes
|
|
39
|
+
scopes,
|
|
53
40
|
});
|
|
54
41
|
}
|
|
55
42
|
clientInformation() {
|
|
@@ -68,27 +55,6 @@ export class GoogleCredentialProvider {
|
|
|
68
55
|
// Clear invalid/expired cache.
|
|
69
56
|
this.cachedToken = undefined;
|
|
70
57
|
this.tokenExpiryTime = undefined;
|
|
71
|
-
// If allow_unscoped_id_tokens_for_cloud_run is configured, use ID tokens.
|
|
72
|
-
if (this.useIdToken) {
|
|
73
|
-
try {
|
|
74
|
-
const idClient = await this.auth.getIdTokenClient(this.audience);
|
|
75
|
-
const idToken = await idClient.idTokenProvider.fetchIdToken(this.audience);
|
|
76
|
-
const newToken = {
|
|
77
|
-
access_token: idToken,
|
|
78
|
-
token_type: 'Bearer',
|
|
79
|
-
};
|
|
80
|
-
const expiryTime = OAuthUtils.parseTokenExpiry(idToken);
|
|
81
|
-
if (expiryTime) {
|
|
82
|
-
this.tokenExpiryTime = expiryTime;
|
|
83
|
-
this.cachedToken = newToken;
|
|
84
|
-
}
|
|
85
|
-
return newToken;
|
|
86
|
-
}
|
|
87
|
-
catch (e) {
|
|
88
|
-
console.error('Failed to get ID token from Google ADC', e);
|
|
89
|
-
return undefined;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
58
|
const client = await this.auth.getClient();
|
|
93
59
|
const accessTokenResponse = await client.getAccessToken();
|
|
94
60
|
if (!accessTokenResponse.token) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-auth-provider.js","sourceRoot":"","sources":["../../../src/mcp/google-auth-provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"google-auth-provider.js","sourceRoot":"","sources":["../../../src/mcp/google-auth-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,14 +14,11 @@ describe('GoogleCredentialProvider', () => {
|
|
|
14
14
|
scopes: ['scope1', 'scope2'],
|
|
15
15
|
},
|
|
16
16
|
};
|
|
17
|
-
beforeEach(() => {
|
|
18
|
-
vi.clearAllMocks();
|
|
19
|
-
});
|
|
20
17
|
it('should throw an error if no scopes are provided', () => {
|
|
21
18
|
const config = {
|
|
22
19
|
url: 'https://test.googleapis.com',
|
|
23
20
|
};
|
|
24
|
-
expect(() => new GoogleCredentialProvider(config)).toThrow('Scopes must be provided in the oauth config for Google Credentials provider
|
|
21
|
+
expect(() => new GoogleCredentialProvider(config)).toThrow('Scopes must be provided in the oauth config for Google Credentials provider');
|
|
25
22
|
});
|
|
26
23
|
it('should use scopes from the config if provided', () => {
|
|
27
24
|
new GoogleCredentialProvider(validConfig);
|
|
@@ -65,16 +62,7 @@ describe('GoogleCredentialProvider', () => {
|
|
|
65
62
|
};
|
|
66
63
|
expect(() => new GoogleCredentialProvider(config)).toThrow('Host "googleapis.com" is not an allowed host for Google Credential provider.');
|
|
67
64
|
});
|
|
68
|
-
|
|
69
|
-
const config = {
|
|
70
|
-
url: 'https://test.run.app',
|
|
71
|
-
oauth: {
|
|
72
|
-
scopes: ['scope1', 'scope2'],
|
|
73
|
-
},
|
|
74
|
-
};
|
|
75
|
-
expect(() => new GoogleCredentialProvider(config)).toThrow('To enable the Cloud Run MCP Server at https://test.run.app please set allow_unscoped_id_tokens_cloud_run:true in the MCP Server config.');
|
|
76
|
-
});
|
|
77
|
-
describe('with provider instance (Access Tokens)', () => {
|
|
65
|
+
describe('with provider instance', () => {
|
|
78
66
|
let provider;
|
|
79
67
|
let mockGetAccessToken;
|
|
80
68
|
let mockClient;
|
|
@@ -130,54 +118,5 @@ describe('GoogleCredentialProvider', () => {
|
|
|
130
118
|
vi.useRealTimers();
|
|
131
119
|
});
|
|
132
120
|
});
|
|
133
|
-
describe('ID token flow (allow_unscoped_id_tokens_cloud_run)', () => {
|
|
134
|
-
let mockFetchIdToken;
|
|
135
|
-
let mockIdClient;
|
|
136
|
-
beforeEach(() => {
|
|
137
|
-
mockFetchIdToken = vi.fn();
|
|
138
|
-
mockIdClient = {
|
|
139
|
-
idTokenProvider: {
|
|
140
|
-
fetchIdToken: mockFetchIdToken,
|
|
141
|
-
},
|
|
142
|
-
};
|
|
143
|
-
GoogleAuth.prototype.getIdTokenClient.mockResolvedValue(mockIdClient);
|
|
144
|
-
});
|
|
145
|
-
it('should return ID token when flag is enabled and derive audience from hostname', async () => {
|
|
146
|
-
const config = {
|
|
147
|
-
url: 'https://test.run.app/path',
|
|
148
|
-
allow_unscoped_id_tokens_cloud_run: true,
|
|
149
|
-
};
|
|
150
|
-
const payload = { exp: Math.floor(Date.now() / 1000) + 3600 };
|
|
151
|
-
const validToken = `header.${Buffer.from(JSON.stringify(payload)).toString('base64')}.signature`;
|
|
152
|
-
mockFetchIdToken.mockResolvedValue(validToken);
|
|
153
|
-
const provider = new GoogleCredentialProvider(config);
|
|
154
|
-
const tokens = await provider.tokens();
|
|
155
|
-
expect(tokens?.access_token).toBe(validToken);
|
|
156
|
-
expect(GoogleAuth.prototype.getIdTokenClient).toHaveBeenCalledWith('test.run.app');
|
|
157
|
-
expect(mockFetchIdToken).toHaveBeenCalledWith('test.run.app');
|
|
158
|
-
});
|
|
159
|
-
it('should return undefined and log error when fetching ID token fails', async () => {
|
|
160
|
-
const config = {
|
|
161
|
-
url: 'https://test.run.app/path',
|
|
162
|
-
allow_unscoped_id_tokens_cloud_run: true,
|
|
163
|
-
};
|
|
164
|
-
const consoleErrorSpy = vi
|
|
165
|
-
.spyOn(console, 'error')
|
|
166
|
-
.mockImplementation(() => { });
|
|
167
|
-
mockFetchIdToken.mockRejectedValue(new Error('Fetch failed'));
|
|
168
|
-
const provider = new GoogleCredentialProvider(config);
|
|
169
|
-
const tokens = await provider.tokens();
|
|
170
|
-
expect(tokens).toBeUndefined();
|
|
171
|
-
expect(consoleErrorSpy).toHaveBeenCalledWith('Failed to get ID token from Google ADC', expect.any(Error));
|
|
172
|
-
consoleErrorSpy.mockRestore();
|
|
173
|
-
});
|
|
174
|
-
it('should not require scopes when flag allow_unscoped_id_tokens_cloud_run is true', () => {
|
|
175
|
-
const config = {
|
|
176
|
-
url: 'https://test.run.app',
|
|
177
|
-
allow_unscoped_id_tokens_cloud_run: true,
|
|
178
|
-
};
|
|
179
|
-
expect(() => new GoogleCredentialProvider(config)).not.toThrow();
|
|
180
|
-
});
|
|
181
|
-
});
|
|
182
121
|
});
|
|
183
122
|
//# sourceMappingURL=google-auth-provider.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-auth-provider.test.js","sourceRoot":"","sources":["../../../src/mcp/google-auth-provider.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAG9D,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;AAE/B,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,MAAM,WAAW,GAAG;QAClB,GAAG,EAAE,6BAA6B;QAClC,KAAK,EAAE;YACL,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;SAC7B;KACiB,CAAC;IAErB,
|
|
1
|
+
{"version":3,"file":"google-auth-provider.test.js","sourceRoot":"","sources":["../../../src/mcp/google-auth-provider.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { GoogleAuth } from 'google-auth-library';
|
|
7
7
|
import { OAuthUtils, FIVE_MIN_BUFFER_MS } from './oauth-utils.js';
|
|
8
|
+
import { coreEvents } from '../utils/events.js';
|
|
8
9
|
function createIamApiUrl(targetSA) {
|
|
9
10
|
return `https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/${encodeURIComponent(targetSA)}:generateIdToken`;
|
|
10
11
|
}
|
|
@@ -72,12 +73,12 @@ export class ServiceAccountImpersonationProvider {
|
|
|
72
73
|
});
|
|
73
74
|
idToken = res.data.token;
|
|
74
75
|
if (!idToken || idToken.length === 0) {
|
|
75
|
-
|
|
76
|
+
coreEvents.emitFeedback('error', 'Failed to obtain authentication token.');
|
|
76
77
|
return undefined;
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
80
|
catch (e) {
|
|
80
|
-
|
|
81
|
+
coreEvents.emitFeedback('error', 'Failed to obtain authentication token.', e);
|
|
81
82
|
return undefined;
|
|
82
83
|
}
|
|
83
84
|
const expiryTime = OAuthUtils.parseTokenExpiry(idToken);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sa-impersonation-provider.js","sourceRoot":"","sources":["../../../src/mcp/sa-impersonation-provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"sa-impersonation-provider.js","sourceRoot":"","sources":["../../../src/mcp/sa-impersonation-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { BaseTokenStorage } from './base-token-storage.js';
|
|
7
|
-
import type { OAuthCredentials } from './types.js';
|
|
7
|
+
import type { OAuthCredentials, SecretStorage } from './types.js';
|
|
8
8
|
interface Keytar {
|
|
9
9
|
getPassword(service: string, account: string): Promise<string | null>;
|
|
10
10
|
setPassword(service: string, account: string, password: string): Promise<void>;
|
|
@@ -14,7 +14,7 @@ interface Keytar {
|
|
|
14
14
|
password: string;
|
|
15
15
|
}>>;
|
|
16
16
|
}
|
|
17
|
-
export declare class KeychainTokenStorage extends BaseTokenStorage {
|
|
17
|
+
export declare class KeychainTokenStorage extends BaseTokenStorage implements SecretStorage {
|
|
18
18
|
private keychainAvailable;
|
|
19
19
|
private keytarModule;
|
|
20
20
|
private keytarLoadAttempted;
|
|
@@ -27,5 +27,9 @@ export declare class KeychainTokenStorage extends BaseTokenStorage {
|
|
|
27
27
|
clearAll(): Promise<void>;
|
|
28
28
|
checkKeychainAvailability(): Promise<boolean>;
|
|
29
29
|
isAvailable(): Promise<boolean>;
|
|
30
|
+
setSecret(key: string, value: string): Promise<void>;
|
|
31
|
+
getSecret(key: string): Promise<string | null>;
|
|
32
|
+
deleteSecret(key: string): Promise<void>;
|
|
33
|
+
listSecrets(): Promise<string[]>;
|
|
30
34
|
}
|
|
31
35
|
export {};
|
|
@@ -7,6 +7,7 @@ import * as crypto from 'node:crypto';
|
|
|
7
7
|
import { BaseTokenStorage } from './base-token-storage.js';
|
|
8
8
|
import { coreEvents } from '../../utils/events.js';
|
|
9
9
|
const KEYCHAIN_TEST_PREFIX = '__keychain_test__';
|
|
10
|
+
const SECRET_PREFIX = '__secret__';
|
|
10
11
|
export class KeychainTokenStorage extends BaseTokenStorage {
|
|
11
12
|
keychainAvailable = null;
|
|
12
13
|
keytarModule = null;
|
|
@@ -97,7 +98,8 @@ export class KeychainTokenStorage extends BaseTokenStorage {
|
|
|
97
98
|
try {
|
|
98
99
|
const credentials = await keytar.findCredentials(this.serviceName);
|
|
99
100
|
return credentials
|
|
100
|
-
.filter((cred) => !cred.account.startsWith(KEYCHAIN_TEST_PREFIX)
|
|
101
|
+
.filter((cred) => !cred.account.startsWith(KEYCHAIN_TEST_PREFIX) &&
|
|
102
|
+
!cred.account.startsWith(SECRET_PREFIX))
|
|
101
103
|
.map((cred) => cred.account);
|
|
102
104
|
}
|
|
103
105
|
catch (error) {
|
|
@@ -115,7 +117,8 @@ export class KeychainTokenStorage extends BaseTokenStorage {
|
|
|
115
117
|
}
|
|
116
118
|
const result = new Map();
|
|
117
119
|
try {
|
|
118
|
-
const credentials = (await keytar.findCredentials(this.serviceName)).filter((c) => !c.account.startsWith(KEYCHAIN_TEST_PREFIX)
|
|
120
|
+
const credentials = (await keytar.findCredentials(this.serviceName)).filter((c) => !c.account.startsWith(KEYCHAIN_TEST_PREFIX) &&
|
|
121
|
+
!c.account.startsWith(SECRET_PREFIX));
|
|
119
122
|
for (const cred of credentials) {
|
|
120
123
|
try {
|
|
121
124
|
const data = JSON.parse(cred.password);
|
|
@@ -187,5 +190,57 @@ export class KeychainTokenStorage extends BaseTokenStorage {
|
|
|
187
190
|
async isAvailable() {
|
|
188
191
|
return this.checkKeychainAvailability();
|
|
189
192
|
}
|
|
193
|
+
async setSecret(key, value) {
|
|
194
|
+
if (!(await this.checkKeychainAvailability())) {
|
|
195
|
+
throw new Error('Keychain is not available');
|
|
196
|
+
}
|
|
197
|
+
const keytar = await this.getKeytar();
|
|
198
|
+
if (!keytar) {
|
|
199
|
+
throw new Error('Keytar module not available');
|
|
200
|
+
}
|
|
201
|
+
await keytar.setPassword(this.serviceName, `${SECRET_PREFIX}${key}`, value);
|
|
202
|
+
}
|
|
203
|
+
async getSecret(key) {
|
|
204
|
+
if (!(await this.checkKeychainAvailability())) {
|
|
205
|
+
throw new Error('Keychain is not available');
|
|
206
|
+
}
|
|
207
|
+
const keytar = await this.getKeytar();
|
|
208
|
+
if (!keytar) {
|
|
209
|
+
throw new Error('Keytar module not available');
|
|
210
|
+
}
|
|
211
|
+
return keytar.getPassword(this.serviceName, `${SECRET_PREFIX}${key}`);
|
|
212
|
+
}
|
|
213
|
+
async deleteSecret(key) {
|
|
214
|
+
if (!(await this.checkKeychainAvailability())) {
|
|
215
|
+
throw new Error('Keychain is not available');
|
|
216
|
+
}
|
|
217
|
+
const keytar = await this.getKeytar();
|
|
218
|
+
if (!keytar) {
|
|
219
|
+
throw new Error('Keytar module not available');
|
|
220
|
+
}
|
|
221
|
+
const deleted = await keytar.deletePassword(this.serviceName, `${SECRET_PREFIX}${key}`);
|
|
222
|
+
if (!deleted) {
|
|
223
|
+
throw new Error(`No secret found for key: ${key}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
async listSecrets() {
|
|
227
|
+
if (!(await this.checkKeychainAvailability())) {
|
|
228
|
+
throw new Error('Keychain is not available');
|
|
229
|
+
}
|
|
230
|
+
const keytar = await this.getKeytar();
|
|
231
|
+
if (!keytar) {
|
|
232
|
+
throw new Error('Keytar module not available');
|
|
233
|
+
}
|
|
234
|
+
try {
|
|
235
|
+
const credentials = await keytar.findCredentials(this.serviceName);
|
|
236
|
+
return credentials
|
|
237
|
+
.filter((cred) => cred.account.startsWith(SECRET_PREFIX))
|
|
238
|
+
.map((cred) => cred.account.substring(SECRET_PREFIX.length));
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
console.error('Failed to list secrets from keychain:', error);
|
|
242
|
+
return [];
|
|
243
|
+
}
|
|
244
|
+
}
|
|
190
245
|
}
|
|
191
246
|
//# sourceMappingURL=keychain-token-storage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keychain-token-storage.js","sourceRoot":"","sources":["../../../../src/mcp/token-storage/keychain-token-storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAenD,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"keychain-token-storage.js","sourceRoot":"","sources":["../../../../src/mcp/token-storage/keychain-token-storage.ts"],"names":[],"mappings":"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"}
|