opencode-gemini-cli-oauth 1.1.10 → 1.1.11
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/auth/account-manager.d.ts +4 -38
- package/dist/auth/account-manager.d.ts.map +1 -1
- package/dist/auth/account-manager.js +12 -91
- package/dist/auth/account-manager.js.map +1 -1
- package/dist/auth/oauth.d.ts +5 -18
- package/dist/auth/oauth.d.ts.map +1 -1
- package/dist/auth/oauth.js +19 -56
- package/dist/auth/oauth.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/plugin-simple.js +2 -2
- package/dist/plugin-simple.js.map +1 -1
- package/dist/plugin.d.ts +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +15 -16
- package/dist/plugin.js.map +1 -1
- package/package.json +1 -1
- package/dist/auth/request-interceptor.d.ts +0 -18
- package/dist/auth/request-interceptor.d.ts.map +0 -1
- package/dist/auth/request-interceptor.js +0 -94
- package/dist/auth/request-interceptor.js.map +0 -1
|
@@ -3,48 +3,14 @@
|
|
|
3
3
|
* Copyright 2025 Yusuf
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Account manager for multi-account rotation and quota management
|
|
9
|
-
*/
|
|
10
|
-
export declare class AccountManager {
|
|
11
|
-
private oauthManager;
|
|
12
|
-
constructor();
|
|
6
|
+
export declare const accountManager: {
|
|
13
7
|
/**
|
|
14
|
-
* Initialize account pool
|
|
8
|
+
* Initialize account pool
|
|
15
9
|
*/
|
|
16
10
|
initialize(): Promise<void>;
|
|
17
11
|
/**
|
|
18
|
-
* Get
|
|
19
|
-
*/
|
|
20
|
-
getCurrentAccount(): Promise<AccountPoolEntry | null>;
|
|
21
|
-
/**
|
|
22
|
-
* Get access token for current account
|
|
12
|
+
* Get access token
|
|
23
13
|
*/
|
|
24
14
|
getCurrentAccessToken(): Promise<string>;
|
|
25
|
-
|
|
26
|
-
* Rotate to next account in pool
|
|
27
|
-
*/
|
|
28
|
-
rotateAccount(): Promise<AccountPoolEntry | null>;
|
|
29
|
-
/**
|
|
30
|
-
* Mark account as rate limited
|
|
31
|
-
*/
|
|
32
|
-
markAccountRateLimited(email: string, retryAfterSeconds: number): Promise<void>;
|
|
33
|
-
/**
|
|
34
|
-
* Get next available account (skips rate-limited accounts)
|
|
35
|
-
*/
|
|
36
|
-
getNextAvailableAccount(): Promise<AccountPoolEntry | null>;
|
|
37
|
-
/**
|
|
38
|
-
* Increment request count for current account
|
|
39
|
-
*/
|
|
40
|
-
incrementRequestCount(): Promise<void>;
|
|
41
|
-
/**
|
|
42
|
-
* Get account pool statistics
|
|
43
|
-
*/
|
|
44
|
-
getPoolStats(): Promise<{
|
|
45
|
-
totalAccounts: number;
|
|
46
|
-
availableAccounts: number;
|
|
47
|
-
rateLimitedAccounts: number;
|
|
48
|
-
}>;
|
|
49
|
-
}
|
|
15
|
+
};
|
|
50
16
|
//# sourceMappingURL=account-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-manager.d.ts","sourceRoot":"","sources":["../../src/auth/account-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"account-manager.d.ts","sourceRoot":"","sources":["../../src/auth/account-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,eAAO,MAAM,cAAc;IACzB;;OAEG;kBACiB,OAAO,CAAC,IAAI,CAAC;IAwBjC;;OAEG;6BAC4B,OAAO,CAAC,MAAM,CAAC;CA+B/C,CAAC"}
|
|
@@ -4,38 +4,25 @@
|
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
*/
|
|
6
6
|
import { StorageManager } from '../storage/storage.js';
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
* Account manager for multi-account rotation and quota management
|
|
10
|
-
*/
|
|
11
|
-
export class AccountManager {
|
|
12
|
-
oauthManager;
|
|
13
|
-
constructor() {
|
|
14
|
-
this.oauthManager = new OAuthManager();
|
|
15
|
-
}
|
|
7
|
+
import { oauth } from './oauth.js';
|
|
8
|
+
export const accountManager = {
|
|
16
9
|
/**
|
|
17
|
-
* Initialize account pool
|
|
10
|
+
* Initialize account pool
|
|
18
11
|
*/
|
|
19
12
|
async initialize() {
|
|
20
13
|
const credentials = await StorageManager.readOAuthCredentials();
|
|
21
|
-
if (!credentials)
|
|
22
|
-
console.warn('⚠️ No OAuth credentials found. Run: gemini auth login');
|
|
14
|
+
if (!credentials)
|
|
23
15
|
return;
|
|
24
|
-
|
|
25
|
-
// Get user info
|
|
26
|
-
const userInfo = await this.oauthManager.getUserInfo();
|
|
27
|
-
// Check if account already exists in pool
|
|
16
|
+
const userInfo = await oauth.getUserInfo();
|
|
28
17
|
const pool = await StorageManager.readAccountPool();
|
|
29
18
|
const existingAccount = pool.accounts.find((acc) => acc.email === userInfo.email);
|
|
30
19
|
if (existingAccount) {
|
|
31
|
-
// Update existing account
|
|
32
20
|
await StorageManager.updateAccountInPool(userInfo.email, {
|
|
33
21
|
credentials,
|
|
34
22
|
lastUsed: Date.now(),
|
|
35
23
|
});
|
|
36
24
|
}
|
|
37
25
|
else {
|
|
38
|
-
// Add new account
|
|
39
26
|
const newEntry = {
|
|
40
27
|
email: userInfo.email,
|
|
41
28
|
credentials,
|
|
@@ -44,30 +31,21 @@ export class AccountManager {
|
|
|
44
31
|
};
|
|
45
32
|
await StorageManager.upsertAccountInPool(newEntry);
|
|
46
33
|
}
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Get current account from pool
|
|
50
|
-
*/
|
|
51
|
-
async getCurrentAccount() {
|
|
52
|
-
return await StorageManager.getCurrentAccount();
|
|
53
|
-
}
|
|
34
|
+
},
|
|
54
35
|
/**
|
|
55
|
-
* Get access token
|
|
36
|
+
* Get access token
|
|
56
37
|
*/
|
|
57
38
|
async getCurrentAccessToken() {
|
|
58
|
-
const account = await
|
|
39
|
+
const account = await StorageManager.getCurrentAccount();
|
|
59
40
|
if (!account) {
|
|
60
|
-
|
|
61
|
-
return await this.oauthManager.getAccessToken();
|
|
41
|
+
return await oauth.getAccessToken();
|
|
62
42
|
}
|
|
63
|
-
// Check if token needs refresh
|
|
64
43
|
const now = Date.now();
|
|
65
44
|
const expiryTime = account.credentials.expiry_date || 0;
|
|
66
|
-
const needsRefresh = expiryTime - now < 5 * 60 * 1000;
|
|
45
|
+
const needsRefresh = expiryTime - now < 5 * 60 * 1000;
|
|
67
46
|
if (needsRefresh) {
|
|
68
|
-
const refreshResult = await
|
|
47
|
+
const refreshResult = await oauth.refreshAccessToken(account.credentials.refresh_token);
|
|
69
48
|
if (refreshResult.success && refreshResult.accessToken) {
|
|
70
|
-
// Update account credentials in pool
|
|
71
49
|
const updatedCredentials = {
|
|
72
50
|
...account.credentials,
|
|
73
51
|
access_token: refreshResult.accessToken,
|
|
@@ -81,62 +59,5 @@ export class AccountManager {
|
|
|
81
59
|
}
|
|
82
60
|
return account.credentials.access_token;
|
|
83
61
|
}
|
|
84
|
-
|
|
85
|
-
* Rotate to next account in pool
|
|
86
|
-
*/
|
|
87
|
-
async rotateAccount() {
|
|
88
|
-
return await StorageManager.rotateToNextAccount();
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Mark account as rate limited
|
|
92
|
-
*/
|
|
93
|
-
async markAccountRateLimited(email, retryAfterSeconds) {
|
|
94
|
-
const rateLimitUntil = Date.now() + retryAfterSeconds * 1000;
|
|
95
|
-
await StorageManager.updateAccountInPool(email, { rateLimitUntil });
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Get next available account (skips rate-limited accounts)
|
|
99
|
-
*/
|
|
100
|
-
async getNextAvailableAccount() {
|
|
101
|
-
const pool = await StorageManager.readAccountPool();
|
|
102
|
-
const now = Date.now();
|
|
103
|
-
// Find first account that is not rate limited
|
|
104
|
-
for (let i = 0; i < pool.accounts.length; i++) {
|
|
105
|
-
const account = pool.accounts[(pool.currentIndex + i) % pool.accounts.length];
|
|
106
|
-
if (!account.rateLimitUntil || account.rateLimitUntil < now) {
|
|
107
|
-
// Update current index
|
|
108
|
-
pool.currentIndex = (pool.currentIndex + i) % pool.accounts.length;
|
|
109
|
-
await StorageManager.writeAccountPool(pool);
|
|
110
|
-
return account;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
// All accounts are rate limited
|
|
114
|
-
return null;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Increment request count for current account
|
|
118
|
-
*/
|
|
119
|
-
async incrementRequestCount() {
|
|
120
|
-
const account = await this.getCurrentAccount();
|
|
121
|
-
if (account) {
|
|
122
|
-
await StorageManager.updateAccountInPool(account.email, {
|
|
123
|
-
requestCount: account.requestCount + 1,
|
|
124
|
-
lastUsed: Date.now(),
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Get account pool statistics
|
|
130
|
-
*/
|
|
131
|
-
async getPoolStats() {
|
|
132
|
-
const pool = await StorageManager.readAccountPool();
|
|
133
|
-
const now = Date.now();
|
|
134
|
-
const rateLimitedCount = pool.accounts.filter((acc) => acc.rateLimitUntil && acc.rateLimitUntil > now).length;
|
|
135
|
-
return {
|
|
136
|
-
totalAccounts: pool.accounts.length,
|
|
137
|
-
availableAccounts: pool.accounts.length - rateLimitedCount,
|
|
138
|
-
rateLimitedAccounts: rateLimitedCount,
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
}
|
|
62
|
+
};
|
|
142
63
|
//# sourceMappingURL=account-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-manager.js","sourceRoot":"","sources":["../../src/auth/account-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"account-manager.js","sourceRoot":"","sources":["../../src/auth/account-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,oBAAoB,EAAE,CAAC;QAChE,IAAI,CAAC,WAAW;YAAE,OAAO;QAEzB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,eAAe,EAAE,CAAC;QACpD,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC,CAAC;QAElF,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,cAAc,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,EAAE;gBACvD,WAAW;gBACX,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;aACrB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAqB;gBACjC,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,WAAW;gBACX,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;gBACpB,YAAY,EAAE,CAAC;aAChB,CAAC;YACF,MAAM,cAAc,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB;QACzB,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,iBAAiB,EAAE,CAAC;QAEzD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC;QACtC,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,WAAW,IAAI,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,UAAU,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAEtD,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;YAExF,IAAI,aAAa,CAAC,OAAO,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC;gBACvD,MAAM,kBAAkB,GAAqB;oBAC3C,GAAG,OAAO,CAAC,WAAW;oBACtB,YAAY,EAAE,aAAa,CAAC,WAAW;oBACvC,WAAW,EAAE,aAAa,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;iBAClE,CAAC;gBAEF,MAAM,cAAc,CAAC,mBAAmB,CAAC,OAAO,CAAC,KAAK,EAAE;oBACtD,WAAW,EAAE,kBAAkB;iBAChC,CAAC,CAAC;gBAEH,OAAO,aAAa,CAAC,WAAW,CAAC;YACnC,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC;IAC1C,CAAC;CACF,CAAC"}
|
package/dist/auth/oauth.d.ts
CHANGED
|
@@ -3,38 +3,25 @@
|
|
|
3
3
|
* Copyright 2025 Yusuf
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
*/
|
|
6
|
-
import { OAuth2Client } from 'google-auth-library';
|
|
7
6
|
import type { TokenRefreshResult } from '../types.js';
|
|
8
|
-
|
|
9
|
-
* OAuth authentication manager
|
|
10
|
-
*/
|
|
11
|
-
export declare class OAuthManager {
|
|
12
|
-
private client;
|
|
13
|
-
constructor();
|
|
7
|
+
export declare const oauth: {
|
|
14
8
|
/**
|
|
15
9
|
* Get access token from stored credentials
|
|
16
|
-
* Automatically refreshes if expired or near expiry
|
|
17
10
|
*/
|
|
18
11
|
getAccessToken(): Promise<string>;
|
|
19
12
|
/**
|
|
20
|
-
* Refresh access token
|
|
13
|
+
* Refresh access token
|
|
21
14
|
*/
|
|
22
15
|
refreshAccessToken(refreshToken: string, retryCount?: number): Promise<TokenRefreshResult>;
|
|
23
16
|
/**
|
|
24
|
-
* Verify
|
|
17
|
+
* Verify credentials
|
|
25
18
|
*/
|
|
26
19
|
verifyCredentials(): Promise<boolean>;
|
|
27
20
|
/**
|
|
28
|
-
* Get user info
|
|
21
|
+
* Get user info
|
|
29
22
|
*/
|
|
30
23
|
getUserInfo(): Promise<{
|
|
31
24
|
email: string;
|
|
32
|
-
name?: string;
|
|
33
|
-
picture?: string;
|
|
34
25
|
}>;
|
|
35
|
-
|
|
36
|
-
* Create OAuth2Client with credentials
|
|
37
|
-
*/
|
|
38
|
-
createAuthenticatedClient(): Promise<OAuth2Client>;
|
|
39
|
-
}
|
|
26
|
+
};
|
|
40
27
|
//# sourceMappingURL=oauth.d.ts.map
|
package/dist/auth/oauth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,OAAO,KAAK,EAAoB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAOxE,eAAO,MAAM,KAAK;IAChB;;OAEG;sBACqB,OAAO,CAAC,MAAM,CAAC;IA4BvC;;OAEG;qCAEa,MAAM,wBAEnB,OAAO,CAAC,kBAAkB,CAAC;IAkC9B;;OAEG;yBACwB,OAAO,CAAC,OAAO,CAAC;IAU3C;;OAEG;mBACkB,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAKhD,CAAC"}
|
package/dist/auth/oauth.js
CHANGED
|
@@ -6,50 +6,41 @@
|
|
|
6
6
|
import { OAuth2Client } from 'google-auth-library';
|
|
7
7
|
import { OAUTH_CLIENT_ID, OAUTH_CLIENT_SECRET, TOKEN_EXPIRY_BUFFER_MS, MAX_REFRESH_RETRIES, } from '../constants.js';
|
|
8
8
|
import { StorageManager } from '../storage/storage.js';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
constructor() {
|
|
15
|
-
this.client = new OAuth2Client({
|
|
16
|
-
clientId: OAUTH_CLIENT_ID,
|
|
17
|
-
clientSecret: OAUTH_CLIENT_SECRET,
|
|
18
|
-
});
|
|
19
|
-
}
|
|
9
|
+
const client = new OAuth2Client({
|
|
10
|
+
clientId: OAUTH_CLIENT_ID,
|
|
11
|
+
clientSecret: OAUTH_CLIENT_SECRET,
|
|
12
|
+
});
|
|
13
|
+
export const oauth = {
|
|
20
14
|
/**
|
|
21
15
|
* Get access token from stored credentials
|
|
22
|
-
* Automatically refreshes if expired or near expiry
|
|
23
16
|
*/
|
|
24
17
|
async getAccessToken() {
|
|
25
18
|
const credentials = await StorageManager.readOAuthCredentials();
|
|
26
19
|
if (!credentials) {
|
|
27
20
|
throw new Error('No OAuth credentials found. Please authenticate using Gemini CLI: gemini auth login');
|
|
28
21
|
}
|
|
29
|
-
// Check if token needs refresh
|
|
30
22
|
const now = Date.now();
|
|
31
23
|
const expiryTime = credentials.expiry_date || 0;
|
|
32
24
|
const needsRefresh = expiryTime - now < TOKEN_EXPIRY_BUFFER_MS;
|
|
33
25
|
if (needsRefresh) {
|
|
34
26
|
const refreshResult = await this.refreshAccessToken(credentials.refresh_token);
|
|
35
27
|
if (!refreshResult.success) {
|
|
36
|
-
throw new Error(`Failed to refresh access token: ${refreshResult.error}. Please re-authenticate
|
|
28
|
+
throw new Error(`Failed to refresh access token: ${refreshResult.error}. Please re-authenticate`);
|
|
37
29
|
}
|
|
38
30
|
return refreshResult.accessToken;
|
|
39
31
|
}
|
|
40
32
|
return credentials.access_token;
|
|
41
|
-
}
|
|
33
|
+
},
|
|
42
34
|
/**
|
|
43
|
-
* Refresh access token
|
|
35
|
+
* Refresh access token
|
|
44
36
|
*/
|
|
45
37
|
async refreshAccessToken(refreshToken, retryCount = 0) {
|
|
46
38
|
try {
|
|
47
|
-
|
|
48
|
-
const { credentials } = await
|
|
39
|
+
client.setCredentials({ refresh_token: refreshToken });
|
|
40
|
+
const { credentials } = await client.refreshAccessToken();
|
|
49
41
|
if (!credentials.access_token) {
|
|
50
42
|
throw new Error('No access token returned from refresh');
|
|
51
43
|
}
|
|
52
|
-
// Update stored credentials
|
|
53
44
|
const existingCreds = await StorageManager.readOAuthCredentials();
|
|
54
45
|
const updatedCreds = {
|
|
55
46
|
...existingCreds,
|
|
@@ -66,61 +57,33 @@ export class OAuthManager {
|
|
|
66
57
|
}
|
|
67
58
|
catch (error) {
|
|
68
59
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
69
|
-
// Retry on transient errors
|
|
70
60
|
if (retryCount < MAX_REFRESH_RETRIES) {
|
|
71
61
|
await new Promise((resolve) => setTimeout(resolve, 1000 * (retryCount + 1)));
|
|
72
62
|
return this.refreshAccessToken(refreshToken, retryCount + 1);
|
|
73
63
|
}
|
|
74
|
-
return {
|
|
75
|
-
success: false,
|
|
76
|
-
error: errorMessage,
|
|
77
|
-
};
|
|
64
|
+
return { success: false, error: errorMessage };
|
|
78
65
|
}
|
|
79
|
-
}
|
|
66
|
+
},
|
|
80
67
|
/**
|
|
81
|
-
* Verify
|
|
68
|
+
* Verify credentials
|
|
82
69
|
*/
|
|
83
70
|
async verifyCredentials() {
|
|
84
71
|
try {
|
|
85
72
|
const token = await this.getAccessToken();
|
|
86
|
-
const tokenInfo = await
|
|
73
|
+
const tokenInfo = await client.getTokenInfo(token);
|
|
87
74
|
return !!tokenInfo.email;
|
|
88
75
|
}
|
|
89
76
|
catch (error) {
|
|
90
77
|
return false;
|
|
91
78
|
}
|
|
92
|
-
}
|
|
79
|
+
},
|
|
93
80
|
/**
|
|
94
|
-
* Get user info
|
|
81
|
+
* Get user info
|
|
95
82
|
*/
|
|
96
83
|
async getUserInfo() {
|
|
97
84
|
const token = await this.getAccessToken();
|
|
98
|
-
const tokenInfo = await
|
|
99
|
-
return {
|
|
100
|
-
email: tokenInfo.email || 'unknown',
|
|
101
|
-
name: undefined,
|
|
102
|
-
picture: undefined,
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Create OAuth2Client with credentials
|
|
107
|
-
*/
|
|
108
|
-
async createAuthenticatedClient() {
|
|
109
|
-
const credentials = await StorageManager.readOAuthCredentials();
|
|
110
|
-
if (!credentials) {
|
|
111
|
-
throw new Error('No OAuth credentials found');
|
|
112
|
-
}
|
|
113
|
-
const client = new OAuth2Client({
|
|
114
|
-
clientId: OAUTH_CLIENT_ID,
|
|
115
|
-
clientSecret: OAUTH_CLIENT_SECRET,
|
|
116
|
-
});
|
|
117
|
-
client.setCredentials({
|
|
118
|
-
access_token: credentials.access_token,
|
|
119
|
-
refresh_token: credentials.refresh_token,
|
|
120
|
-
expiry_date: credentials.expiry_date,
|
|
121
|
-
token_type: credentials.token_type,
|
|
122
|
-
});
|
|
123
|
-
return client;
|
|
85
|
+
const tokenInfo = await client.getTokenInfo(token);
|
|
86
|
+
return { email: tokenInfo.email || 'unknown' };
|
|
124
87
|
}
|
|
125
|
-
}
|
|
88
|
+
};
|
|
126
89
|
//# sourceMappingURL=oauth.js.map
|
package/dist/auth/oauth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACL,eAAe,EACf,mBAAmB,
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
export { default as GeminiCLIOAuthPlugin, metadata } from './plugin.js';
|
|
12
12
|
export type { OAuthCredentials, GoogleAccount, AccountPoolEntry, AccountPool, PluginConfig, } from './types.js';
|
|
13
|
-
export {
|
|
14
|
-
export {
|
|
13
|
+
export { oauth } from './auth/oauth.js';
|
|
14
|
+
export { accountManager } from './auth/account-manager.js';
|
|
15
15
|
export { StorageManager } from './storage/storage.js';
|
|
16
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AAGH,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGxE,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AAGH,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGxE,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// Named export for OpenCode (following Antigravity pattern)
|
|
12
12
|
export { default as GeminiCLIOAuthPlugin, metadata } from './plugin.js';
|
|
13
13
|
// Export utilities for advanced usage
|
|
14
|
-
export {
|
|
15
|
-
export {
|
|
14
|
+
export { oauth } from './auth/oauth.js';
|
|
15
|
+
export { accountManager } from './auth/account-manager.js';
|
|
16
16
|
export { StorageManager } from './storage/storage.js';
|
|
17
17
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AAEH,4DAA4D;AAC5D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAWxE,sCAAsC;AACtC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AAEH,4DAA4D;AAC5D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAWxE,sCAAsC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/plugin-simple.js
CHANGED
|
@@ -55,7 +55,7 @@ function createAuthFetch() {
|
|
|
55
55
|
// Get OAuth token
|
|
56
56
|
const token = await getAccessToken();
|
|
57
57
|
// Inject Authorization header
|
|
58
|
-
const headers = new Headers(init
|
|
58
|
+
const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);
|
|
59
59
|
headers.set('Authorization', `Bearer ${token}`);
|
|
60
60
|
// Remove API key from URL if present
|
|
61
61
|
const urlObj = new URL(url);
|
|
@@ -97,7 +97,7 @@ export const GeminiCLIOAuthPlugin = async ({ client, directory }) => {
|
|
|
97
97
|
// Get OAuth token
|
|
98
98
|
const token = await getAccessToken();
|
|
99
99
|
// Inject Authorization header
|
|
100
|
-
const headers = new Headers(init
|
|
100
|
+
const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);
|
|
101
101
|
headers.set('Authorization', `Bearer ${token}`);
|
|
102
102
|
// Remove API key from URL if present
|
|
103
103
|
const urlObj = new URL(url);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-simple.js","sourceRoot":"","sources":["../src/plugin-simple.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,eAAe,GAAG,0EAA0E,CAAC;AACnG,MAAM,mBAAmB,GAAG,qCAAqC,CAAC;AAClE,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,0BAA0B,CAAC,CAAC;AAE7E;;GAEG;AACH,KAAK,UAAU,cAAc;IAC3B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAErC,+BAA+B;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,IAAI,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,UAAU,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,eAAe;QAEtE,IAAI,YAAY,IAAI,WAAW,CAAC,aAAa,EAAE,CAAC;YAC9C,gBAAgB;YAChB,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC;YACtE,MAAM,CAAC,cAAc,CAAC,EAAE,aAAa,EAAE,WAAW,CAAC,aAAa,EAAE,CAAC,CAAC;YAEpE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAErE,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;gBAC3B,4BAA4B;gBAC5B,WAAW,CAAC,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC;gBAClD,WAAW,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;gBAC5E,MAAM,EAAE,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAEpF,OAAO,SAAS,CAAC,YAAY,CAAC;YAChC,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC,YAAY,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACvF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,eAAe;IACtB,OAAO,KAAK,WAAW,KAAwB,EAAE,IAAkB;QACjE,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;QAE9F,qCAAqC;QACrC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EAAE,CAAC;YACvD,OAAO,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,kBAAkB;QAClB,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAC;QAErC,8BAA8B;QAC9B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"plugin-simple.js","sourceRoot":"","sources":["../src/plugin-simple.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,eAAe,GAAG,0EAA0E,CAAC;AACnG,MAAM,mBAAmB,GAAG,qCAAqC,CAAC;AAClE,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,0BAA0B,CAAC,CAAC;AAE7E;;GAEG;AACH,KAAK,UAAU,cAAc;IAC3B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAErC,+BAA+B;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,IAAI,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,UAAU,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,eAAe;QAEtE,IAAI,YAAY,IAAI,WAAW,CAAC,aAAa,EAAE,CAAC;YAC9C,gBAAgB;YAChB,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC;YACtE,MAAM,CAAC,cAAc,CAAC,EAAE,aAAa,EAAE,WAAW,CAAC,aAAa,EAAE,CAAC,CAAC;YAEpE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAErE,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;gBAC3B,4BAA4B;gBAC5B,WAAW,CAAC,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC;gBAClD,WAAW,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;gBAC5E,MAAM,EAAE,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAEpF,OAAO,SAAS,CAAC,YAAY,CAAC;YAChC,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC,YAAY,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACvF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,eAAe;IACtB,OAAO,KAAK,WAAW,KAAwB,EAAE,IAAkB;QACjE,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;QAE9F,qCAAqC;QACrC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EAAE,CAAC;YACvD,OAAO,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,kBAAkB;QAClB,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAC;QAErC,8BAA8B;QAC9B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC;QAEhD,qCAAqC;QACrC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAElC,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAO,EAAE,EAAE;IACvE,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IAErD,2BAA2B;IAC3B,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACnE,CAAC;IAED,OAAO;QACL,IAAI,EAAE;YACJ,QAAQ,EAAE,kBAAkB;YAC5B,MAAM,EAAE,KAAK,EAAE,OAAY,EAAE,QAAgB,EAAE,EAAE;gBAC/C,kCAAkC;gBAClC,IAAI,QAAQ,KAAK,kBAAkB,EAAE,CAAC;oBACpC,OAAO,EAAE,CAAC;gBACZ,CAAC;gBAED,OAAO,CAAC,GAAG,CAAC,4CAA4C,QAAQ,EAAE,CAAC,CAAC;gBAEpE,qEAAqE;gBACrE,OAAO;oBACL,MAAM,EAAE,EAAE;oBACV,KAAK,CAAC,KAAK,CAAC,KAAwB,EAAE,IAAkB;wBACtD,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;wBAE9F,uCAAuC;wBACvC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EAAE,CAAC;4BACvD,OAAO,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;wBAC5B,CAAC;wBAED,kBAAkB;wBAClB,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAC;wBAErC,8BAA8B;wBAC9B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAC,CAAC;wBAC3C,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC;wBAEhD,qCAAqC;wBACrC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;wBAC5B,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wBAElC,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBACxD,CAAC;iBACF,CAAC;YACJ,CAAC;SACF;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,2BAA2B;IACjC,OAAO,EAAE,kBAAkB;IAC3B,WAAW,EAAE,oCAAoC;CAClD,CAAC"}
|
package/dist/plugin.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ export default function GeminiCLIOAuthPlugin({ client, directory }: PluginContex
|
|
|
18
18
|
fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
|
|
19
19
|
}>;
|
|
20
20
|
/**
|
|
21
|
-
* Auth methods
|
|
21
|
+
* Auth methods
|
|
22
22
|
*/
|
|
23
23
|
methods: {
|
|
24
24
|
label: string;
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,YAAY,CAAC;AAK5D;;GAEG;AACH,wBAA8B,oBAAoB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,aAAa;;;QAOjF;;WAEG;0BACqB,GAAG,YAAY,MAAM;;yBAKtB,WAAW,GAAG,GAAG,SAAS,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;;QAgChF;;WAEG;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,YAAY,CAAC;AAK5D;;GAEG;AACH,wBAA8B,oBAAoB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,aAAa;;;QAOjF;;WAEG;0BACqB,GAAG,YAAY,MAAM;;yBAKtB,WAAW,GAAG,GAAG,SAAS,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;;QAgChF;;WAEG;;;;;;;;;;;;;;;;;;;;GA6BR;AAED,eAAO,MAAM,QAAQ;;;;;;;;CAQpB,CAAC"}
|
package/dist/plugin.js
CHANGED
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
* Copyright 2025 Yusuf
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
7
|
-
//
|
|
8
|
-
const oauthManager = new OAuthManager();
|
|
6
|
+
import { oauth } from './auth/oauth.js';
|
|
7
|
+
// No instantiation needed
|
|
8
|
+
// const oauthManager = new OAuthManager();
|
|
9
9
|
/**
|
|
10
10
|
* OpenCode Plugin for Gemini CLI OAuth Authentication
|
|
11
11
|
*/
|
|
12
12
|
export default async function GeminiCLIOAuthPlugin({ client, directory }) {
|
|
13
|
-
console.log('🚀 Loading Gemini CLI OAuth plugin (v1.1.
|
|
13
|
+
console.log('🚀 Loading Gemini CLI OAuth plugin (v1.1.11)...');
|
|
14
14
|
return {
|
|
15
15
|
auth: {
|
|
16
16
|
provider: 'gemini-cli-oauth',
|
|
@@ -20,7 +20,7 @@ export default async function GeminiCLIOAuthPlugin({ client, directory }) {
|
|
|
20
20
|
loader: async (getAuth, provider) => {
|
|
21
21
|
return {
|
|
22
22
|
apiKey: 'gemini-cli-oauth-placeholder',
|
|
23
|
-
// Inline fetch definition
|
|
23
|
+
// Inline fetch definition
|
|
24
24
|
async fetch(input, init) {
|
|
25
25
|
const urlStr = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
|
|
26
26
|
// Only intercept Gemini API requests
|
|
@@ -28,12 +28,12 @@ export default async function GeminiCLIOAuthPlugin({ client, directory }) {
|
|
|
28
28
|
return fetch(input, init);
|
|
29
29
|
}
|
|
30
30
|
try {
|
|
31
|
-
// Get OAuth token
|
|
32
|
-
const token = await
|
|
31
|
+
// Get OAuth token using functional module
|
|
32
|
+
const token = await oauth.getAccessToken();
|
|
33
33
|
// Inject Authorization header
|
|
34
|
-
const headers = new Headers(init
|
|
34
|
+
const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);
|
|
35
35
|
headers.set('Authorization', `Bearer ${token}`);
|
|
36
|
-
// Remove API key from URL if present
|
|
36
|
+
// Remove API key from URL if present
|
|
37
37
|
const urlObj = new URL(urlStr);
|
|
38
38
|
urlObj.searchParams.delete('key');
|
|
39
39
|
return fetch(urlObj.toString(), {
|
|
@@ -49,7 +49,7 @@ export default async function GeminiCLIOAuthPlugin({ client, directory }) {
|
|
|
49
49
|
};
|
|
50
50
|
},
|
|
51
51
|
/**
|
|
52
|
-
* Auth methods
|
|
52
|
+
* Auth methods
|
|
53
53
|
*/
|
|
54
54
|
methods: [
|
|
55
55
|
{
|
|
@@ -58,20 +58,19 @@ export default async function GeminiCLIOAuthPlugin({ client, directory }) {
|
|
|
58
58
|
authorize: async () => {
|
|
59
59
|
return {
|
|
60
60
|
url: "",
|
|
61
|
-
instructions: "Please run 'opencode-gemini-setup' in your terminal
|
|
61
|
+
instructions: "Please run 'opencode-gemini-setup' in your terminal.",
|
|
62
62
|
method: "auto",
|
|
63
63
|
callback: async () => {
|
|
64
|
-
// Check if credentials exist
|
|
65
64
|
try {
|
|
66
|
-
const valid = await
|
|
65
|
+
const valid = await oauth.verifyCredentials();
|
|
67
66
|
if (valid) {
|
|
68
|
-
return { type: "success", email: (await
|
|
67
|
+
return { type: "success", email: (await oauth.getUserInfo()).email };
|
|
69
68
|
}
|
|
70
69
|
}
|
|
71
|
-
catch { }
|
|
70
|
+
catch (_a) { }
|
|
72
71
|
return {
|
|
73
72
|
type: "failed",
|
|
74
|
-
error: "Authentication failed
|
|
73
|
+
error: "Authentication failed. Run 'opencode-gemini-setup'."
|
|
75
74
|
};
|
|
76
75
|
}
|
|
77
76
|
};
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Yusuf
|
|
4
|
-
* SPDX-License-Identifier: MIT
|
|
5
|
-
*/
|
|
6
|
-
import { AccountManager } from '../auth/account-manager.js';
|
|
7
|
-
/**
|
|
8
|
-
* Create authenticated fetch function with OAuth token injection
|
|
9
|
-
*/
|
|
10
|
-
export declare function createAuthenticatedFetch(accountManager: AccountManager): typeof fetch;
|
|
11
|
-
/**
|
|
12
|
-
* Create request interceptor for OpenCode plugin
|
|
13
|
-
*/
|
|
14
|
-
export declare function createRequestInterceptor(): Promise<{
|
|
15
|
-
fetch: typeof fetch;
|
|
16
|
-
accountManager: AccountManager;
|
|
17
|
-
}>;
|
|
18
|
-
//# sourceMappingURL=request-interceptor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request-interceptor.d.ts","sourceRoot":"","sources":["../../src/auth/request-interceptor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AA0B5D;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,KAAK,CA6DrF;AAED;;GAEG;AACH,wBAAsB,wBAAwB;;;GAkB7C"}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Yusuf
|
|
4
|
-
* SPDX-License-Identifier: MIT
|
|
5
|
-
*/
|
|
6
|
-
import { RATE_LIMIT_RETRY_DELAY_MS } from '../constants.js';
|
|
7
|
-
/**
|
|
8
|
-
* Check if request is for Gemini API
|
|
9
|
-
*/
|
|
10
|
-
function isGeminiAPIRequest(input) {
|
|
11
|
-
const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
|
|
12
|
-
return url.includes('generativelanguage.googleapis.com');
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Parse retry-after header from rate limit response
|
|
16
|
-
*/
|
|
17
|
-
function parseRetryAfter(response) {
|
|
18
|
-
const retryAfter = response.headers.get('retry-after');
|
|
19
|
-
if (retryAfter) {
|
|
20
|
-
const seconds = parseInt(retryAfter, 10);
|
|
21
|
-
if (!isNaN(seconds)) {
|
|
22
|
-
return seconds;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
// Default to 60 seconds if not specified
|
|
26
|
-
return 60;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Create authenticated fetch function with OAuth token injection
|
|
30
|
-
*/
|
|
31
|
-
export function createAuthenticatedFetch(accountManager) {
|
|
32
|
-
return async function authenticatedFetch(input, init) {
|
|
33
|
-
// Pass through non-Gemini API requests
|
|
34
|
-
if (!isGeminiAPIRequest(input)) {
|
|
35
|
-
return fetch(input, init);
|
|
36
|
-
}
|
|
37
|
-
// Get current access token
|
|
38
|
-
const accessToken = await accountManager.getCurrentAccessToken();
|
|
39
|
-
// Inject Authorization header
|
|
40
|
-
const headers = new Headers(init?.headers);
|
|
41
|
-
headers.set('Authorization', `Bearer ${accessToken}`);
|
|
42
|
-
// Remove API key from URL if present (OAuth doesn't need it)
|
|
43
|
-
const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
|
|
44
|
-
const urlObj = new URL(url);
|
|
45
|
-
urlObj.searchParams.delete('key');
|
|
46
|
-
// Make request
|
|
47
|
-
const response = await fetch(urlObj.toString(), {
|
|
48
|
-
...init,
|
|
49
|
-
headers,
|
|
50
|
-
});
|
|
51
|
-
// Handle rate limiting (429)
|
|
52
|
-
if (response.status === 429) {
|
|
53
|
-
const currentAccount = await accountManager.getCurrentAccount();
|
|
54
|
-
if (currentAccount) {
|
|
55
|
-
const retryAfterSeconds = parseRetryAfter(response);
|
|
56
|
-
console.warn(`⚠️ Rate limit hit for ${currentAccount.email}. Retry after ${retryAfterSeconds}s`);
|
|
57
|
-
// Mark account as rate limited
|
|
58
|
-
await accountManager.markAccountRateLimited(currentAccount.email, retryAfterSeconds);
|
|
59
|
-
// Try to get next available account
|
|
60
|
-
const nextAccount = await accountManager.getNextAvailableAccount();
|
|
61
|
-
if (nextAccount) {
|
|
62
|
-
console.log(`🔄 Switching to account: ${nextAccount.email}`);
|
|
63
|
-
// Retry request with new account
|
|
64
|
-
await new Promise((resolve) => setTimeout(resolve, RATE_LIMIT_RETRY_DELAY_MS));
|
|
65
|
-
return authenticatedFetch(input, init);
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
console.error('❌ All accounts are rate limited. Please wait or add more accounts.');
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
// Increment request count
|
|
73
|
-
await accountManager.incrementRequestCount();
|
|
74
|
-
return response;
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Create request interceptor for OpenCode plugin
|
|
79
|
-
*/
|
|
80
|
-
export async function createRequestInterceptor() {
|
|
81
|
-
// Lazy load to avoid constructor issues
|
|
82
|
-
const { AccountManager: AM } = await import('./account-manager.js');
|
|
83
|
-
const accountManager = new AM();
|
|
84
|
-
// Initialize account pool from Gemini CLI credentials
|
|
85
|
-
await accountManager.initialize();
|
|
86
|
-
// Get pool stats
|
|
87
|
-
const stats = await accountManager.getPoolStats();
|
|
88
|
-
console.log(`🔐 Gemini CLI OAuth: ${stats.availableAccounts}/${stats.totalAccounts} accounts available`);
|
|
89
|
-
return {
|
|
90
|
-
fetch: createAuthenticatedFetch(accountManager),
|
|
91
|
-
accountManager,
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
//# sourceMappingURL=request-interceptor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request-interceptor.js","sourceRoot":"","sources":["../../src/auth/request-interceptor.ts"],"names":[],"mappings":"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"}
|