opencode-antigravity-auth 1.0.7 → 1.1.0
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 +29 -7
- package/dist/src/plugin/accounts.d.ts +37 -0
- package/dist/src/plugin/accounts.d.ts.map +1 -0
- package/dist/src/plugin/accounts.js +190 -0
- package/dist/src/plugin/accounts.js.map +1 -0
- package/dist/src/plugin/accounts.test.d.ts +2 -0
- package/dist/src/plugin/accounts.test.d.ts.map +1 -0
- package/dist/src/plugin/accounts.test.js +139 -0
- package/dist/src/plugin/accounts.test.js.map +1 -0
- package/dist/src/plugin/cli.d.ts +4 -0
- package/dist/src/plugin/cli.d.ts.map +1 -1
- package/dist/src/plugin/cli.js +14 -0
- package/dist/src/plugin/cli.js.map +1 -1
- package/dist/src/plugin/project.d.ts +2 -2
- package/dist/src/plugin/project.d.ts.map +1 -1
- package/dist/src/plugin/project.js +1 -5
- package/dist/src/plugin/project.js.map +1 -1
- package/dist/src/plugin/storage.d.ts +24 -0
- package/dist/src/plugin/storage.d.ts.map +1 -0
- package/dist/src/plugin/storage.js +47 -0
- package/dist/src/plugin/storage.js.map +1 -0
- package/dist/src/plugin/token.d.ts +13 -0
- package/dist/src/plugin/token.d.ts.map +1 -1
- package/dist/src/plugin/token.js +29 -30
- package/dist/src/plugin/token.js.map +1 -1
- package/dist/src/plugin/token.test.js +19 -11
- package/dist/src/plugin/token.test.js.map +1 -1
- package/dist/src/plugin/types.d.ts +30 -6
- package/dist/src/plugin/types.d.ts.map +1 -1
- package/dist/src/plugin.d.ts.map +1 -1
- package/dist/src/plugin.js +449 -124
- package/dist/src/plugin.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,10 +6,12 @@ Enable Opencode to authenticate against **Antigravity** (Google's IDE) via OAuth
|
|
|
6
6
|
|
|
7
7
|
## What you get
|
|
8
8
|
|
|
9
|
-
- **Google OAuth sign-in** with automatic token refresh
|
|
9
|
+
- **Google OAuth sign-in** (multi-account via `opencode auth login`) with automatic token refresh
|
|
10
|
+
- **Multi-account load balancing** Automatically cycle through multiple Google accounts to maximize rate limits
|
|
11
|
+
- **Automatic endpoint fallback** between Antigravity API endpoints (daily → autopush → prod)
|
|
10
12
|
- **Antigravity API compatibility** for OpenAI-style requests
|
|
11
13
|
- **Debug logging** for requests and responses
|
|
12
|
-
- **Drop-in setup
|
|
14
|
+
- **Drop-in setup** Opencode auto-installs the plugin from config
|
|
13
15
|
|
|
14
16
|
## Quick start
|
|
15
17
|
|
|
@@ -17,15 +19,17 @@ Enable Opencode to authenticate against **Antigravity** (Google's IDE) via OAuth
|
|
|
17
19
|
|
|
18
20
|
```json
|
|
19
21
|
{
|
|
20
|
-
"plugin": ["opencode-antigravity-auth@1.0
|
|
22
|
+
"plugin": ["opencode-antigravity-auth@1.1.0"]
|
|
21
23
|
}
|
|
22
24
|
```
|
|
23
25
|
|
|
24
26
|
2) **Authenticate**
|
|
25
27
|
|
|
26
|
-
-
|
|
28
|
+
- For multi-account + per-account project IDs (recommended): run `opencode auth login`.
|
|
29
|
+
- For a quick single-account connect: open `opencode` and run `/connect`.
|
|
27
30
|
- Choose Google → **OAuth with Google (Antigravity)**.
|
|
28
|
-
- Sign in via the browser and return to Opencode. If the browser doesn’t open, use the
|
|
31
|
+
- Sign in via the browser and return to Opencode. If the browser doesn’t open, use the displayed link.
|
|
32
|
+
- `opencode auth login` will ask for a project ID for each account, and after each sign-in you can add another account (up to 10).
|
|
29
33
|
|
|
30
34
|
3) **Declare the models you want**
|
|
31
35
|
|
|
@@ -90,6 +94,14 @@ Add Antigravity models under the `provider.google.models` section of your config
|
|
|
90
94
|
opencode run "Hello world" --model=google/gemini-3-pro-high
|
|
91
95
|
```
|
|
92
96
|
|
|
97
|
+
## Multi-account load balancing
|
|
98
|
+
|
|
99
|
+
- Account pool is stored in `~/.config/opencode/antigravity-accounts.json` (or `%APPDATA%/opencode/antigravity-accounts.json` on Windows).
|
|
100
|
+
- This file contains OAuth refresh tokens; treat it like a password and don’t share/commit it.
|
|
101
|
+
- TUI `/connect` only supports single-account sign-in (no per-account project ID prompts). Use `opencode auth login` to add multiple accounts or set per-account project IDs.
|
|
102
|
+
- Each request picks the next account round-robin; on HTTP `429` the account is cooled down and the request retries with the next account.
|
|
103
|
+
- If Google revokes a refresh token (`invalid_grant`), that account is removed from the pool; rerun `opencode auth login` to add it back.
|
|
104
|
+
|
|
93
105
|
## Debugging
|
|
94
106
|
|
|
95
107
|
Enable verbose logging:
|
|
@@ -139,5 +151,15 @@ Use at your own risk. Proceed only if you understand and accept these risks.
|
|
|
139
151
|
|
|
140
152
|
## Credits
|
|
141
153
|
|
|
142
|
-
|
|
143
|
-
|
|
154
|
+
Built with help and inspiration from:
|
|
155
|
+
|
|
156
|
+
- [opencode-gemini-auth](https://github.com/jenslys/opencode-gemini-auth) — Gemini OAuth groundwork by [@jenslys](https://github.com/jenslys)
|
|
157
|
+
- [CLIProxyAPI](https://github.com/router-for-me/CLIProxyAPI) — Helpful reference for Antigravity API
|
|
158
|
+
|
|
159
|
+
## Support
|
|
160
|
+
|
|
161
|
+
If this plugin helps you, consider supporting its continued maintenance:
|
|
162
|
+
|
|
163
|
+
[](https://ko-fi.com/S6S81QBOIR)
|
|
164
|
+
|
|
165
|
+
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type AccountStorage } from "./storage";
|
|
2
|
+
import type { OAuthAuthDetails, RefreshParts } from "./types";
|
|
3
|
+
export interface ManagedAccount {
|
|
4
|
+
index: number;
|
|
5
|
+
email?: string;
|
|
6
|
+
addedAt: number;
|
|
7
|
+
lastUsed: number;
|
|
8
|
+
parts: RefreshParts;
|
|
9
|
+
access?: string;
|
|
10
|
+
expires?: number;
|
|
11
|
+
isRateLimited: boolean;
|
|
12
|
+
rateLimitResetTime: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* In-memory multi-account manager for round-robin routing.
|
|
16
|
+
*
|
|
17
|
+
* Source of truth for the pool is `antigravity-accounts.json`.
|
|
18
|
+
*/
|
|
19
|
+
export declare class AccountManager {
|
|
20
|
+
private accounts;
|
|
21
|
+
private cursor;
|
|
22
|
+
static loadFromDisk(authFallback?: OAuthAuthDetails): Promise<AccountManager>;
|
|
23
|
+
constructor(authFallback?: OAuthAuthDetails, stored?: AccountStorage | null);
|
|
24
|
+
getAccountCount(): number;
|
|
25
|
+
getAccountsSnapshot(): ManagedAccount[];
|
|
26
|
+
/**
|
|
27
|
+
* Picks the next available account (round-robin), skipping accounts in cooldown.
|
|
28
|
+
*/
|
|
29
|
+
pickNext(): ManagedAccount | null;
|
|
30
|
+
markRateLimited(account: ManagedAccount, retryAfterMs: number): void;
|
|
31
|
+
removeAccount(account: ManagedAccount): boolean;
|
|
32
|
+
updateFromAuth(account: ManagedAccount, auth: OAuthAuthDetails): void;
|
|
33
|
+
toAuthDetails(account: ManagedAccount): OAuthAuthDetails;
|
|
34
|
+
getMinWaitTimeMs(): number;
|
|
35
|
+
saveToDisk(): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=accounts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../src/plugin/accounts.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE9D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAaD;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,MAAM,CAAK;WAEN,YAAY,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;gBAKvE,YAAY,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI;IAuE3E,eAAe,IAAI,MAAM;IAIzB,mBAAmB,IAAI,cAAc,EAAE;IAIvC;;OAEG;IACH,QAAQ,IAAI,cAAc,GAAG,IAAI;IAiCjC,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAMpE,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO;IAwB/C,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAOrE,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,gBAAgB;IASxD,gBAAgB,IAAI,MAAM;IAgBpB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAkBlC"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { formatRefreshParts, parseRefreshParts } from "./auth";
|
|
2
|
+
import { loadAccounts, saveAccounts } from "./storage";
|
|
3
|
+
function nowMs() {
|
|
4
|
+
return Date.now();
|
|
5
|
+
}
|
|
6
|
+
function clampNonNegativeInt(value, fallback) {
|
|
7
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
8
|
+
return fallback;
|
|
9
|
+
}
|
|
10
|
+
return value < 0 ? 0 : Math.floor(value);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* In-memory multi-account manager for round-robin routing.
|
|
14
|
+
*
|
|
15
|
+
* Source of truth for the pool is `antigravity-accounts.json`.
|
|
16
|
+
*/
|
|
17
|
+
export class AccountManager {
|
|
18
|
+
accounts = [];
|
|
19
|
+
cursor = 0;
|
|
20
|
+
static async loadFromDisk(authFallback) {
|
|
21
|
+
const stored = await loadAccounts();
|
|
22
|
+
return new AccountManager(authFallback, stored);
|
|
23
|
+
}
|
|
24
|
+
constructor(authFallback, stored) {
|
|
25
|
+
const authParts = authFallback ? parseRefreshParts(authFallback.refresh) : null;
|
|
26
|
+
if (stored && stored.accounts.length === 0) {
|
|
27
|
+
this.accounts = [];
|
|
28
|
+
this.cursor = 0;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (stored && stored.accounts.length > 0) {
|
|
32
|
+
const baseNow = nowMs();
|
|
33
|
+
this.accounts = stored.accounts
|
|
34
|
+
.map((acc, index) => {
|
|
35
|
+
if (!acc.refreshToken || typeof acc.refreshToken !== "string") {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const matchesFallback = !!(authFallback &&
|
|
39
|
+
authParts &&
|
|
40
|
+
authParts.refreshToken &&
|
|
41
|
+
acc.refreshToken === authParts.refreshToken);
|
|
42
|
+
return {
|
|
43
|
+
index,
|
|
44
|
+
email: acc.email,
|
|
45
|
+
addedAt: clampNonNegativeInt(acc.addedAt, baseNow),
|
|
46
|
+
lastUsed: clampNonNegativeInt(acc.lastUsed, 0),
|
|
47
|
+
parts: {
|
|
48
|
+
refreshToken: acc.refreshToken,
|
|
49
|
+
projectId: acc.projectId,
|
|
50
|
+
managedProjectId: acc.managedProjectId,
|
|
51
|
+
},
|
|
52
|
+
access: matchesFallback ? authFallback?.access : undefined,
|
|
53
|
+
expires: matchesFallback ? authFallback?.expires : undefined,
|
|
54
|
+
isRateLimited: !!acc.isRateLimited,
|
|
55
|
+
rateLimitResetTime: clampNonNegativeInt(acc.rateLimitResetTime, 0),
|
|
56
|
+
};
|
|
57
|
+
})
|
|
58
|
+
.filter((a) => a !== null);
|
|
59
|
+
this.cursor = clampNonNegativeInt(stored.activeIndex, 0);
|
|
60
|
+
if (this.accounts.length > 0) {
|
|
61
|
+
this.cursor = this.cursor % this.accounts.length;
|
|
62
|
+
}
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (authFallback) {
|
|
66
|
+
const parts = parseRefreshParts(authFallback.refresh);
|
|
67
|
+
if (parts.refreshToken) {
|
|
68
|
+
const now = nowMs();
|
|
69
|
+
this.accounts = [
|
|
70
|
+
{
|
|
71
|
+
index: 0,
|
|
72
|
+
email: undefined,
|
|
73
|
+
addedAt: now,
|
|
74
|
+
lastUsed: 0,
|
|
75
|
+
parts,
|
|
76
|
+
access: authFallback.access,
|
|
77
|
+
expires: authFallback.expires,
|
|
78
|
+
isRateLimited: false,
|
|
79
|
+
rateLimitResetTime: 0,
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
this.cursor = 0;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
getAccountCount() {
|
|
87
|
+
return this.accounts.length;
|
|
88
|
+
}
|
|
89
|
+
getAccountsSnapshot() {
|
|
90
|
+
return this.accounts.map((a) => ({ ...a, parts: { ...a.parts } }));
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Picks the next available account (round-robin), skipping accounts in cooldown.
|
|
94
|
+
*/
|
|
95
|
+
pickNext() {
|
|
96
|
+
const total = this.accounts.length;
|
|
97
|
+
if (total === 0) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const now = nowMs();
|
|
101
|
+
// Clear expired cooldowns.
|
|
102
|
+
for (const acc of this.accounts) {
|
|
103
|
+
if (acc.isRateLimited && acc.rateLimitResetTime > 0 && now > acc.rateLimitResetTime) {
|
|
104
|
+
acc.isRateLimited = false;
|
|
105
|
+
acc.rateLimitResetTime = 0;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
for (let i = 0; i < total; i++) {
|
|
109
|
+
const idx = (this.cursor + i) % total;
|
|
110
|
+
const candidate = this.accounts[idx];
|
|
111
|
+
if (!candidate) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (candidate.isRateLimited) {
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
this.cursor = (idx + 1) % total;
|
|
118
|
+
candidate.lastUsed = now;
|
|
119
|
+
return candidate;
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
markRateLimited(account, retryAfterMs) {
|
|
124
|
+
const duration = clampNonNegativeInt(retryAfterMs, 0);
|
|
125
|
+
account.isRateLimited = true;
|
|
126
|
+
account.rateLimitResetTime = nowMs() + duration;
|
|
127
|
+
}
|
|
128
|
+
removeAccount(account) {
|
|
129
|
+
const idx = this.accounts.indexOf(account);
|
|
130
|
+
if (idx < 0) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
this.accounts.splice(idx, 1);
|
|
134
|
+
this.accounts.forEach((acc, index) => {
|
|
135
|
+
acc.index = index;
|
|
136
|
+
});
|
|
137
|
+
if (this.accounts.length === 0) {
|
|
138
|
+
this.cursor = 0;
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
if (this.cursor > idx) {
|
|
142
|
+
this.cursor -= 1;
|
|
143
|
+
}
|
|
144
|
+
this.cursor = this.cursor % this.accounts.length;
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
updateFromAuth(account, auth) {
|
|
148
|
+
const parts = parseRefreshParts(auth.refresh);
|
|
149
|
+
account.parts = parts;
|
|
150
|
+
account.access = auth.access;
|
|
151
|
+
account.expires = auth.expires;
|
|
152
|
+
}
|
|
153
|
+
toAuthDetails(account) {
|
|
154
|
+
return {
|
|
155
|
+
type: "oauth",
|
|
156
|
+
refresh: formatRefreshParts(account.parts),
|
|
157
|
+
access: account.access,
|
|
158
|
+
expires: account.expires,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
getMinWaitTimeMs() {
|
|
162
|
+
const now = nowMs();
|
|
163
|
+
const available = this.accounts.some((a) => !a.isRateLimited || (a.rateLimitResetTime > 0 && now > a.rateLimitResetTime));
|
|
164
|
+
if (available) {
|
|
165
|
+
return 0;
|
|
166
|
+
}
|
|
167
|
+
const waits = this.accounts
|
|
168
|
+
.filter((a) => a.isRateLimited && a.rateLimitResetTime > 0)
|
|
169
|
+
.map((a) => Math.max(0, a.rateLimitResetTime - now));
|
|
170
|
+
return waits.length > 0 ? Math.min(...waits) : 0;
|
|
171
|
+
}
|
|
172
|
+
async saveToDisk() {
|
|
173
|
+
const storage = {
|
|
174
|
+
version: 1,
|
|
175
|
+
accounts: this.accounts.map((a) => ({
|
|
176
|
+
email: a.email,
|
|
177
|
+
refreshToken: a.parts.refreshToken,
|
|
178
|
+
projectId: a.parts.projectId,
|
|
179
|
+
managedProjectId: a.parts.managedProjectId,
|
|
180
|
+
addedAt: a.addedAt,
|
|
181
|
+
lastUsed: a.lastUsed,
|
|
182
|
+
isRateLimited: a.isRateLimited,
|
|
183
|
+
rateLimitResetTime: a.rateLimitResetTime,
|
|
184
|
+
})),
|
|
185
|
+
activeIndex: this.cursor,
|
|
186
|
+
};
|
|
187
|
+
await saveAccounts(storage);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/plugin/accounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.test.d.ts","sourceRoot":"","sources":["../../../src/plugin/accounts.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { AccountManager } from "./accounts";
|
|
3
|
+
describe("AccountManager", () => {
|
|
4
|
+
beforeEach(() => {
|
|
5
|
+
vi.useRealTimers();
|
|
6
|
+
});
|
|
7
|
+
it("treats on-disk storage as source of truth, even when empty", () => {
|
|
8
|
+
const fallback = {
|
|
9
|
+
type: "oauth",
|
|
10
|
+
refresh: "r1|p1",
|
|
11
|
+
access: "access",
|
|
12
|
+
expires: 123,
|
|
13
|
+
};
|
|
14
|
+
const stored = {
|
|
15
|
+
version: 1,
|
|
16
|
+
accounts: [],
|
|
17
|
+
activeIndex: 0,
|
|
18
|
+
};
|
|
19
|
+
const manager = new AccountManager(fallback, stored);
|
|
20
|
+
expect(manager.getAccountCount()).toBe(0);
|
|
21
|
+
});
|
|
22
|
+
it("rotates accounts round-robin", () => {
|
|
23
|
+
const stored = {
|
|
24
|
+
version: 1,
|
|
25
|
+
accounts: [
|
|
26
|
+
{ refreshToken: "r1", projectId: "p1", addedAt: 1, lastUsed: 0 },
|
|
27
|
+
{ refreshToken: "r2", projectId: "p2", addedAt: 1, lastUsed: 0 },
|
|
28
|
+
],
|
|
29
|
+
activeIndex: 0,
|
|
30
|
+
};
|
|
31
|
+
const manager = new AccountManager(undefined, stored);
|
|
32
|
+
expect(manager.pickNext()?.parts.refreshToken).toBe("r1");
|
|
33
|
+
expect(manager.pickNext()?.parts.refreshToken).toBe("r2");
|
|
34
|
+
expect(manager.pickNext()?.parts.refreshToken).toBe("r1");
|
|
35
|
+
});
|
|
36
|
+
it("attaches fallback access tokens only to the matching stored account", () => {
|
|
37
|
+
const fallback = {
|
|
38
|
+
type: "oauth",
|
|
39
|
+
refresh: "r2|p2",
|
|
40
|
+
access: "access-2",
|
|
41
|
+
expires: 123,
|
|
42
|
+
};
|
|
43
|
+
const stored = {
|
|
44
|
+
version: 1,
|
|
45
|
+
accounts: [
|
|
46
|
+
{ refreshToken: "r1", projectId: "p1", addedAt: 1, lastUsed: 0 },
|
|
47
|
+
{ refreshToken: "r2", projectId: "p2", addedAt: 1, lastUsed: 0 },
|
|
48
|
+
],
|
|
49
|
+
activeIndex: 0,
|
|
50
|
+
};
|
|
51
|
+
const manager = new AccountManager(fallback, stored);
|
|
52
|
+
const snapshot = manager.getAccountsSnapshot();
|
|
53
|
+
expect(snapshot[0]?.access).toBeUndefined();
|
|
54
|
+
expect(snapshot[0]?.expires).toBeUndefined();
|
|
55
|
+
expect(snapshot[1]?.access).toBe("access-2");
|
|
56
|
+
expect(snapshot[1]?.expires).toBe(123);
|
|
57
|
+
});
|
|
58
|
+
it("does not attach fallback access tokens to an unrelated account", () => {
|
|
59
|
+
const fallback = {
|
|
60
|
+
type: "oauth",
|
|
61
|
+
refresh: "r3|p3",
|
|
62
|
+
access: "access-3",
|
|
63
|
+
expires: 456,
|
|
64
|
+
};
|
|
65
|
+
const stored = {
|
|
66
|
+
version: 1,
|
|
67
|
+
accounts: [
|
|
68
|
+
{ refreshToken: "r1", projectId: "p1", addedAt: 1, lastUsed: 0 },
|
|
69
|
+
{ refreshToken: "r2", projectId: "p2", addedAt: 1, lastUsed: 0 },
|
|
70
|
+
],
|
|
71
|
+
activeIndex: 0,
|
|
72
|
+
};
|
|
73
|
+
const manager = new AccountManager(fallback, stored);
|
|
74
|
+
const snapshot = manager.getAccountsSnapshot();
|
|
75
|
+
expect(snapshot.some((account) => !!account.access)).toBe(false);
|
|
76
|
+
expect(snapshot.some((account) => typeof account.expires === "number")).toBe(false);
|
|
77
|
+
});
|
|
78
|
+
it("skips rate-limited accounts", () => {
|
|
79
|
+
vi.useFakeTimers();
|
|
80
|
+
vi.setSystemTime(new Date(0));
|
|
81
|
+
const stored = {
|
|
82
|
+
version: 1,
|
|
83
|
+
accounts: [
|
|
84
|
+
{ refreshToken: "r1", projectId: "p1", addedAt: 1, lastUsed: 0 },
|
|
85
|
+
{ refreshToken: "r2", projectId: "p2", addedAt: 1, lastUsed: 0 },
|
|
86
|
+
],
|
|
87
|
+
activeIndex: 0,
|
|
88
|
+
};
|
|
89
|
+
const manager = new AccountManager(undefined, stored);
|
|
90
|
+
const first = manager.pickNext();
|
|
91
|
+
expect(first?.parts.refreshToken).toBe("r1");
|
|
92
|
+
manager.markRateLimited(first, 60_000);
|
|
93
|
+
const next = manager.pickNext();
|
|
94
|
+
expect(next?.parts.refreshToken).toBe("r2");
|
|
95
|
+
});
|
|
96
|
+
it("returns minimum wait time and re-enables after cooldown", () => {
|
|
97
|
+
vi.useFakeTimers();
|
|
98
|
+
vi.setSystemTime(new Date(0));
|
|
99
|
+
const stored = {
|
|
100
|
+
version: 1,
|
|
101
|
+
accounts: [
|
|
102
|
+
{ refreshToken: "r1", projectId: "p1", addedAt: 1, lastUsed: 0 },
|
|
103
|
+
{ refreshToken: "r2", projectId: "p2", addedAt: 1, lastUsed: 0 },
|
|
104
|
+
],
|
|
105
|
+
activeIndex: 0,
|
|
106
|
+
};
|
|
107
|
+
const manager = new AccountManager(undefined, stored);
|
|
108
|
+
const acc1 = manager.pickNext();
|
|
109
|
+
const acc2 = manager.pickNext();
|
|
110
|
+
manager.markRateLimited(acc1, 10_000);
|
|
111
|
+
manager.markRateLimited(acc2, 5_000);
|
|
112
|
+
expect(manager.pickNext()).toBeNull();
|
|
113
|
+
expect(manager.getMinWaitTimeMs()).toBe(5_000);
|
|
114
|
+
vi.setSystemTime(new Date(6_000));
|
|
115
|
+
const available = manager.pickNext();
|
|
116
|
+
expect(available?.parts.refreshToken).toBe("r2");
|
|
117
|
+
});
|
|
118
|
+
it("removes an account and keeps cursor consistent", () => {
|
|
119
|
+
vi.useFakeTimers();
|
|
120
|
+
vi.setSystemTime(new Date(0));
|
|
121
|
+
const stored = {
|
|
122
|
+
version: 1,
|
|
123
|
+
accounts: [
|
|
124
|
+
{ refreshToken: "r1", projectId: "p1", addedAt: 1, lastUsed: 0 },
|
|
125
|
+
{ refreshToken: "r2", projectId: "p2", addedAt: 1, lastUsed: 0 },
|
|
126
|
+
{ refreshToken: "r3", projectId: "p3", addedAt: 1, lastUsed: 0 },
|
|
127
|
+
],
|
|
128
|
+
activeIndex: 1,
|
|
129
|
+
};
|
|
130
|
+
const manager = new AccountManager(undefined, stored);
|
|
131
|
+
const picked = manager.pickNext();
|
|
132
|
+
expect(picked?.parts.refreshToken).toBe("r2");
|
|
133
|
+
manager.removeAccount(picked);
|
|
134
|
+
expect(manager.getAccountCount()).toBe(2);
|
|
135
|
+
const next = manager.pickNext();
|
|
136
|
+
expect(next?.parts.refreshToken).toBe("r3");
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=accounts.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.test.js","sourceRoot":"","sources":["../../../src/plugin/accounts.test.ts"],"names":[],"mappings":"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"}
|
package/dist/src/plugin/cli.d.ts
CHANGED
|
@@ -2,4 +2,8 @@
|
|
|
2
2
|
* Prompts the user for a project ID via stdin/stdout.
|
|
3
3
|
*/
|
|
4
4
|
export declare function promptProjectId(): Promise<string>;
|
|
5
|
+
/**
|
|
6
|
+
* Prompts user whether they want to add another OAuth account.
|
|
7
|
+
*/
|
|
8
|
+
export declare function promptAddAnotherAccount(currentCount: number): Promise<boolean>;
|
|
5
9
|
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/plugin/cli.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAQvD"}
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/plugin/cli.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAQvD;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASpF"}
|
package/dist/src/plugin/cli.js
CHANGED
|
@@ -13,4 +13,18 @@ export async function promptProjectId() {
|
|
|
13
13
|
rl.close();
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Prompts user whether they want to add another OAuth account.
|
|
18
|
+
*/
|
|
19
|
+
export async function promptAddAnotherAccount(currentCount) {
|
|
20
|
+
const rl = createInterface({ input, output });
|
|
21
|
+
try {
|
|
22
|
+
const answer = await rl.question(`Add another account? (${currentCount} added) (y/n): `);
|
|
23
|
+
const normalized = answer.trim().toLowerCase();
|
|
24
|
+
return normalized === "y" || normalized === "yes";
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
rl.close();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
16
30
|
//# sourceMappingURL=cli.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/plugin/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAEhE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC,CAAC;QAC3F,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/plugin/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAEhE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC,CAAC;QAC3F,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,YAAoB;IAChE,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,YAAY,iBAAiB,CAAC,CAAC;QACzF,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC/C,OAAO,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK,CAAC;IACpD,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { OAuthAuthDetails,
|
|
1
|
+
import type { OAuthAuthDetails, ProjectContextResult } from "./types";
|
|
2
2
|
interface AntigravityUserTier {
|
|
3
3
|
id?: string;
|
|
4
4
|
isDefault?: boolean;
|
|
@@ -28,6 +28,6 @@ export declare function onboardManagedProject(accessToken: string, tierId: strin
|
|
|
28
28
|
/**
|
|
29
29
|
* Resolves an effective project ID for the current auth state, caching results per refresh token.
|
|
30
30
|
*/
|
|
31
|
-
export declare function ensureProjectContext(auth: OAuthAuthDetails
|
|
31
|
+
export declare function ensureProjectContext(auth: OAuthAuthDetails): Promise<ProjectContextResult>;
|
|
32
32
|
export {};
|
|
33
33
|
//# sourceMappingURL=project.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/plugin/project.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/plugin/project.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAWtE,UAAU,mBAAmB;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kCAAkC,CAAC,EAAE,OAAO,CAAC;CAC9C;AAED,UAAU,qBAAqB;IAC7B,uBAAuB,CAAC,EAAE,MAAM,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,WAAW,CAAC,EAAE;QACZ,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;IACF,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACtC;AAqFD;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAQpE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAuCvC;AAGD;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,SAAK,EACb,OAAO,SAAO,GACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAuD7B;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA2EhG"}
|
|
@@ -169,7 +169,7 @@ export async function onboardManagedProject(accessToken, tierId, projectId, atte
|
|
|
169
169
|
/**
|
|
170
170
|
* Resolves an effective project ID for the current auth state, caching results per refresh token.
|
|
171
171
|
*/
|
|
172
|
-
export async function ensureProjectContext(auth
|
|
172
|
+
export async function ensureProjectContext(auth) {
|
|
173
173
|
const accessToken = auth.access;
|
|
174
174
|
if (!accessToken) {
|
|
175
175
|
return { auth, effectiveProjectId: "" };
|
|
@@ -200,10 +200,6 @@ export async function ensureProjectContext(auth, client, providerId) {
|
|
|
200
200
|
managedProjectId,
|
|
201
201
|
}),
|
|
202
202
|
};
|
|
203
|
-
await client.auth.set({
|
|
204
|
-
path: { id: providerId },
|
|
205
|
-
body: updatedAuth,
|
|
206
|
-
});
|
|
207
203
|
return { auth: updatedAuth, effectiveProjectId: managedProjectId };
|
|
208
204
|
};
|
|
209
205
|
// Try to resolve a managed project from Antigravity if possible.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/plugin/project.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,8BAA8B,EAC9B,0BAA0B,EAC1B,8BAA8B,GAC/B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/plugin/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface AccountMetadata {
|
|
2
|
+
email?: string;
|
|
3
|
+
refreshToken: string;
|
|
4
|
+
projectId?: string;
|
|
5
|
+
managedProjectId?: string;
|
|
6
|
+
addedAt: number;
|
|
7
|
+
lastUsed: number;
|
|
8
|
+
isRateLimited?: boolean;
|
|
9
|
+
rateLimitResetTime?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface AccountStorage {
|
|
12
|
+
version: 1;
|
|
13
|
+
accounts: AccountMetadata[];
|
|
14
|
+
/**
|
|
15
|
+
* Rotation cursor (next index to start from).
|
|
16
|
+
*
|
|
17
|
+
* Historical note: some forks call this `activeIndex`.
|
|
18
|
+
*/
|
|
19
|
+
activeIndex: number;
|
|
20
|
+
}
|
|
21
|
+
export declare function getStoragePath(): string;
|
|
22
|
+
export declare function loadAccounts(): Promise<AccountStorage | null>;
|
|
23
|
+
export declare function saveAccounts(storage: AccountStorage): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/plugin/storage.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAYD,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA0BnE;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAMzE"}
|