@google/gemini-cli-core 0.9.0-nightly.20250926.1487841d → 0.9.0-nightly.20251001.33269bdb
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/dist/src/agents/codebase-investigator.d.ts +11 -0
- package/dist/src/agents/codebase-investigator.js +164 -0
- package/dist/src/agents/codebase-investigator.js.map +1 -0
- package/dist/src/agents/executor.d.ts +96 -0
- package/dist/src/agents/executor.js +438 -0
- package/dist/src/agents/executor.js.map +1 -0
- package/dist/src/agents/executor.test.d.ts +6 -0
- package/dist/src/agents/executor.test.js +492 -0
- package/dist/src/agents/executor.test.js.map +1 -0
- package/dist/src/agents/invocation.d.ts +45 -0
- package/dist/src/agents/invocation.js +101 -0
- package/dist/src/agents/invocation.js.map +1 -0
- package/dist/src/agents/invocation.test.d.ts +6 -0
- package/dist/src/agents/invocation.test.js +214 -0
- package/dist/src/agents/invocation.test.js.map +1 -0
- package/dist/src/agents/registry.d.ts +35 -0
- package/dist/src/agents/registry.js +58 -0
- package/dist/src/agents/registry.js.map +1 -0
- package/dist/src/agents/registry.test.d.ts +6 -0
- package/dist/src/agents/registry.test.js +146 -0
- package/dist/src/agents/registry.test.js.map +1 -0
- package/dist/src/agents/schema-utils.d.ts +39 -0
- package/dist/src/agents/schema-utils.js +57 -0
- package/dist/src/agents/schema-utils.js.map +1 -0
- package/dist/src/agents/schema-utils.test.d.ts +6 -0
- package/dist/src/agents/schema-utils.test.js +144 -0
- package/dist/src/agents/schema-utils.test.js.map +1 -0
- package/dist/src/agents/subagent-tool-wrapper.d.ts +38 -0
- package/dist/src/agents/subagent-tool-wrapper.js +48 -0
- package/dist/src/agents/subagent-tool-wrapper.js.map +1 -0
- package/dist/src/agents/subagent-tool-wrapper.test.d.ts +6 -0
- package/dist/src/agents/subagent-tool-wrapper.test.js +112 -0
- package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -0
- package/dist/src/agents/types.d.ts +123 -0
- package/dist/src/agents/types.js +17 -0
- package/dist/src/agents/types.js.map +1 -0
- package/dist/src/agents/utils.d.ts +15 -0
- package/dist/src/agents/utils.js +29 -0
- package/dist/src/agents/utils.js.map +1 -0
- package/dist/src/agents/utils.test.d.ts +6 -0
- package/dist/src/agents/utils.test.js +87 -0
- package/dist/src/agents/utils.test.js.map +1 -0
- package/dist/src/config/config.d.ts +11 -2
- package/dist/src/config/config.js +49 -3
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +63 -0
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/core/baseLlmClient.js +19 -21
- package/dist/src/core/baseLlmClient.js.map +1 -1
- package/dist/src/core/baseLlmClient.test.js +57 -17
- package/dist/src/core/baseLlmClient.test.js.map +1 -1
- package/dist/src/core/client.js +8 -29
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +223 -94
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +33 -23
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +1 -1
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +2 -1
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +11 -11
- package/dist/src/core/nonInteractiveToolExecutor.test.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/ide/detect-ide.d.ts +1 -0
- package/dist/src/ide/detect-ide.js +4 -1
- package/dist/src/ide/detect-ide.js.map +1 -1
- package/dist/src/mcp/sa-impersonation-provider.d.ts +33 -0
- package/dist/src/mcp/sa-impersonation-provider.js +130 -0
- package/dist/src/mcp/sa-impersonation-provider.js.map +1 -0
- package/dist/src/mcp/sa-impersonation-provider.test.d.ts +6 -0
- package/dist/src/mcp/sa-impersonation-provider.test.js +117 -0
- package/dist/src/mcp/sa-impersonation-provider.test.js.map +1 -0
- package/dist/src/services/fileSystemService.d.ts +9 -0
- package/dist/src/services/fileSystemService.js +11 -0
- package/dist/src/services/fileSystemService.js.map +1 -1
- package/dist/src/services/shellExecutionService.d.ts +2 -0
- package/dist/src/services/shellExecutionService.js +48 -7
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +13 -4
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +4 -2
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +15 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +18 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +2 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +2 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/constants.d.ts +1 -24
- package/dist/src/telemetry/constants.js +1 -25
- package/dist/src/telemetry/constants.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -1
- package/dist/src/telemetry/index.js +7 -1
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +2 -1
- package/dist/src/telemetry/loggers.js +66 -11
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.circular.js +3 -3
- package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +76 -9
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +363 -19
- package/dist/src/telemetry/metrics.js +415 -235
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +352 -54
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +6 -0
- package/dist/src/telemetry/types.js +10 -0
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.test.js +2 -2
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
- package/dist/src/test-utils/mock-tool.d.ts +28 -3
- package/dist/src/test-utils/mock-tool.js +71 -1
- package/dist/src/test-utils/mock-tool.js.map +1 -1
- package/dist/src/tools/glob.js +2 -1
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/mcp-client.js +16 -0
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/shell.js +1 -54
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +0 -1
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/smart-edit.d.ts +20 -1
- package/dist/src/tools/smart-edit.js +114 -4
- package/dist/src/tools/smart-edit.js.map +1 -1
- package/dist/src/tools/smart-edit.test.js +90 -6
- package/dist/src/tools/smart-edit.test.js.map +1 -1
- package/dist/src/tools/tool-names.d.ts +6 -0
- package/dist/src/tools/tool-names.js +15 -0
- package/dist/src/tools/tool-names.js.map +1 -0
- package/dist/src/tools/tool-registry.test.js +10 -10
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/utils/flashFallback.test.js +2 -2
- package/dist/src/utils/flashFallback.test.js.map +1 -1
- package/dist/src/utils/llm-edit-fixer.js +10 -1
- package/dist/src/utils/llm-edit-fixer.js.map +1 -1
- package/dist/src/utils/llm-edit-fixer.test.js +81 -0
- package/dist/src/utils/llm-edit-fixer.test.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.js +13 -20
- package/dist/src/utils/memoryImportProcessor.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.test.js +14 -0
- package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
- package/dist/src/utils/retry.d.ts +3 -1
- package/dist/src/utils/retry.js +13 -4
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +2 -2
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +0 -1
- package/dist/src/utils/shell-utils.js +1 -1
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/terminalSerializer.d.ts +1 -4
- package/dist/src/utils/terminalSerializer.js +3 -3
- package/dist/src/utils/terminalSerializer.js.map +1 -1
- package/dist/src/utils/tool-utils.js +2 -2
- package/dist/src/utils/tool-utils.js.map +1 -1
- package/dist/src/utils/tool-utils.test.js +0 -8
- package/dist/src/utils/tool-utils.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/src/test-utils/tools.d.ts +0 -45
- package/dist/src/test-utils/tools.js +0 -105
- package/dist/src/test-utils/tools.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nonInteractiveToolExecutor.test.js","sourceRoot":"","sources":["../../../src/core/nonInteractiveToolExecutor.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"nonInteractiveToolExecutor.test.js","sourceRoot":"","sources":["../../../src/core/nonInteractiveToolExecutor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -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.9.0-nightly.
|
|
6
|
+
export declare const GIT_COMMIT_INFO = "33269bdb";
|
|
7
|
+
export declare const CLI_VERSION = "0.9.0-nightly.20251001.33269bdb";
|
|
@@ -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.9.0-nightly.
|
|
8
|
+
export const GIT_COMMIT_INFO = '33269bdb';
|
|
9
|
+
export const CLI_VERSION = '0.9.0-nightly.20251001.33269bdb';
|
|
10
10
|
//# sourceMappingURL=git-commit.js.map
|
|
@@ -14,6 +14,9 @@ export const IDE_DEFINITIONS = {
|
|
|
14
14
|
vscode: { name: 'vscode', displayName: 'VS Code' },
|
|
15
15
|
vscodefork: { name: 'vscodefork', displayName: 'IDE' },
|
|
16
16
|
};
|
|
17
|
+
export function isCloudShell() {
|
|
18
|
+
return !!(process.env['EDITOR_IN_CLOUD_SHELL'] || process.env['CLOUD_SHELL']);
|
|
19
|
+
}
|
|
17
20
|
export function detectIdeFromEnv() {
|
|
18
21
|
if (process.env['__COG_BASHRC_SOURCED']) {
|
|
19
22
|
return IDE_DEFINITIONS.devin;
|
|
@@ -27,7 +30,7 @@ export function detectIdeFromEnv() {
|
|
|
27
30
|
if (process.env['CODESPACES']) {
|
|
28
31
|
return IDE_DEFINITIONS.codespaces;
|
|
29
32
|
}
|
|
30
|
-
if (
|
|
33
|
+
if (isCloudShell()) {
|
|
31
34
|
return IDE_DEFINITIONS.cloudshell;
|
|
32
35
|
}
|
|
33
36
|
if (process.env['TERM_PRODUCT'] === 'Trae') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-ide.js","sourceRoot":"","sources":["../../../src/ide/detect-ide.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE;IAC9C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE;IACjD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE;IACjD,UAAU,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE;IAC9D,UAAU,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE;IACpE,cAAc,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,iBAAiB,EAAE;IAC1E,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE;IAC3C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE;IAClD,UAAU,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE;CAC9C,CAAC;AAOX,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACxC,OAAO,eAAe,CAAC,KAAK,CAAC;IAC/B,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,OAAO,eAAe,CAAC,MAAM,CAAC;IAChC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACnC,OAAO,eAAe,CAAC,MAAM,CAAC;IAChC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,OAAO,eAAe,CAAC,UAAU,CAAC;IACpC,CAAC;IACD,IAAI,
|
|
1
|
+
{"version":3,"file":"detect-ide.js","sourceRoot":"","sources":["../../../src/ide/detect-ide.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { OAuthClientInformation, OAuthClientInformationFull, OAuthClientMetadata, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth.js';
|
|
7
|
+
import type { MCPServerConfig } from '../config/config.js';
|
|
8
|
+
import type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';
|
|
9
|
+
export declare class ServiceAccountImpersonationProvider implements OAuthClientProvider {
|
|
10
|
+
private readonly config;
|
|
11
|
+
private readonly targetServiceAccount;
|
|
12
|
+
private readonly targetAudience;
|
|
13
|
+
private readonly auth;
|
|
14
|
+
private cachedToken?;
|
|
15
|
+
private tokenExpiryTime?;
|
|
16
|
+
readonly redirectUrl = "";
|
|
17
|
+
readonly clientMetadata: OAuthClientMetadata;
|
|
18
|
+
private _clientInformation?;
|
|
19
|
+
constructor(config: MCPServerConfig);
|
|
20
|
+
clientInformation(): OAuthClientInformation | undefined;
|
|
21
|
+
saveClientInformation(clientInformation: OAuthClientInformationFull): void;
|
|
22
|
+
tokens(): Promise<OAuthTokens | undefined>;
|
|
23
|
+
saveTokens(_tokens: OAuthTokens): void;
|
|
24
|
+
redirectToAuthorization(_authorizationUrl: URL): void;
|
|
25
|
+
saveCodeVerifier(_codeVerifier: string): void;
|
|
26
|
+
codeVerifier(): string;
|
|
27
|
+
/**
|
|
28
|
+
* Parses a JWT string to extract its expiry time.
|
|
29
|
+
* @param idToken The JWT ID token.
|
|
30
|
+
* @returns The expiry time in **milliseconds**, or undefined if parsing fails.
|
|
31
|
+
*/
|
|
32
|
+
private parseTokenExpiry;
|
|
33
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { GoogleAuth } from 'google-auth-library';
|
|
7
|
+
const fiveMinBufferMs = 5 * 60 * 1000;
|
|
8
|
+
function createIamApiUrl(targetSA) {
|
|
9
|
+
return `https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/${encodeURIComponent(targetSA)}:generateIdToken`;
|
|
10
|
+
}
|
|
11
|
+
export class ServiceAccountImpersonationProvider {
|
|
12
|
+
config;
|
|
13
|
+
targetServiceAccount;
|
|
14
|
+
targetAudience; // OAuth Client Id
|
|
15
|
+
auth;
|
|
16
|
+
cachedToken;
|
|
17
|
+
tokenExpiryTime;
|
|
18
|
+
// Properties required by OAuthClientProvider, with no-op values
|
|
19
|
+
redirectUrl = '';
|
|
20
|
+
clientMetadata = {
|
|
21
|
+
client_name: 'Gemini CLI (Service Account Impersonation)',
|
|
22
|
+
redirect_uris: [],
|
|
23
|
+
grant_types: [],
|
|
24
|
+
response_types: [],
|
|
25
|
+
token_endpoint_auth_method: 'none',
|
|
26
|
+
};
|
|
27
|
+
_clientInformation;
|
|
28
|
+
constructor(config) {
|
|
29
|
+
this.config = config;
|
|
30
|
+
// This check is done in mcp-client.ts. This is just an additional check.
|
|
31
|
+
if (!this.config.httpUrl && !this.config.url) {
|
|
32
|
+
throw new Error('A url or httpUrl must be provided for the Service Account Impersonation provider');
|
|
33
|
+
}
|
|
34
|
+
if (!config.targetAudience) {
|
|
35
|
+
throw new Error('targetAudience must be provided for the Service Account Impersonation provider');
|
|
36
|
+
}
|
|
37
|
+
this.targetAudience = config.targetAudience;
|
|
38
|
+
if (!config.targetServiceAccount) {
|
|
39
|
+
throw new Error('targetServiceAccount must be provided for the Service Account Impersonation provider');
|
|
40
|
+
}
|
|
41
|
+
this.targetServiceAccount = config.targetServiceAccount;
|
|
42
|
+
this.auth = new GoogleAuth();
|
|
43
|
+
}
|
|
44
|
+
clientInformation() {
|
|
45
|
+
return this._clientInformation;
|
|
46
|
+
}
|
|
47
|
+
saveClientInformation(clientInformation) {
|
|
48
|
+
this._clientInformation = clientInformation;
|
|
49
|
+
}
|
|
50
|
+
async tokens() {
|
|
51
|
+
// 1. Check if we have a valid, non-expired cached token.
|
|
52
|
+
if (this.cachedToken &&
|
|
53
|
+
this.tokenExpiryTime &&
|
|
54
|
+
Date.now() < this.tokenExpiryTime - fiveMinBufferMs) {
|
|
55
|
+
return this.cachedToken;
|
|
56
|
+
}
|
|
57
|
+
// 2. Clear any invalid/expired cache.
|
|
58
|
+
this.cachedToken = undefined;
|
|
59
|
+
this.tokenExpiryTime = undefined;
|
|
60
|
+
// 3. Fetch a new ID token.
|
|
61
|
+
const client = await this.auth.getClient();
|
|
62
|
+
const url = createIamApiUrl(this.targetServiceAccount);
|
|
63
|
+
let idToken;
|
|
64
|
+
try {
|
|
65
|
+
const res = await client.request({
|
|
66
|
+
url,
|
|
67
|
+
method: 'POST',
|
|
68
|
+
data: {
|
|
69
|
+
audience: this.targetAudience,
|
|
70
|
+
includeEmail: true,
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
idToken = res.data.token;
|
|
74
|
+
if (!idToken || idToken.length === 0) {
|
|
75
|
+
console.error('Failed to get ID token from Google');
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
console.error('Failed to fetch ID token from Google:', e);
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
const expiryTime = this.parseTokenExpiry(idToken);
|
|
84
|
+
// Note: We are placing the OIDC ID Token into the `access_token` field.
|
|
85
|
+
// This is because the CLI uses this field to construct the
|
|
86
|
+
// `Authorization: Bearer <token>` header, which is the correct way to
|
|
87
|
+
// present an ID token.
|
|
88
|
+
const newTokens = {
|
|
89
|
+
access_token: idToken,
|
|
90
|
+
token_type: 'Bearer',
|
|
91
|
+
};
|
|
92
|
+
if (expiryTime) {
|
|
93
|
+
this.tokenExpiryTime = expiryTime;
|
|
94
|
+
this.cachedToken = newTokens;
|
|
95
|
+
}
|
|
96
|
+
return newTokens;
|
|
97
|
+
}
|
|
98
|
+
saveTokens(_tokens) {
|
|
99
|
+
// No-op
|
|
100
|
+
}
|
|
101
|
+
redirectToAuthorization(_authorizationUrl) {
|
|
102
|
+
// No-op
|
|
103
|
+
}
|
|
104
|
+
saveCodeVerifier(_codeVerifier) {
|
|
105
|
+
// No-op
|
|
106
|
+
}
|
|
107
|
+
codeVerifier() {
|
|
108
|
+
// No-op
|
|
109
|
+
return '';
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Parses a JWT string to extract its expiry time.
|
|
113
|
+
* @param idToken The JWT ID token.
|
|
114
|
+
* @returns The expiry time in **milliseconds**, or undefined if parsing fails.
|
|
115
|
+
*/
|
|
116
|
+
parseTokenExpiry(idToken) {
|
|
117
|
+
try {
|
|
118
|
+
const payload = JSON.parse(Buffer.from(idToken.split('.')[1], 'base64').toString());
|
|
119
|
+
if (payload && typeof payload.exp === 'number') {
|
|
120
|
+
return payload.exp * 1000; // Convert seconds to milliseconds
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
console.error('Failed to parse ID token for expiry time with error:', e);
|
|
125
|
+
}
|
|
126
|
+
// Return undefined if try block fails or 'exp' is missing/invalid
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=sa-impersonation-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sa-impersonation-provider.js","sourceRoot":"","sources":["../../../src/mcp/sa-impersonation-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
7
|
+
import { ServiceAccountImpersonationProvider } from './sa-impersonation-provider.js';
|
|
8
|
+
const mockRequest = vi.fn();
|
|
9
|
+
const mockGetClient = vi.fn(() => ({
|
|
10
|
+
request: mockRequest,
|
|
11
|
+
}));
|
|
12
|
+
// Mock the google-auth-library to use a shared mock function
|
|
13
|
+
vi.mock('google-auth-library', async (importOriginal) => {
|
|
14
|
+
const actual = await importOriginal();
|
|
15
|
+
return {
|
|
16
|
+
...actual,
|
|
17
|
+
GoogleAuth: vi.fn().mockImplementation(() => ({
|
|
18
|
+
getClient: mockGetClient,
|
|
19
|
+
})),
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
const defaultSAConfig = {
|
|
23
|
+
url: 'https://my-iap-service.run.app',
|
|
24
|
+
targetAudience: 'my-audience',
|
|
25
|
+
targetServiceAccount: 'my-sa',
|
|
26
|
+
};
|
|
27
|
+
describe('ServiceAccountImpersonationProvider', () => {
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
// Reset mocks before each test
|
|
30
|
+
vi.clearAllMocks();
|
|
31
|
+
});
|
|
32
|
+
it('should throw an error if no URL is provided', () => {
|
|
33
|
+
const config = {};
|
|
34
|
+
expect(() => new ServiceAccountImpersonationProvider(config)).toThrow('A url or httpUrl must be provided for the Service Account Impersonation provider');
|
|
35
|
+
});
|
|
36
|
+
it('should throw an error if no targetAudience is provided', () => {
|
|
37
|
+
const config = {
|
|
38
|
+
url: 'https://my-iap-service.run.app',
|
|
39
|
+
};
|
|
40
|
+
expect(() => new ServiceAccountImpersonationProvider(config)).toThrow('targetAudience must be provided for the Service Account Impersonation provider');
|
|
41
|
+
});
|
|
42
|
+
it('should throw an error if no targetSA is provided', () => {
|
|
43
|
+
const config = {
|
|
44
|
+
url: 'https://my-iap-service.run.app',
|
|
45
|
+
targetAudience: 'my-audience',
|
|
46
|
+
};
|
|
47
|
+
expect(() => new ServiceAccountImpersonationProvider(config)).toThrow('targetServiceAccount must be provided for the Service Account Impersonation provider');
|
|
48
|
+
});
|
|
49
|
+
it('should correctly get tokens for a valid config', async () => {
|
|
50
|
+
const mockToken = 'mock-id-token-123';
|
|
51
|
+
mockRequest.mockResolvedValue({ data: { token: mockToken } });
|
|
52
|
+
const provider = new ServiceAccountImpersonationProvider(defaultSAConfig);
|
|
53
|
+
const tokens = await provider.tokens();
|
|
54
|
+
expect(tokens).toBeDefined();
|
|
55
|
+
expect(tokens?.access_token).toBe(mockToken);
|
|
56
|
+
expect(tokens?.token_type).toBe('Bearer');
|
|
57
|
+
});
|
|
58
|
+
it('should return undefined if token acquisition fails', async () => {
|
|
59
|
+
mockRequest.mockResolvedValue({ data: { token: null } });
|
|
60
|
+
const provider = new ServiceAccountImpersonationProvider(defaultSAConfig);
|
|
61
|
+
const tokens = await provider.tokens();
|
|
62
|
+
expect(tokens).toBeUndefined();
|
|
63
|
+
});
|
|
64
|
+
it('should make a request with the correct parameters', async () => {
|
|
65
|
+
mockRequest.mockResolvedValue({ data: { token: 'test-token' } });
|
|
66
|
+
const provider = new ServiceAccountImpersonationProvider(defaultSAConfig);
|
|
67
|
+
await provider.tokens();
|
|
68
|
+
expect(mockRequest).toHaveBeenCalledWith({
|
|
69
|
+
url: 'https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/my-sa:generateIdToken',
|
|
70
|
+
method: 'POST',
|
|
71
|
+
data: {
|
|
72
|
+
audience: 'my-audience',
|
|
73
|
+
includeEmail: true,
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
it('should return a cached token if it is not expired', async () => {
|
|
78
|
+
const provider = new ServiceAccountImpersonationProvider(defaultSAConfig);
|
|
79
|
+
vi.useFakeTimers();
|
|
80
|
+
// jwt payload with exp set to 1 hour from now
|
|
81
|
+
const payload = { exp: Math.floor(Date.now() / 1000) + 3600 };
|
|
82
|
+
const jwt = `header.${Buffer.from(JSON.stringify(payload)).toString('base64')}.signature`;
|
|
83
|
+
mockRequest.mockResolvedValue({ data: { token: jwt } });
|
|
84
|
+
const firstTokens = await provider.tokens();
|
|
85
|
+
expect(firstTokens?.access_token).toBe(jwt);
|
|
86
|
+
expect(mockRequest).toHaveBeenCalledTimes(1);
|
|
87
|
+
// Advance time by 30 minutes
|
|
88
|
+
vi.advanceTimersByTime(1800 * 1000);
|
|
89
|
+
// Seturn cached token
|
|
90
|
+
const secondTokens = await provider.tokens();
|
|
91
|
+
expect(secondTokens).toBe(firstTokens);
|
|
92
|
+
expect(mockRequest).toHaveBeenCalledTimes(1);
|
|
93
|
+
vi.useRealTimers();
|
|
94
|
+
});
|
|
95
|
+
it('should fetch a new token if the cached token is expired (using fake timers)', async () => {
|
|
96
|
+
const provider = new ServiceAccountImpersonationProvider(defaultSAConfig);
|
|
97
|
+
vi.useFakeTimers();
|
|
98
|
+
// Get and cache a token that expires in 1 second
|
|
99
|
+
const expiredPayload = { exp: Math.floor(Date.now() / 1000) + 1 };
|
|
100
|
+
const expiredJwt = `header.${Buffer.from(JSON.stringify(expiredPayload)).toString('base64')}.signature`;
|
|
101
|
+
mockRequest.mockResolvedValue({ data: { token: expiredJwt } });
|
|
102
|
+
const firstTokens = await provider.tokens();
|
|
103
|
+
expect(firstTokens?.access_token).toBe(expiredJwt);
|
|
104
|
+
expect(mockRequest).toHaveBeenCalledTimes(1);
|
|
105
|
+
// Prepare the mock for the *next* call
|
|
106
|
+
const newPayload = { exp: Math.floor(Date.now() / 1000) + 3600 };
|
|
107
|
+
const newJwt = `header.${Buffer.from(JSON.stringify(newPayload)).toString('base64')}.signature`;
|
|
108
|
+
mockRequest.mockResolvedValue({ data: { token: newJwt } });
|
|
109
|
+
vi.advanceTimersByTime(1001);
|
|
110
|
+
const newTokens = await provider.tokens();
|
|
111
|
+
expect(newTokens?.access_token).toBe(newJwt);
|
|
112
|
+
expect(newTokens?.access_token).not.toBe(expiredJwt);
|
|
113
|
+
expect(mockRequest).toHaveBeenCalledTimes(2); // Confirms a new fetch
|
|
114
|
+
vi.useRealTimers();
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
//# sourceMappingURL=sa-impersonation-provider.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sa-impersonation-provider.test.js","sourceRoot":"","sources":["../../../src/mcp/sa-impersonation-provider.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,14 @@ export interface FileSystemService {
|
|
|
21
21
|
* @param content - The content to write
|
|
22
22
|
*/
|
|
23
23
|
writeTextFile(filePath: string, content: string): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Finds files with a given name within specified search paths.
|
|
26
|
+
*
|
|
27
|
+
* @param fileName - The name of the file to find.
|
|
28
|
+
* @param searchPaths - An array of directory paths to search within.
|
|
29
|
+
* @returns An array of absolute paths to the found files.
|
|
30
|
+
*/
|
|
31
|
+
findFiles(fileName: string, searchPaths: readonly string[]): string[];
|
|
24
32
|
}
|
|
25
33
|
/**
|
|
26
34
|
* Standard file system implementation
|
|
@@ -28,4 +36,5 @@ export interface FileSystemService {
|
|
|
28
36
|
export declare class StandardFileSystemService implements FileSystemService {
|
|
29
37
|
readTextFile(filePath: string): Promise<string>;
|
|
30
38
|
writeTextFile(filePath: string, content: string): Promise<void>;
|
|
39
|
+
findFiles(fileName: string, searchPaths: readonly string[]): string[];
|
|
31
40
|
}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import fs from 'node:fs/promises';
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
import { globSync } from 'glob';
|
|
7
9
|
/**
|
|
8
10
|
* Standard file system implementation
|
|
9
11
|
*/
|
|
@@ -14,5 +16,14 @@ export class StandardFileSystemService {
|
|
|
14
16
|
async writeTextFile(filePath, content) {
|
|
15
17
|
await fs.writeFile(filePath, content, 'utf-8');
|
|
16
18
|
}
|
|
19
|
+
findFiles(fileName, searchPaths) {
|
|
20
|
+
return searchPaths.flatMap((searchPath) => {
|
|
21
|
+
const pattern = path.posix.join(searchPath, '**', fileName);
|
|
22
|
+
return globSync(pattern, {
|
|
23
|
+
nodir: true,
|
|
24
|
+
absolute: true,
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
17
28
|
}
|
|
18
29
|
//# sourceMappingURL=fileSystemService.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileSystemService.js","sourceRoot":"","sources":["../../../src/services/fileSystemService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"fileSystemService.js","sourceRoot":"","sources":["../../../src/services/fileSystemService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAgChC;;GAEG;AACH,MAAM,OAAO,yBAAyB;IACpC,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB,EAAE,OAAe;QACnD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,SAAS,CAAC,QAAgB,EAAE,WAA8B;QACxD,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC5D,OAAO,QAAQ,CAAC,OAAO,EAAE;gBACvB,KAAK,EAAE,IAAI;gBACX,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -37,6 +37,7 @@ export interface ShellExecutionConfig {
|
|
|
37
37
|
showColor?: boolean;
|
|
38
38
|
defaultFg?: string;
|
|
39
39
|
defaultBg?: string;
|
|
40
|
+
disableDynamicLineTrimming?: boolean;
|
|
40
41
|
}
|
|
41
42
|
/**
|
|
42
43
|
* Describes a structured event emitted during shell command execution.
|
|
@@ -82,6 +83,7 @@ export declare class ShellExecutionService {
|
|
|
82
83
|
* @param input The string to write to the terminal.
|
|
83
84
|
*/
|
|
84
85
|
static writeToPty(pid: number, input: string): void;
|
|
86
|
+
static isPtyActive(pid: number): boolean;
|
|
85
87
|
/**
|
|
86
88
|
* Resizes the pseudo-terminal (PTY) of a running process.
|
|
87
89
|
*
|
|
@@ -253,6 +253,7 @@ export class ShellExecutionService {
|
|
|
253
253
|
const MAX_SNIFF_SIZE = 4096;
|
|
254
254
|
let sniffedBytes = 0;
|
|
255
255
|
let isWriting = false;
|
|
256
|
+
let hasStartedOutput = false;
|
|
256
257
|
let renderTimeout = null;
|
|
257
258
|
const render = (finalRender = false) => {
|
|
258
259
|
if (renderTimeout) {
|
|
@@ -262,12 +263,18 @@ export class ShellExecutionService {
|
|
|
262
263
|
if (!isStreamingRawContent) {
|
|
263
264
|
return;
|
|
264
265
|
}
|
|
266
|
+
if (!shellExecutionConfig.disableDynamicLineTrimming) {
|
|
267
|
+
if (!hasStartedOutput) {
|
|
268
|
+
const bufferText = getFullBufferText(headlessTerminal);
|
|
269
|
+
if (bufferText.trim().length === 0) {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
hasStartedOutput = true;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
265
275
|
let newOutput;
|
|
266
276
|
if (shellExecutionConfig.showColor) {
|
|
267
|
-
newOutput = serializeTerminalToObject(headlessTerminal
|
|
268
|
-
defaultFg: shellExecutionConfig.defaultFg,
|
|
269
|
-
defaultBg: shellExecutionConfig.defaultBg,
|
|
270
|
-
});
|
|
277
|
+
newOutput = serializeTerminalToObject(headlessTerminal);
|
|
271
278
|
}
|
|
272
279
|
else {
|
|
273
280
|
const buffer = headlessTerminal.buffer.active;
|
|
@@ -290,12 +297,27 @@ export class ShellExecutionService {
|
|
|
290
297
|
}
|
|
291
298
|
newOutput = lines;
|
|
292
299
|
}
|
|
300
|
+
let lastNonEmptyLine = -1;
|
|
301
|
+
for (let i = newOutput.length - 1; i >= 0; i--) {
|
|
302
|
+
const line = newOutput[i];
|
|
303
|
+
if (line
|
|
304
|
+
.map((segment) => segment.text)
|
|
305
|
+
.join('')
|
|
306
|
+
.trim().length > 0) {
|
|
307
|
+
lastNonEmptyLine = i;
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
const trimmedOutput = newOutput.slice(0, lastNonEmptyLine + 1);
|
|
312
|
+
const finalOutput = shellExecutionConfig.disableDynamicLineTrimming
|
|
313
|
+
? newOutput
|
|
314
|
+
: trimmedOutput;
|
|
293
315
|
// Using stringify for a quick deep comparison.
|
|
294
|
-
if (JSON.stringify(output) !== JSON.stringify(
|
|
295
|
-
output =
|
|
316
|
+
if (JSON.stringify(output) !== JSON.stringify(finalOutput)) {
|
|
317
|
+
output = finalOutput;
|
|
296
318
|
onOutputEvent({
|
|
297
319
|
type: 'data',
|
|
298
|
-
chunk:
|
|
320
|
+
chunk: finalOutput,
|
|
299
321
|
});
|
|
300
322
|
}
|
|
301
323
|
};
|
|
@@ -419,11 +441,24 @@ export class ShellExecutionService {
|
|
|
419
441
|
* @param input The string to write to the terminal.
|
|
420
442
|
*/
|
|
421
443
|
static writeToPty(pid, input) {
|
|
444
|
+
if (!this.isPtyActive(pid)) {
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
422
447
|
const activePty = this.activePtys.get(pid);
|
|
423
448
|
if (activePty) {
|
|
424
449
|
activePty.ptyProcess.write(input);
|
|
425
450
|
}
|
|
426
451
|
}
|
|
452
|
+
static isPtyActive(pid) {
|
|
453
|
+
try {
|
|
454
|
+
// process.kill with signal 0 is a way to check for the existence of a process.
|
|
455
|
+
// It doesn't actually send a signal.
|
|
456
|
+
return process.kill(pid, 0);
|
|
457
|
+
}
|
|
458
|
+
catch (_) {
|
|
459
|
+
return false;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
427
462
|
/**
|
|
428
463
|
* Resizes the pseudo-terminal (PTY) of a running process.
|
|
429
464
|
*
|
|
@@ -432,6 +467,9 @@ export class ShellExecutionService {
|
|
|
432
467
|
* @param rows The new number of rows.
|
|
433
468
|
*/
|
|
434
469
|
static resizePty(pid, cols, rows) {
|
|
470
|
+
if (!this.isPtyActive(pid)) {
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
435
473
|
const activePty = this.activePtys.get(pid);
|
|
436
474
|
if (activePty) {
|
|
437
475
|
try {
|
|
@@ -457,6 +495,9 @@ export class ShellExecutionService {
|
|
|
457
495
|
* @param lines The number of lines to scroll.
|
|
458
496
|
*/
|
|
459
497
|
static scrollPty(pid, lines) {
|
|
498
|
+
if (!this.isPtyActive(pid)) {
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
460
501
|
const activePty = this.activePtys.get(pid);
|
|
461
502
|
if (activePty) {
|
|
462
503
|
try {
|