@google/gemini-cli-core 0.1.7 → 0.1.8-rc.1
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 +8 -2
- package/dist/google-gemini-cli-core-0.1.8-rc.1.tgz +0 -0
- package/dist/src/code_assist/codeAssist.js +1 -1
- package/dist/src/code_assist/codeAssist.js.map +1 -1
- package/dist/src/code_assist/oauth2.d.ts +7 -0
- package/dist/src/code_assist/oauth2.js +81 -2
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +20 -4
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.d.ts +8 -7
- package/dist/src/code_assist/server.js +24 -20
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/server.test.js +21 -21
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/code_assist/setup.d.ts +1 -1
- package/dist/src/code_assist/setup.js +2 -2
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/config/config.d.ts +2 -1
- package/dist/src/config/config.js +22 -17
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/core/client.js +38 -47
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +2 -2
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.d.ts +1 -1
- package/dist/src/core/contentGenerator.js +3 -3
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +1 -1
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +1 -2
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +1 -5
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/prompts.d.ts +6 -0
- package/dist/src/core/prompts.js +64 -0
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/turn.d.ts +2 -11
- package/dist/src/core/turn.js +1 -19
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/core/turn.test.js +0 -45
- package/dist/src/core/turn.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +5 -6
- 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 +19 -0
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +41 -0
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +1 -0
- package/dist/src/telemetry/types.js +2 -0
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.d.ts +67 -0
- package/dist/src/telemetry/uiTelemetry.js +131 -0
- package/dist/src/telemetry/uiTelemetry.js.map +1 -0
- package/dist/src/telemetry/uiTelemetry.test.d.ts +6 -0
- package/dist/src/telemetry/uiTelemetry.test.js +411 -0
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -0
- package/dist/src/tools/edit.d.ts +4 -0
- package/dist/src/tools/edit.js +15 -6
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +41 -3
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/grep.js +4 -2
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +10 -10
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +1 -1
- package/dist/src/tools/mcp-client.js +15 -8
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +86 -11
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/modifiable-tool.js +5 -4
- package/dist/src/tools/modifiable-tool.js.map +1 -1
- package/dist/src/tools/modifiable-tool.test.js +16 -3
- package/dist/src/tools/modifiable-tool.test.js.map +1 -1
- package/dist/src/tools/read-file.js +1 -2
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +27 -2
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +1 -0
- package/dist/src/tools/shell.js +93 -22
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.d.ts +6 -0
- package/dist/src/tools/shell.test.js +301 -0
- package/dist/src/tools/shell.test.js.map +1 -0
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/write-file.d.ts +4 -0
- package/dist/src/tools/write-file.js +13 -5
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +35 -0
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/utils/editor.d.ts +1 -1
- package/dist/src/utils/editor.js +19 -6
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +60 -27
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/fileUtils.d.ts +2 -2
- package/dist/src/utils/fileUtils.js +25 -8
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/fileUtils.test.js +18 -0
- package/dist/src/utils/fileUtils.test.js.map +1 -1
- package/dist/src/utils/flashFallback.integration.test.js +2 -2
- package/dist/src/utils/flashFallback.integration.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.js +5 -2
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.d.ts +35 -0
- package/dist/src/utils/memoryImportProcessor.js +141 -0
- package/dist/src/utils/memoryImportProcessor.js.map +1 -0
- package/dist/src/utils/memoryImportProcessor.test.d.ts +6 -0
- package/dist/src/utils/memoryImportProcessor.test.js +170 -0
- package/dist/src/utils/memoryImportProcessor.test.js.map +1 -0
- package/dist/src/utils/retry.js +1 -1
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/user_id.d.ts +9 -3
- package/dist/src/utils/user_id.js +37 -16
- package/dist/src/utils/user_id.js.map +1 -1
- package/dist/src/utils/user_id.test.d.ts +6 -0
- package/dist/src/utils/user_id.test.js +38 -0
- package/dist/src/utils/user_id.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -3
- package/dist/google-gemini-cli-core-0.1.7.tgz +0 -0
- package/dist/src/tools/shell.json +0 -18
- package/dist/src/tools/shell.md +0 -16
package/README.md
CHANGED
|
@@ -38,9 +38,9 @@ With the Gemini CLI you can:
|
|
|
38
38
|
|
|
39
39
|
You are now ready to use the Gemini CLI!
|
|
40
40
|
|
|
41
|
-
###
|
|
41
|
+
### Use a Gemini API key:
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
The Gemini API provides a free tier with [100 requets per day](https://ai.google.dev/gemini-api/docs/rate-limits#free-tier) using Gemini 2.5 Pro, control over which model you use, and access to higher rate limits (with a paid plan):
|
|
44
44
|
|
|
45
45
|
1. Generate a key from [Google AI Studio](https://aistudio.google.com/apikey).
|
|
46
46
|
2. Set it as an environment variable in your terminal. Replace `YOUR_API_KEY` with your generated key.
|
|
@@ -49,6 +49,8 @@ If you need to use a specific model or require a higher request capacity, you ca
|
|
|
49
49
|
export GEMINI_API_KEY="YOUR_API_KEY"
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
+
3. (Optionally) Upgrade your Gemini API project to a paid plan on the API key page (will automatically unlock [Tier 1 rate limits](https://ai.google.dev/gemini-api/docs/rate-limits#tier-1))
|
|
53
|
+
|
|
52
54
|
For other authentication methods, including Google Workspace accounts, see the [authentication](./docs/cli/authentication.md) guide.
|
|
53
55
|
|
|
54
56
|
## Examples
|
|
@@ -131,6 +133,10 @@ Use MCP servers to integrate your local system tools with your enterprise collab
|
|
|
131
133
|
> Organise my PDF invoices by month of expenditure.
|
|
132
134
|
```
|
|
133
135
|
|
|
136
|
+
### Uninstall
|
|
137
|
+
|
|
138
|
+
Head over to the [Uninstall](docs/Uninstall.md) guide for uninstallation instructions.
|
|
139
|
+
|
|
134
140
|
## Terms of Service and Privacy Notice
|
|
135
141
|
|
|
136
142
|
For details on the terms of service and privacy notice applicable to your use of Gemini CLI, see the [Terms of Service and Privacy Notice](./docs/tos-privacy.md).
|
|
Binary file
|
|
@@ -8,7 +8,7 @@ import { getOauthClient } from './oauth2.js';
|
|
|
8
8
|
import { setupUser } from './setup.js';
|
|
9
9
|
import { CodeAssistServer } from './server.js';
|
|
10
10
|
export async function createCodeAssistContentGenerator(httpOptions, authType) {
|
|
11
|
-
if (authType === AuthType.
|
|
11
|
+
if (authType === AuthType.LOGIN_WITH_GOOGLE) {
|
|
12
12
|
const authClient = await getOauthClient();
|
|
13
13
|
const projectId = await setupUser(authClient);
|
|
14
14
|
return new CodeAssistServer(authClient, projectId, httpOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codeAssist.js","sourceRoot":"","sources":["../../../src/code_assist/codeAssist.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAoB,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAe,MAAM,aAAa,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,WAAwB,EACxB,QAAkB;IAElB,IAAI,QAAQ,KAAK,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"codeAssist.js","sourceRoot":"","sources":["../../../src/code_assist/codeAssist.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAoB,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAe,MAAM,aAAa,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,WAAwB,EACxB,QAAkB;IAElB,IAAI,QAAQ,KAAK,QAAQ,CAAC,iBAAiB,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;QAC9C,OAAO,IAAI,gBAAgB,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -15,4 +15,11 @@ export interface OauthWebLogin {
|
|
|
15
15
|
}
|
|
16
16
|
export declare function getOauthClient(): Promise<OAuth2Client>;
|
|
17
17
|
export declare function getAvailablePort(): Promise<number>;
|
|
18
|
+
export declare function getCachedGoogleAccountId(): string | null;
|
|
18
19
|
export declare function clearCachedCredentialFile(): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Retrieves the authenticated user's Google Account ID from Google's UserInfo API.
|
|
22
|
+
* @param client - The authenticated OAuth2Client
|
|
23
|
+
* @returns The user's Google Account ID or null if not available
|
|
24
|
+
*/
|
|
25
|
+
export declare function getGoogleAccountId(client: OAuth2Client): Promise<string | null>;
|
|
@@ -32,13 +32,30 @@ const SIGN_IN_SUCCESS_URL = 'https://developers.google.com/gemini-code-assist/au
|
|
|
32
32
|
const SIGN_IN_FAILURE_URL = 'https://developers.google.com/gemini-code-assist/auth_failure_gemini';
|
|
33
33
|
const GEMINI_DIR = '.gemini';
|
|
34
34
|
const CREDENTIAL_FILENAME = 'oauth_creds.json';
|
|
35
|
+
const GOOGLE_ACCOUNT_ID_FILENAME = 'google_account_id';
|
|
35
36
|
export async function getOauthClient() {
|
|
36
37
|
const client = new OAuth2Client({
|
|
37
38
|
clientId: OAUTH_CLIENT_ID,
|
|
38
39
|
clientSecret: OAUTH_CLIENT_SECRET,
|
|
39
40
|
});
|
|
41
|
+
client.on('tokens', async (tokens) => {
|
|
42
|
+
await cacheCredentials(tokens);
|
|
43
|
+
});
|
|
40
44
|
if (await loadCachedCredentials(client)) {
|
|
41
45
|
// Found valid cached credentials.
|
|
46
|
+
// Check if we need to retrieve Google Account ID
|
|
47
|
+
if (!getCachedGoogleAccountId()) {
|
|
48
|
+
try {
|
|
49
|
+
const googleAccountId = await getGoogleAccountId(client);
|
|
50
|
+
if (googleAccountId) {
|
|
51
|
+
await cacheGoogleAccountId(googleAccountId);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.error('Failed to retrieve Google Account ID for existing credentials:', error);
|
|
56
|
+
// Continue with existing auth flow
|
|
57
|
+
}
|
|
58
|
+
}
|
|
42
59
|
return client;
|
|
43
60
|
}
|
|
44
61
|
const webLogin = await authWithWeb(client);
|
|
@@ -85,7 +102,17 @@ async function authWithWeb(client) {
|
|
|
85
102
|
redirect_uri: redirectUri,
|
|
86
103
|
});
|
|
87
104
|
client.setCredentials(tokens);
|
|
88
|
-
|
|
105
|
+
// Retrieve and cache Google Account ID during authentication
|
|
106
|
+
try {
|
|
107
|
+
const googleAccountId = await getGoogleAccountId(client);
|
|
108
|
+
if (googleAccountId) {
|
|
109
|
+
await cacheGoogleAccountId(googleAccountId);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
console.error('Failed to retrieve Google Account ID during authentication:', error);
|
|
114
|
+
// Don't fail the auth flow if Google Account ID retrieval fails
|
|
115
|
+
}
|
|
89
116
|
res.writeHead(HTTP_REDIRECT, { Location: SIGN_IN_SUCCESS_URL });
|
|
90
117
|
res.end();
|
|
91
118
|
resolve();
|
|
@@ -156,12 +183,64 @@ async function cacheCredentials(credentials) {
|
|
|
156
183
|
function getCachedCredentialPath() {
|
|
157
184
|
return path.join(os.homedir(), GEMINI_DIR, CREDENTIAL_FILENAME);
|
|
158
185
|
}
|
|
186
|
+
function getGoogleAccountIdCachePath() {
|
|
187
|
+
return path.join(os.homedir(), GEMINI_DIR, GOOGLE_ACCOUNT_ID_FILENAME);
|
|
188
|
+
}
|
|
189
|
+
async function cacheGoogleAccountId(googleAccountId) {
|
|
190
|
+
const filePath = getGoogleAccountIdCachePath();
|
|
191
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
192
|
+
await fs.writeFile(filePath, googleAccountId, 'utf-8');
|
|
193
|
+
}
|
|
194
|
+
export function getCachedGoogleAccountId() {
|
|
195
|
+
try {
|
|
196
|
+
const filePath = getGoogleAccountIdCachePath();
|
|
197
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports, no-restricted-syntax
|
|
198
|
+
const fs_sync = require('fs');
|
|
199
|
+
if (fs_sync.existsSync(filePath)) {
|
|
200
|
+
return fs_sync.readFileSync(filePath, 'utf-8').trim() || null;
|
|
201
|
+
}
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
catch (_error) {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
159
208
|
export async function clearCachedCredentialFile() {
|
|
160
209
|
try {
|
|
161
|
-
await fs.rm(getCachedCredentialPath());
|
|
210
|
+
await fs.rm(getCachedCredentialPath(), { force: true });
|
|
211
|
+
// Clear the Google Account ID cache when credentials are cleared
|
|
212
|
+
await fs.rm(getGoogleAccountIdCachePath(), { force: true });
|
|
162
213
|
}
|
|
163
214
|
catch (_) {
|
|
164
215
|
/* empty */
|
|
165
216
|
}
|
|
166
217
|
}
|
|
218
|
+
/**
|
|
219
|
+
* Retrieves the authenticated user's Google Account ID from Google's UserInfo API.
|
|
220
|
+
* @param client - The authenticated OAuth2Client
|
|
221
|
+
* @returns The user's Google Account ID or null if not available
|
|
222
|
+
*/
|
|
223
|
+
export async function getGoogleAccountId(client) {
|
|
224
|
+
try {
|
|
225
|
+
const { token } = await client.getAccessToken();
|
|
226
|
+
if (!token) {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
const response = await fetch('https://www.googleapis.com/oauth2/v2/userinfo', {
|
|
230
|
+
headers: {
|
|
231
|
+
Authorization: `Bearer ${token}`,
|
|
232
|
+
},
|
|
233
|
+
});
|
|
234
|
+
if (!response.ok) {
|
|
235
|
+
console.error('Failed to fetch user info:', response.status, response.statusText);
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
const userInfo = await response.json();
|
|
239
|
+
return userInfo.id || null;
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
console.error('Error retrieving Google Account ID:', error);
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
167
246
|
//# sourceMappingURL=oauth2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth2.js","sourceRoot":"","sources":["../../../src/code_assist/oauth2.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAe,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,wDAAwD;AACxD,MAAM,eAAe,GACnB,0EAA0E,CAAC;AAE7E,0DAA0D;AAC1D,6EAA6E;AAC7E,uFAAuF;AACvF,2EAA2E;AAC3E,4EAA4E;AAC5E,4DAA4D;AAC5D,MAAM,mBAAmB,GAAG,qCAAqC,CAAC;AAElE,6CAA6C;AAC7C,MAAM,WAAW,GAAG;IAClB,gDAAgD;IAChD,gDAAgD;IAChD,kDAAkD;CACnD,CAAC;AAEF,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,mBAAmB,GACvB,sEAAsE,CAAC;AACzE,MAAM,mBAAmB,GACvB,sEAAsE,CAAC;AAEzE,MAAM,UAAU,GAAG,SAAS,CAAC;AAC7B,MAAM,mBAAmB,GAAG,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"oauth2.js","sourceRoot":"","sources":["../../../src/code_assist/oauth2.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
-
import { getOauthClient } from './oauth2.js';
|
|
7
|
+
import { getOauthClient, getCachedGoogleAccountId } from './oauth2.js';
|
|
8
8
|
import { OAuth2Client } from 'google-auth-library';
|
|
9
9
|
import * as fs from 'fs';
|
|
10
10
|
import * as path from 'path';
|
|
@@ -23,6 +23,8 @@ vi.mock('google-auth-library');
|
|
|
23
23
|
vi.mock('http');
|
|
24
24
|
vi.mock('open');
|
|
25
25
|
vi.mock('crypto');
|
|
26
|
+
// Mock fetch globally
|
|
27
|
+
global.fetch = vi.fn();
|
|
26
28
|
describe('oauth2', () => {
|
|
27
29
|
let tempHomeDir;
|
|
28
30
|
beforeEach(() => {
|
|
@@ -43,15 +45,25 @@ describe('oauth2', () => {
|
|
|
43
45
|
const mockGenerateAuthUrl = vi.fn().mockReturnValue(mockAuthUrl);
|
|
44
46
|
const mockGetToken = vi.fn().mockResolvedValue({ tokens: mockTokens });
|
|
45
47
|
const mockSetCredentials = vi.fn();
|
|
48
|
+
const mockGetAccessToken = vi
|
|
49
|
+
.fn()
|
|
50
|
+
.mockResolvedValue({ token: 'mock-access-token' });
|
|
46
51
|
const mockOAuth2Client = {
|
|
47
52
|
generateAuthUrl: mockGenerateAuthUrl,
|
|
48
53
|
getToken: mockGetToken,
|
|
49
54
|
setCredentials: mockSetCredentials,
|
|
55
|
+
getAccessToken: mockGetAccessToken,
|
|
50
56
|
credentials: mockTokens,
|
|
57
|
+
on: vi.fn(),
|
|
51
58
|
};
|
|
52
59
|
vi.mocked(OAuth2Client).mockImplementation(() => mockOAuth2Client);
|
|
53
60
|
vi.spyOn(crypto, 'randomBytes').mockReturnValue(mockState);
|
|
54
61
|
vi.mocked(open).mockImplementation(async () => ({}));
|
|
62
|
+
// Mock the UserInfo API response
|
|
63
|
+
vi.mocked(global.fetch).mockResolvedValue({
|
|
64
|
+
ok: true,
|
|
65
|
+
json: vi.fn().mockResolvedValue({ id: 'test-google-account-id-123' }),
|
|
66
|
+
});
|
|
55
67
|
let requestCallback;
|
|
56
68
|
let serverListeningCallback;
|
|
57
69
|
const serverListeningPromise = new Promise((resolve) => (serverListeningCallback = resolve));
|
|
@@ -95,9 +107,13 @@ describe('oauth2', () => {
|
|
|
95
107
|
redirect_uri: `http://localhost:${capturedPort}/oauth2callback`,
|
|
96
108
|
});
|
|
97
109
|
expect(mockSetCredentials).toHaveBeenCalledWith(mockTokens);
|
|
98
|
-
|
|
99
|
-
const
|
|
100
|
-
expect(
|
|
110
|
+
// Verify Google Account ID was cached
|
|
111
|
+
const googleAccountIdPath = path.join(tempHomeDir, '.gemini', 'google_account_id');
|
|
112
|
+
expect(fs.existsSync(googleAccountIdPath)).toBe(true);
|
|
113
|
+
const cachedGoogleAccountId = fs.readFileSync(googleAccountIdPath, 'utf-8');
|
|
114
|
+
expect(cachedGoogleAccountId).toBe('test-google-account-id-123');
|
|
115
|
+
// Verify the getCachedGoogleAccountId function works
|
|
116
|
+
expect(getCachedGoogleAccountId()).toBe('test-google-account-id-123');
|
|
101
117
|
});
|
|
102
118
|
});
|
|
103
119
|
//# sourceMappingURL=oauth2.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth2.test.js","sourceRoot":"","sources":["../../../src/code_assist/oauth2.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"oauth2.test.js","sourceRoot":"","sources":["../../../src/code_assist/oauth2.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
6
|
+
import { OAuth2Client } from 'google-auth-library';
|
|
7
7
|
import { CodeAssistGlobalUserSettingResponse, LoadCodeAssistRequest, LoadCodeAssistResponse, LongrunningOperationResponse, OnboardUserRequest, SetCodeAssistGlobalUserSettingRequest } from './types.js';
|
|
8
8
|
import { CountTokensParameters, CountTokensResponse, EmbedContentParameters, EmbedContentResponse, GenerateContentParameters, GenerateContentResponse } from '@google/genai';
|
|
9
9
|
import { ContentGenerator } from '../core/contentGenerator.js';
|
|
@@ -12,13 +12,13 @@ export interface HttpOptions {
|
|
|
12
12
|
/** Additional HTTP headers to be sent with the request. */
|
|
13
13
|
headers?: Record<string, string>;
|
|
14
14
|
}
|
|
15
|
-
export declare const CODE_ASSIST_ENDPOINT
|
|
15
|
+
export declare const CODE_ASSIST_ENDPOINT = "https://cloudcode-pa.googleapis.com";
|
|
16
16
|
export declare const CODE_ASSIST_API_VERSION = "v1internal";
|
|
17
17
|
export declare class CodeAssistServer implements ContentGenerator {
|
|
18
|
-
readonly
|
|
18
|
+
readonly client: OAuth2Client;
|
|
19
19
|
readonly projectId?: string | undefined;
|
|
20
20
|
readonly httpOptions: HttpOptions;
|
|
21
|
-
constructor(
|
|
21
|
+
constructor(client: OAuth2Client, projectId?: string | undefined, httpOptions?: HttpOptions);
|
|
22
22
|
generateContentStream(req: GenerateContentParameters): Promise<AsyncGenerator<GenerateContentResponse>>;
|
|
23
23
|
generateContent(req: GenerateContentParameters): Promise<GenerateContentResponse>;
|
|
24
24
|
onboardUser(req: OnboardUserRequest): Promise<LongrunningOperationResponse>;
|
|
@@ -27,7 +27,8 @@ export declare class CodeAssistServer implements ContentGenerator {
|
|
|
27
27
|
setCodeAssistGlobalUserSetting(req: SetCodeAssistGlobalUserSettingRequest): Promise<CodeAssistGlobalUserSettingResponse>;
|
|
28
28
|
countTokens(req: CountTokensParameters): Promise<CountTokensResponse>;
|
|
29
29
|
embedContent(_req: EmbedContentParameters): Promise<EmbedContentResponse>;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
requestPost<T>(method: string, req: object, signal?: AbortSignal): Promise<T>;
|
|
31
|
+
requestGet<T>(method: string, signal?: AbortSignal): Promise<T>;
|
|
32
|
+
requestStreamingPost<T>(method: string, req: object, signal?: AbortSignal): Promise<AsyncGenerator<T>>;
|
|
33
|
+
getMethodUrl(method: string): string;
|
|
33
34
|
}
|
|
@@ -6,19 +6,19 @@
|
|
|
6
6
|
import * as readline from 'readline';
|
|
7
7
|
import { fromCountTokenResponse, fromGenerateContentResponse, toCountTokenRequest, toGenerateContentRequest, } from './converter.js';
|
|
8
8
|
// TODO: Use production endpoint once it supports our methods.
|
|
9
|
-
export const CODE_ASSIST_ENDPOINT =
|
|
9
|
+
export const CODE_ASSIST_ENDPOINT = 'https://cloudcode-pa.googleapis.com';
|
|
10
10
|
export const CODE_ASSIST_API_VERSION = 'v1internal';
|
|
11
11
|
export class CodeAssistServer {
|
|
12
|
-
|
|
12
|
+
client;
|
|
13
13
|
projectId;
|
|
14
14
|
httpOptions;
|
|
15
|
-
constructor(
|
|
16
|
-
this.
|
|
15
|
+
constructor(client, projectId, httpOptions = {}) {
|
|
16
|
+
this.client = client;
|
|
17
17
|
this.projectId = projectId;
|
|
18
18
|
this.httpOptions = httpOptions;
|
|
19
19
|
}
|
|
20
20
|
async generateContentStream(req) {
|
|
21
|
-
const resps = await this.
|
|
21
|
+
const resps = await this.requestStreamingPost('streamGenerateContent', toGenerateContentRequest(req, this.projectId), req.config?.abortSignal);
|
|
22
22
|
return (async function* () {
|
|
23
23
|
for await (const resp of resps) {
|
|
24
24
|
yield fromGenerateContentResponse(resp);
|
|
@@ -26,31 +26,31 @@ export class CodeAssistServer {
|
|
|
26
26
|
})();
|
|
27
27
|
}
|
|
28
28
|
async generateContent(req) {
|
|
29
|
-
const resp = await this.
|
|
29
|
+
const resp = await this.requestPost('generateContent', toGenerateContentRequest(req, this.projectId), req.config?.abortSignal);
|
|
30
30
|
return fromGenerateContentResponse(resp);
|
|
31
31
|
}
|
|
32
32
|
async onboardUser(req) {
|
|
33
|
-
return await this.
|
|
33
|
+
return await this.requestPost('onboardUser', req);
|
|
34
34
|
}
|
|
35
35
|
async loadCodeAssist(req) {
|
|
36
|
-
return await this.
|
|
36
|
+
return await this.requestPost('loadCodeAssist', req);
|
|
37
37
|
}
|
|
38
38
|
async getCodeAssistGlobalUserSetting() {
|
|
39
|
-
return await this.
|
|
39
|
+
return await this.requestGet('getCodeAssistGlobalUserSetting');
|
|
40
40
|
}
|
|
41
41
|
async setCodeAssistGlobalUserSetting(req) {
|
|
42
|
-
return await this.
|
|
42
|
+
return await this.requestPost('setCodeAssistGlobalUserSetting', req);
|
|
43
43
|
}
|
|
44
44
|
async countTokens(req) {
|
|
45
|
-
const resp = await this.
|
|
45
|
+
const resp = await this.requestPost('countTokens', toCountTokenRequest(req));
|
|
46
46
|
return fromCountTokenResponse(resp);
|
|
47
47
|
}
|
|
48
48
|
async embedContent(_req) {
|
|
49
49
|
throw Error();
|
|
50
50
|
}
|
|
51
|
-
async
|
|
52
|
-
const res = await this.
|
|
53
|
-
url:
|
|
51
|
+
async requestPost(method, req, signal) {
|
|
52
|
+
const res = await this.client.request({
|
|
53
|
+
url: this.getMethodUrl(method),
|
|
54
54
|
method: 'POST',
|
|
55
55
|
headers: {
|
|
56
56
|
'Content-Type': 'application/json',
|
|
@@ -62,9 +62,9 @@ export class CodeAssistServer {
|
|
|
62
62
|
});
|
|
63
63
|
return res.data;
|
|
64
64
|
}
|
|
65
|
-
async
|
|
66
|
-
const res = await this.
|
|
67
|
-
url:
|
|
65
|
+
async requestGet(method, signal) {
|
|
66
|
+
const res = await this.client.request({
|
|
67
|
+
url: this.getMethodUrl(method),
|
|
68
68
|
method: 'GET',
|
|
69
69
|
headers: {
|
|
70
70
|
'Content-Type': 'application/json',
|
|
@@ -75,9 +75,9 @@ export class CodeAssistServer {
|
|
|
75
75
|
});
|
|
76
76
|
return res.data;
|
|
77
77
|
}
|
|
78
|
-
async
|
|
79
|
-
const res = await this.
|
|
80
|
-
url:
|
|
78
|
+
async requestStreamingPost(method, req, signal) {
|
|
79
|
+
const res = await this.client.request({
|
|
80
|
+
url: this.getMethodUrl(method),
|
|
81
81
|
method: 'POST',
|
|
82
82
|
params: {
|
|
83
83
|
alt: 'sse',
|
|
@@ -114,5 +114,9 @@ export class CodeAssistServer {
|
|
|
114
114
|
}
|
|
115
115
|
})();
|
|
116
116
|
}
|
|
117
|
+
getMethodUrl(method) {
|
|
118
|
+
const endpoint = process.env.CODE_ASSIST_ENDPOINT ?? CODE_ASSIST_ENDPOINT;
|
|
119
|
+
return `${endpoint}/${CODE_ASSIST_API_VERSION}:${method}`;
|
|
120
|
+
}
|
|
117
121
|
}
|
|
118
122
|
//# sourceMappingURL=server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/code_assist/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAErC,OAAO,EAGL,sBAAsB,EACtB,2BAA2B,EAC3B,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AASxB,8DAA8D;AAC9D,MAAM,CAAC,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/code_assist/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,8 +14,8 @@ describe('CodeAssistServer', () => {
|
|
|
14
14
|
expect(server).toBeInstanceOf(CodeAssistServer);
|
|
15
15
|
});
|
|
16
16
|
it('should call the generateContent endpoint', async () => {
|
|
17
|
-
const
|
|
18
|
-
const server = new CodeAssistServer(
|
|
17
|
+
const client = new OAuth2Client();
|
|
18
|
+
const server = new CodeAssistServer(client, 'test-project');
|
|
19
19
|
const mockResponse = {
|
|
20
20
|
response: {
|
|
21
21
|
candidates: [
|
|
@@ -31,17 +31,17 @@ describe('CodeAssistServer', () => {
|
|
|
31
31
|
],
|
|
32
32
|
},
|
|
33
33
|
};
|
|
34
|
-
vi.spyOn(server, '
|
|
34
|
+
vi.spyOn(server, 'requestPost').mockResolvedValue(mockResponse);
|
|
35
35
|
const response = await server.generateContent({
|
|
36
36
|
model: 'test-model',
|
|
37
37
|
contents: [{ role: 'user', parts: [{ text: 'request' }] }],
|
|
38
38
|
});
|
|
39
|
-
expect(server.
|
|
39
|
+
expect(server.requestPost).toHaveBeenCalledWith('generateContent', expect.any(Object), undefined);
|
|
40
40
|
expect(response.candidates?.[0]?.content?.parts?.[0]?.text).toBe('response');
|
|
41
41
|
});
|
|
42
42
|
it('should call the generateContentStream endpoint', async () => {
|
|
43
|
-
const
|
|
44
|
-
const server = new CodeAssistServer(
|
|
43
|
+
const client = new OAuth2Client();
|
|
44
|
+
const server = new CodeAssistServer(client, 'test-project');
|
|
45
45
|
const mockResponse = (async function* () {
|
|
46
46
|
yield {
|
|
47
47
|
response: {
|
|
@@ -59,52 +59,52 @@ describe('CodeAssistServer', () => {
|
|
|
59
59
|
},
|
|
60
60
|
};
|
|
61
61
|
})();
|
|
62
|
-
vi.spyOn(server, '
|
|
62
|
+
vi.spyOn(server, 'requestStreamingPost').mockResolvedValue(mockResponse);
|
|
63
63
|
const stream = await server.generateContentStream({
|
|
64
64
|
model: 'test-model',
|
|
65
65
|
contents: [{ role: 'user', parts: [{ text: 'request' }] }],
|
|
66
66
|
});
|
|
67
67
|
for await (const res of stream) {
|
|
68
|
-
expect(server.
|
|
68
|
+
expect(server.requestStreamingPost).toHaveBeenCalledWith('streamGenerateContent', expect.any(Object), undefined);
|
|
69
69
|
expect(res.candidates?.[0]?.content?.parts?.[0]?.text).toBe('response');
|
|
70
70
|
}
|
|
71
71
|
});
|
|
72
72
|
it('should call the onboardUser endpoint', async () => {
|
|
73
|
-
const
|
|
74
|
-
const server = new CodeAssistServer(
|
|
73
|
+
const client = new OAuth2Client();
|
|
74
|
+
const server = new CodeAssistServer(client, 'test-project');
|
|
75
75
|
const mockResponse = {
|
|
76
76
|
name: 'operations/123',
|
|
77
77
|
done: true,
|
|
78
78
|
};
|
|
79
|
-
vi.spyOn(server, '
|
|
79
|
+
vi.spyOn(server, 'requestPost').mockResolvedValue(mockResponse);
|
|
80
80
|
const response = await server.onboardUser({
|
|
81
81
|
tierId: 'test-tier',
|
|
82
82
|
cloudaicompanionProject: 'test-project',
|
|
83
83
|
metadata: {},
|
|
84
84
|
});
|
|
85
|
-
expect(server.
|
|
85
|
+
expect(server.requestPost).toHaveBeenCalledWith('onboardUser', expect.any(Object));
|
|
86
86
|
expect(response.name).toBe('operations/123');
|
|
87
87
|
});
|
|
88
88
|
it('should call the loadCodeAssist endpoint', async () => {
|
|
89
|
-
const
|
|
90
|
-
const server = new CodeAssistServer(
|
|
89
|
+
const client = new OAuth2Client();
|
|
90
|
+
const server = new CodeAssistServer(client, 'test-project');
|
|
91
91
|
const mockResponse = {
|
|
92
92
|
// TODO: Add mock response
|
|
93
93
|
};
|
|
94
|
-
vi.spyOn(server, '
|
|
94
|
+
vi.spyOn(server, 'requestPost').mockResolvedValue(mockResponse);
|
|
95
95
|
const response = await server.loadCodeAssist({
|
|
96
96
|
metadata: {},
|
|
97
97
|
});
|
|
98
|
-
expect(server.
|
|
98
|
+
expect(server.requestPost).toHaveBeenCalledWith('loadCodeAssist', expect.any(Object));
|
|
99
99
|
expect(response).toBe(mockResponse);
|
|
100
100
|
});
|
|
101
101
|
it('should return 0 for countTokens', async () => {
|
|
102
|
-
const
|
|
103
|
-
const server = new CodeAssistServer(
|
|
102
|
+
const client = new OAuth2Client();
|
|
103
|
+
const server = new CodeAssistServer(client, 'test-project');
|
|
104
104
|
const mockResponse = {
|
|
105
105
|
totalTokens: 100,
|
|
106
106
|
};
|
|
107
|
-
vi.spyOn(server, '
|
|
107
|
+
vi.spyOn(server, 'requestPost').mockResolvedValue(mockResponse);
|
|
108
108
|
const response = await server.countTokens({
|
|
109
109
|
model: 'test-model',
|
|
110
110
|
contents: [{ role: 'user', parts: [{ text: 'request' }] }],
|
|
@@ -112,8 +112,8 @@ describe('CodeAssistServer', () => {
|
|
|
112
112
|
expect(response.totalTokens).toBe(100);
|
|
113
113
|
});
|
|
114
114
|
it('should throw an error for embedContent', async () => {
|
|
115
|
-
const
|
|
116
|
-
const server = new CodeAssistServer(
|
|
115
|
+
const client = new OAuth2Client();
|
|
116
|
+
const server = new CodeAssistServer(client, 'test-project');
|
|
117
117
|
await expect(server.embedContent({
|
|
118
118
|
model: 'test-model',
|
|
119
119
|
contents: [{ role: 'user', parts: [{ text: 'request' }] }],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.test.js","sourceRoot":"","sources":["../../../src/code_assist/server.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;AAE/B,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,
|
|
1
|
+
{"version":3,"file":"server.test.js","sourceRoot":"","sources":["../../../src/code_assist/server.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;AAE/B,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAC5D,MAAM,YAAY,GAAG;YACnB,QAAQ,EAAE;gBACR,UAAU,EAAE;oBACV;wBACE,KAAK,EAAE,CAAC;wBACR,OAAO,EAAE;4BACP,IAAI,EAAE,OAAO;4BACb,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;yBAC9B;wBACD,YAAY,EAAE,MAAM;wBACpB,aAAa,EAAE,EAAE;qBAClB;iBACF;aACF;SACF,CAAC;QACF,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAEhE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;YAC5C,KAAK,EAAE,YAAY;YACnB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;SAC3D,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAC7C,iBAAiB,EACjB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAClB,SAAS,CACV,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAC9D,UAAU,CACX,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAC5D,MAAM,YAAY,GAAG,CAAC,KAAK,SAAS,CAAC;YACnC,MAAM;gBACJ,QAAQ,EAAE;oBACR,UAAU,EAAE;wBACV;4BACE,KAAK,EAAE,CAAC;4BACR,OAAO,EAAE;gCACP,IAAI,EAAE,OAAO;gCACb,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;6BAC9B;4BACD,YAAY,EAAE,MAAM;4BACpB,aAAa,EAAE,EAAE;yBAClB;qBACF;iBACF;aACF,CAAC;QACJ,CAAC,CAAC,EAAE,CAAC;QACL,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAEzE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC;YAChD,KAAK,EAAE,YAAY;YACnB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;SAC3D,CAAC,CAAC;QAEH,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,oBAAoB,CACtD,uBAAuB,EACvB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAClB,SAAS,CACV,CAAC;YACF,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAC5D,MAAM,YAAY,GAAG;YACnB,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,IAAI;SACX,CAAC;QACF,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAEhE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;YACxC,MAAM,EAAE,WAAW;YACnB,uBAAuB,EAAE,cAAc;YACvC,QAAQ,EAAE,EAAE;SACb,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAC7C,aAAa,EACb,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAC5D,MAAM,YAAY,GAAG;QACnB,0BAA0B;SAC3B,CAAC;QACF,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAEhE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC;YAC3C,QAAQ,EAAE,EAAE;SACb,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAC7C,gBAAgB,EAChB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAC5D,MAAM,YAAY,GAAG;YACnB,WAAW,EAAE,GAAG;SACjB,CAAC;QACF,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAEhE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;YACxC,KAAK,EAAE,YAAY;YACnB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;SAC3D,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAC5D,MAAM,MAAM,CACV,MAAM,CAAC,YAAY,CAAC;YAClB,KAAK,EAAE,YAAY;YACnB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;SAC3D,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -12,4 +12,4 @@ export declare class ProjectIdRequiredError extends Error {
|
|
|
12
12
|
* @param projectId the user's project id, if any
|
|
13
13
|
* @returns the user's actual project id
|
|
14
14
|
*/
|
|
15
|
-
export declare function setupUser(
|
|
15
|
+
export declare function setupUser(client: OAuth2Client): Promise<string>;
|
|
@@ -15,9 +15,9 @@ export class ProjectIdRequiredError extends Error {
|
|
|
15
15
|
* @param projectId the user's project id, if any
|
|
16
16
|
* @returns the user's actual project id
|
|
17
17
|
*/
|
|
18
|
-
export async function setupUser(
|
|
18
|
+
export async function setupUser(client) {
|
|
19
19
|
let projectId = process.env.GOOGLE_CLOUD_PROJECT;
|
|
20
|
-
const caServer = new CodeAssistServer(
|
|
20
|
+
const caServer = new CodeAssistServer(client, projectId);
|
|
21
21
|
const clientMetadata = {
|
|
22
22
|
ideType: 'IDE_UNSPECIFIED',
|
|
23
23
|
platform: 'PLATFORM_UNSPECIFIED',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/code_assist/setup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAKL,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C;QACE,KAAK,CACH,wHAAwH,CACzH,CAAC;IACJ,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/code_assist/setup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAKL,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C;QACE,KAAK,CACH,wHAAwH,CACzH,CAAC;IACJ,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAoB;IAClD,IAAI,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEzD,MAAM,cAAc,GAAmB;QACrC,OAAO,EAAE,iBAAiB;QAC1B,QAAQ,EAAE,sBAAsB;QAChC,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,SAAS;KACvB,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC;QAC5C,uBAAuB,EAAE,SAAS;QAClC,QAAQ,EAAE,cAAc;KACzB,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;QAClD,SAAS,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAC9C,CAAC;IAED,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,kCAAkC,IAAI,CAAC,SAAS,EAAE,CAAC;QAC1D,MAAM,IAAI,sBAAsB,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,UAAU,GAAuB;QACrC,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,uBAAuB,EAAE,SAAS;QAClC,QAAQ,EAAE,cAAc;KACzB,CAAC;IAEF,6DAA6D;IAC7D,IAAI,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACpD,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9C,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,EAAE,uBAAuB,EAAE,EAAE,IAAI,EAAE,CAAC;AAC5D,CAAC;AAED,SAAS,cAAc,CAAC,GAA2B;IACjD,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,WAAW,CAAC;IACzB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO;QACL,IAAI,EAAE,EAAE;QACR,WAAW,EAAE,EAAE;QACf,EAAE,EAAE,UAAU,CAAC,MAAM;QACrB,kCAAkC,EAAE,IAAI;KACzC,CAAC;AACJ,CAAC"}
|