opencode-antigravity-auth 1.1.4 → 1.2.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 +223 -99
- package/dist/src/hooks/auto-update-checker/cache.d.ts +3 -0
- package/dist/src/hooks/auto-update-checker/cache.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/cache.js +71 -0
- package/dist/src/hooks/auto-update-checker/cache.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/checker.d.ts +16 -0
- package/dist/src/hooks/auto-update-checker/checker.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/checker.js +237 -0
- package/dist/src/hooks/auto-update-checker/checker.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/constants.d.ts +9 -0
- package/dist/src/hooks/auto-update-checker/constants.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/constants.js +23 -0
- package/dist/src/hooks/auto-update-checker/constants.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/index.d.ts +34 -0
- package/dist/src/hooks/auto-update-checker/index.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/index.js +121 -0
- package/dist/src/hooks/auto-update-checker/index.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/types.d.ts +25 -0
- package/dist/src/hooks/auto-update-checker/types.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/types.js +1 -0
- package/dist/src/hooks/auto-update-checker/types.js.map +1 -0
- package/dist/src/plugin/accounts.d.ts +21 -10
- package/dist/src/plugin/accounts.d.ts.map +1 -1
- package/dist/src/plugin/accounts.js +101 -55
- package/dist/src/plugin/accounts.js.map +1 -1
- package/dist/src/plugin/cache.d.ts +14 -0
- package/dist/src/plugin/cache.d.ts.map +1 -1
- package/dist/src/plugin/cache.js +82 -0
- package/dist/src/plugin/cache.js.map +1 -1
- package/dist/src/plugin/debug.d.ts +32 -0
- package/dist/src/plugin/debug.d.ts.map +1 -1
- package/dist/src/plugin/debug.js +140 -12
- package/dist/src/plugin/debug.js.map +1 -1
- package/dist/src/plugin/request-helpers.d.ts +13 -4
- package/dist/src/plugin/request-helpers.d.ts.map +1 -1
- package/dist/src/plugin/request-helpers.js +171 -18
- package/dist/src/plugin/request-helpers.js.map +1 -1
- package/dist/src/plugin/request.d.ts +10 -2
- package/dist/src/plugin/request.d.ts.map +1 -1
- package/dist/src/plugin/request.js +614 -67
- package/dist/src/plugin/request.js.map +1 -1
- package/dist/src/plugin/storage.d.ts +23 -7
- package/dist/src/plugin/storage.d.ts.map +1 -1
- package/dist/src/plugin/storage.js +54 -10
- package/dist/src/plugin/storage.js.map +1 -1
- package/dist/src/plugin/types.d.ts +13 -1
- package/dist/src/plugin/types.d.ts.map +1 -1
- package/dist/src/plugin.d.ts +3 -3
- package/dist/src/plugin.d.ts.map +1 -1
- package/dist/src/plugin.js +780 -474
- package/dist/src/plugin.js.map +1 -1
- package/package.json +1 -1
- package/dist/src/plugin/accounts.test.d.ts +0 -2
- package/dist/src/plugin/accounts.test.d.ts.map +0 -1
- package/dist/src/plugin/accounts.test.js +0 -139
- package/dist/src/plugin/accounts.test.js.map +0 -1
- package/dist/src/plugin/token.test.d.ts +0 -2
- package/dist/src/plugin/token.test.d.ts.map +0 -1
- package/dist/src/plugin/token.test.js +0 -64
- package/dist/src/plugin/token.test.js.map +0 -1
|
@@ -9,14 +9,34 @@ function clampNonNegativeInt(value, fallback) {
|
|
|
9
9
|
}
|
|
10
10
|
return value < 0 ? 0 : Math.floor(value);
|
|
11
11
|
}
|
|
12
|
+
function isRateLimitedForFamily(account, family) {
|
|
13
|
+
const resetTime = account.rateLimitResetTimes[family];
|
|
14
|
+
return resetTime !== undefined && nowMs() < resetTime;
|
|
15
|
+
}
|
|
16
|
+
function clearExpiredRateLimits(account) {
|
|
17
|
+
const now = nowMs();
|
|
18
|
+
if (account.rateLimitResetTimes.claude !== undefined && now >= account.rateLimitResetTimes.claude) {
|
|
19
|
+
delete account.rateLimitResetTimes.claude;
|
|
20
|
+
}
|
|
21
|
+
if (account.rateLimitResetTimes.gemini !== undefined && now >= account.rateLimitResetTimes.gemini) {
|
|
22
|
+
delete account.rateLimitResetTimes.gemini;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
12
25
|
/**
|
|
13
|
-
* In-memory multi-account manager
|
|
26
|
+
* In-memory multi-account manager with sticky account selection.
|
|
27
|
+
*
|
|
28
|
+
* Uses the same account until it hits a rate limit (429), then switches.
|
|
29
|
+
* Rate limits are tracked per-model-family (claude/gemini) so an account
|
|
30
|
+
* rate-limited for Claude can still be used for Gemini.
|
|
14
31
|
*
|
|
15
32
|
* Source of truth for the pool is `antigravity-accounts.json`.
|
|
16
33
|
*/
|
|
17
34
|
export class AccountManager {
|
|
18
35
|
accounts = [];
|
|
19
36
|
cursor = 0;
|
|
37
|
+
currentAccountIndex = -1;
|
|
38
|
+
lastToastAccountIndex = -1;
|
|
39
|
+
lastToastTime = 0;
|
|
20
40
|
static async loadFromDisk(authFallback) {
|
|
21
41
|
const stored = await loadAccounts();
|
|
22
42
|
return new AccountManager(authFallback, stored);
|
|
@@ -51,14 +71,15 @@ export class AccountManager {
|
|
|
51
71
|
},
|
|
52
72
|
access: matchesFallback ? authFallback?.access : undefined,
|
|
53
73
|
expires: matchesFallback ? authFallback?.expires : undefined,
|
|
54
|
-
|
|
55
|
-
|
|
74
|
+
rateLimitResetTimes: acc.rateLimitResetTimes ?? {},
|
|
75
|
+
lastSwitchReason: acc.lastSwitchReason,
|
|
56
76
|
};
|
|
57
77
|
})
|
|
58
78
|
.filter((a) => a !== null);
|
|
59
79
|
this.cursor = clampNonNegativeInt(stored.activeIndex, 0);
|
|
60
80
|
if (this.accounts.length > 0) {
|
|
61
81
|
this.cursor = this.cursor % this.accounts.length;
|
|
82
|
+
this.currentAccountIndex = this.cursor;
|
|
62
83
|
}
|
|
63
84
|
return;
|
|
64
85
|
}
|
|
@@ -75,11 +96,11 @@ export class AccountManager {
|
|
|
75
96
|
parts,
|
|
76
97
|
access: authFallback.access,
|
|
77
98
|
expires: authFallback.expires,
|
|
78
|
-
|
|
79
|
-
rateLimitResetTime: 0,
|
|
99
|
+
rateLimitResetTimes: {},
|
|
80
100
|
},
|
|
81
101
|
];
|
|
82
102
|
this.cursor = 0;
|
|
103
|
+
this.currentAccountIndex = 0;
|
|
83
104
|
}
|
|
84
105
|
}
|
|
85
106
|
}
|
|
@@ -87,43 +108,62 @@ export class AccountManager {
|
|
|
87
108
|
return this.accounts.length;
|
|
88
109
|
}
|
|
89
110
|
getAccountsSnapshot() {
|
|
90
|
-
return this.accounts.map((a) => ({ ...a, parts: { ...a.parts } }));
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
pickNext() {
|
|
96
|
-
const total = this.accounts.length;
|
|
97
|
-
if (total === 0) {
|
|
98
|
-
return null;
|
|
111
|
+
return this.accounts.map((a) => ({ ...a, parts: { ...a.parts }, rateLimitResetTimes: { ...a.rateLimitResetTimes } }));
|
|
112
|
+
}
|
|
113
|
+
getCurrentAccount() {
|
|
114
|
+
if (this.currentAccountIndex >= 0 && this.currentAccountIndex < this.accounts.length) {
|
|
115
|
+
return this.accounts[this.currentAccountIndex] ?? null;
|
|
99
116
|
}
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
markSwitched(account, reason) {
|
|
120
|
+
account.lastSwitchReason = reason;
|
|
121
|
+
this.currentAccountIndex = account.index;
|
|
122
|
+
}
|
|
123
|
+
shouldShowAccountToast(accountIndex, debounceMs = 30000) {
|
|
100
124
|
const now = nowMs();
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
if (acc.isRateLimited && acc.rateLimitResetTime > 0 && now > acc.rateLimitResetTime) {
|
|
104
|
-
acc.isRateLimited = false;
|
|
105
|
-
acc.rateLimitResetTime = 0;
|
|
106
|
-
}
|
|
125
|
+
if (accountIndex === this.lastToastAccountIndex && now - this.lastToastTime < debounceMs) {
|
|
126
|
+
return false;
|
|
107
127
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
markToastShown(accountIndex) {
|
|
131
|
+
this.lastToastAccountIndex = accountIndex;
|
|
132
|
+
this.lastToastTime = nowMs();
|
|
133
|
+
}
|
|
134
|
+
getCurrentOrNextForFamily(family) {
|
|
135
|
+
const current = this.getCurrentAccount();
|
|
136
|
+
if (current) {
|
|
137
|
+
clearExpiredRateLimits(current);
|
|
138
|
+
if (!isRateLimitedForFamily(current, family)) {
|
|
139
|
+
current.lastUsed = nowMs();
|
|
140
|
+
return current;
|
|
116
141
|
}
|
|
117
|
-
this.cursor = (idx + 1) % total;
|
|
118
|
-
candidate.lastUsed = now;
|
|
119
|
-
return candidate;
|
|
120
142
|
}
|
|
121
|
-
|
|
143
|
+
const next = this.getNextForFamily(family);
|
|
144
|
+
if (next) {
|
|
145
|
+
this.currentAccountIndex = next.index;
|
|
146
|
+
}
|
|
147
|
+
return next;
|
|
148
|
+
}
|
|
149
|
+
getNextForFamily(family) {
|
|
150
|
+
const available = this.accounts.filter((a) => {
|
|
151
|
+
clearExpiredRateLimits(a);
|
|
152
|
+
return !isRateLimitedForFamily(a, family);
|
|
153
|
+
});
|
|
154
|
+
if (available.length === 0) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
const account = available[this.cursor % available.length];
|
|
158
|
+
if (!account) {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
this.cursor++;
|
|
162
|
+
account.lastUsed = nowMs();
|
|
163
|
+
return account;
|
|
122
164
|
}
|
|
123
|
-
markRateLimited(account, retryAfterMs) {
|
|
124
|
-
|
|
125
|
-
account.isRateLimited = true;
|
|
126
|
-
account.rateLimitResetTime = nowMs() + duration;
|
|
165
|
+
markRateLimited(account, retryAfterMs, family) {
|
|
166
|
+
account.rateLimitResetTimes[family] = nowMs() + retryAfterMs;
|
|
127
167
|
}
|
|
128
168
|
removeAccount(account) {
|
|
129
169
|
const idx = this.accounts.indexOf(account);
|
|
@@ -136,12 +176,19 @@ export class AccountManager {
|
|
|
136
176
|
});
|
|
137
177
|
if (this.accounts.length === 0) {
|
|
138
178
|
this.cursor = 0;
|
|
179
|
+
this.currentAccountIndex = -1;
|
|
139
180
|
return true;
|
|
140
181
|
}
|
|
141
182
|
if (this.cursor > idx) {
|
|
142
183
|
this.cursor -= 1;
|
|
143
184
|
}
|
|
144
185
|
this.cursor = this.cursor % this.accounts.length;
|
|
186
|
+
if (this.currentAccountIndex > idx) {
|
|
187
|
+
this.currentAccountIndex -= 1;
|
|
188
|
+
}
|
|
189
|
+
if (this.currentAccountIndex >= this.accounts.length) {
|
|
190
|
+
this.currentAccountIndex = -1;
|
|
191
|
+
}
|
|
145
192
|
return true;
|
|
146
193
|
}
|
|
147
194
|
updateFromAuth(account, auth) {
|
|
@@ -158,27 +205,26 @@ export class AccountManager {
|
|
|
158
205
|
expires: account.expires,
|
|
159
206
|
};
|
|
160
207
|
}
|
|
161
|
-
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
acc.rateLimitResetTime = 0;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
const available = this.accounts.some((a) => !a.isRateLimited);
|
|
171
|
-
if (available) {
|
|
208
|
+
getMinWaitTimeForFamily(family) {
|
|
209
|
+
const available = this.accounts.filter((a) => {
|
|
210
|
+
clearExpiredRateLimits(a);
|
|
211
|
+
return !isRateLimitedForFamily(a, family);
|
|
212
|
+
});
|
|
213
|
+
if (available.length > 0) {
|
|
172
214
|
return 0;
|
|
173
215
|
}
|
|
174
|
-
const
|
|
175
|
-
.
|
|
176
|
-
.
|
|
177
|
-
|
|
216
|
+
const waitTimes = this.accounts
|
|
217
|
+
.map((a) => a.rateLimitResetTimes[family])
|
|
218
|
+
.filter((t) => t !== undefined)
|
|
219
|
+
.map((t) => Math.max(0, t - nowMs()));
|
|
220
|
+
return waitTimes.length > 0 ? Math.min(...waitTimes) : 0;
|
|
221
|
+
}
|
|
222
|
+
getAccounts() {
|
|
223
|
+
return [...this.accounts];
|
|
178
224
|
}
|
|
179
225
|
async saveToDisk() {
|
|
180
226
|
const storage = {
|
|
181
|
-
version:
|
|
227
|
+
version: 2,
|
|
182
228
|
accounts: this.accounts.map((a) => ({
|
|
183
229
|
email: a.email,
|
|
184
230
|
refreshToken: a.parts.refreshToken,
|
|
@@ -186,10 +232,10 @@ export class AccountManager {
|
|
|
186
232
|
managedProjectId: a.parts.managedProjectId,
|
|
187
233
|
addedAt: a.addedAt,
|
|
188
234
|
lastUsed: a.lastUsed,
|
|
189
|
-
|
|
190
|
-
|
|
235
|
+
lastSwitchReason: a.lastSwitchReason,
|
|
236
|
+
rateLimitResetTimes: Object.keys(a.rateLimitResetTimes).length > 0 ? a.rateLimitResetTimes : undefined,
|
|
191
237
|
})),
|
|
192
|
-
activeIndex: this.
|
|
238
|
+
activeIndex: Math.max(0, this.currentAccountIndex),
|
|
193
239
|
};
|
|
194
240
|
await saveAccounts(storage);
|
|
195
241
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/plugin/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/plugin/accounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,4 +11,18 @@ export declare function storeCachedAuth(auth: OAuthAuthDetails): void;
|
|
|
11
11
|
* Clears cached auth globally or for a specific refresh token.
|
|
12
12
|
*/
|
|
13
13
|
export declare function clearCachedAuth(refresh?: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* Caches a thinking signature for a given session and text.
|
|
16
|
+
* Used for Claude models that require signed thinking blocks in multi-turn conversations.
|
|
17
|
+
*/
|
|
18
|
+
export declare function cacheSignature(sessionId: string, text: string, signature: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* Retrieves a cached signature for a given session and text.
|
|
21
|
+
* Returns undefined if not found or expired.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getCachedSignature(sessionId: string, text: string): string | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Clears signature cache for a specific session or all sessions.
|
|
26
|
+
*/
|
|
27
|
+
export declare function clearSignatureCache(sessionId?: string): void;
|
|
14
28
|
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/plugin/cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/plugin/cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAahD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,gBAAgB,CAuB1E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAM5D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAStD;AAgCD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CA8BvF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiBtF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAM5D"}
|
package/dist/src/plugin/cache.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { accessTokenExpired } from "./auth";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
2
3
|
const authCache = new Map();
|
|
3
4
|
/**
|
|
4
5
|
* Produces a stable cache key from a refresh token string.
|
|
@@ -53,4 +54,85 @@ export function clearCachedAuth(refresh) {
|
|
|
53
54
|
authCache.delete(key);
|
|
54
55
|
}
|
|
55
56
|
}
|
|
57
|
+
// Map: sessionId -> Map<textHash, SignatureEntry>
|
|
58
|
+
const signatureCache = new Map();
|
|
59
|
+
// Cache entries expire after 1 hour
|
|
60
|
+
const SIGNATURE_CACHE_TTL_MS = 60 * 60 * 1000;
|
|
61
|
+
// Maximum entries per session to prevent memory bloat
|
|
62
|
+
const MAX_ENTRIES_PER_SESSION = 100;
|
|
63
|
+
// 16 hex chars = 64-bit key space; keeps memory bounded while making collisions extremely unlikely.
|
|
64
|
+
const SIGNATURE_TEXT_HASH_HEX_LEN = 16;
|
|
65
|
+
/**
|
|
66
|
+
* Hashes text content into a stable, Unicode-safe key.
|
|
67
|
+
*
|
|
68
|
+
* Uses SHA-256 over UTF-8 bytes and truncates to keep memory usage bounded.
|
|
69
|
+
*/
|
|
70
|
+
function hashText(text) {
|
|
71
|
+
return createHash("sha256").update(text, "utf8").digest("hex").slice(0, SIGNATURE_TEXT_HASH_HEX_LEN);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Caches a thinking signature for a given session and text.
|
|
75
|
+
* Used for Claude models that require signed thinking blocks in multi-turn conversations.
|
|
76
|
+
*/
|
|
77
|
+
export function cacheSignature(sessionId, text, signature) {
|
|
78
|
+
if (!sessionId || !text || !signature)
|
|
79
|
+
return;
|
|
80
|
+
let sessionCache = signatureCache.get(sessionId);
|
|
81
|
+
if (!sessionCache) {
|
|
82
|
+
sessionCache = new Map();
|
|
83
|
+
signatureCache.set(sessionId, sessionCache);
|
|
84
|
+
}
|
|
85
|
+
// Evict old entries if we're at capacity
|
|
86
|
+
if (sessionCache.size >= MAX_ENTRIES_PER_SESSION) {
|
|
87
|
+
const now = Date.now();
|
|
88
|
+
for (const [key, entry] of sessionCache.entries()) {
|
|
89
|
+
if (now - entry.timestamp > SIGNATURE_CACHE_TTL_MS) {
|
|
90
|
+
sessionCache.delete(key);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// If still at capacity, remove oldest entries
|
|
94
|
+
if (sessionCache.size >= MAX_ENTRIES_PER_SESSION) {
|
|
95
|
+
const entries = Array.from(sessionCache.entries())
|
|
96
|
+
.sort((a, b) => a[1].timestamp - b[1].timestamp);
|
|
97
|
+
const toRemove = entries.slice(0, Math.floor(MAX_ENTRIES_PER_SESSION / 4));
|
|
98
|
+
for (const [key] of toRemove) {
|
|
99
|
+
sessionCache.delete(key);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const textHash = hashText(text);
|
|
104
|
+
sessionCache.set(textHash, { signature, timestamp: Date.now() });
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Retrieves a cached signature for a given session and text.
|
|
108
|
+
* Returns undefined if not found or expired.
|
|
109
|
+
*/
|
|
110
|
+
export function getCachedSignature(sessionId, text) {
|
|
111
|
+
if (!sessionId || !text)
|
|
112
|
+
return undefined;
|
|
113
|
+
const sessionCache = signatureCache.get(sessionId);
|
|
114
|
+
if (!sessionCache)
|
|
115
|
+
return undefined;
|
|
116
|
+
const textHash = hashText(text);
|
|
117
|
+
const entry = sessionCache.get(textHash);
|
|
118
|
+
if (!entry)
|
|
119
|
+
return undefined;
|
|
120
|
+
// Check if expired
|
|
121
|
+
if (Date.now() - entry.timestamp > SIGNATURE_CACHE_TTL_MS) {
|
|
122
|
+
sessionCache.delete(textHash);
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
return entry.signature;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Clears signature cache for a specific session or all sessions.
|
|
129
|
+
*/
|
|
130
|
+
export function clearSignatureCache(sessionId) {
|
|
131
|
+
if (sessionId) {
|
|
132
|
+
signatureCache.delete(sessionId);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
signatureCache.clear();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
56
138
|
//# sourceMappingURL=cache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/plugin/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/plugin/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;AAEtD;;GAEG;AACH,SAAS,mBAAmB,CAAC,OAAgB;IAC3C,MAAM,GAAG,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;IAC5B,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAsB;IACtD,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACzB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAsB;IACpD,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IACD,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,SAAS,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,GAAG,EAAE,CAAC;QACR,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAWD,kDAAkD;AAClD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuC,CAAC;AAEtE,oCAAoC;AACpC,MAAM,sBAAsB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE9C,sDAAsD;AACtD,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,oGAAoG;AACpG,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAEvC;;;;GAIG;AACH,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,2BAA2B,CAAC,CAAC;AACvG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,IAAY,EAAE,SAAiB;IAC/E,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO;IAE9C,IAAI,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;QACzB,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAC9C,CAAC;IAED,yCAAyC;IACzC,IAAI,YAAY,CAAC,IAAI,IAAI,uBAAuB,EAAE,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;YAClD,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,GAAG,sBAAsB,EAAE,CAAC;gBACnD,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,8CAA8C;QAC9C,IAAI,YAAY,CAAC,IAAI,IAAI,uBAAuB,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;iBAC/C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,uBAAuB,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3E,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;gBAC7B,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,IAAY;IAChE,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAE1C,MAAM,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACnD,IAAI,CAAC,YAAY;QAAE,OAAO,SAAS,CAAC;IAEpC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE7B,mBAAmB;IACnB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,sBAAsB,EAAE,CAAC;QAC1D,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,KAAK,CAAC,SAAS,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAkB;IACpD,IAAI,SAAS,EAAE,CAAC;QACd,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,cAAc,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;AACH,CAAC"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
export declare const DEBUG_MESSAGE_PREFIX = "[opencode-antigravity-auth debug]";
|
|
2
|
+
export declare function isDebugEnabled(): boolean;
|
|
3
|
+
export declare function isVerboseEnabled(): boolean;
|
|
4
|
+
export declare function getLogFilePath(): string | undefined;
|
|
1
5
|
export interface AntigravityDebugContext {
|
|
2
6
|
id: string;
|
|
3
7
|
streaming: boolean;
|
|
@@ -26,5 +30,33 @@ export declare function startAntigravityDebugRequest(meta: AntigravityDebugReque
|
|
|
26
30
|
* Logs response details for a previously started debug trace when debugging is enabled.
|
|
27
31
|
*/
|
|
28
32
|
export declare function logAntigravityDebugResponse(context: AntigravityDebugContext | null | undefined, response: Response, meta?: AntigravityDebugResponseMeta): void;
|
|
33
|
+
export interface AccountDebugInfo {
|
|
34
|
+
index: number;
|
|
35
|
+
email?: string;
|
|
36
|
+
family: string;
|
|
37
|
+
totalAccounts: number;
|
|
38
|
+
rateLimitState?: {
|
|
39
|
+
claude?: number;
|
|
40
|
+
gemini?: number;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export declare function logAccountContext(label: string, info: AccountDebugInfo): void;
|
|
44
|
+
export declare function logRateLimitEvent(accountIndex: number, email: string | undefined, family: string, status: number, retryAfterMs: number, bodyInfo: {
|
|
45
|
+
message?: string;
|
|
46
|
+
quotaResetTime?: string;
|
|
47
|
+
retryDelayMs?: number | null;
|
|
48
|
+
reason?: string;
|
|
49
|
+
}): void;
|
|
50
|
+
export declare function logRateLimitSnapshot(family: string, accounts: Array<{
|
|
51
|
+
index: number;
|
|
52
|
+
email?: string;
|
|
53
|
+
rateLimitResetTimes?: {
|
|
54
|
+
claude?: number;
|
|
55
|
+
gemini?: number;
|
|
56
|
+
};
|
|
57
|
+
}>): void;
|
|
58
|
+
export declare function logResponseBody(context: AntigravityDebugContext | null | undefined, response: Response, status: number): Promise<string | undefined>;
|
|
59
|
+
export declare function logModelFamily(url: string, extractedModel: string | null, family: string): void;
|
|
60
|
+
export declare function debugLogToFile(message: string): void;
|
|
29
61
|
export {};
|
|
30
62
|
//# sourceMappingURL=debug.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../../src/plugin/debug.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../../src/plugin/debug.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,oBAAoB,sCAAsC,CAAC;AAgBxE,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAEnD;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,2BAA2B;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,4BAA4B;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,eAAe,CAAC,EAAE,WAAW,CAAC;CAC/B;AAID;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,2BAA2B,GAAG,uBAAuB,GAAG,IAAI,CAsB9G;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,uBAAuB,GAAG,IAAI,GAAG,SAAS,EACnD,QAAQ,EAAE,QAAQ,EAClB,IAAI,GAAE,4BAAiC,GACtC,IAAI,CA4BN;AAoID,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAc7E;AAED,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACrG,IAAI,CAgBN;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,GAC7G,IAAI,CAcN;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,uBAAuB,GAAG,IAAI,GAAG,SAAS,EACnD,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoB7B;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAG/F;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGpD"}
|
package/dist/src/plugin/debug.js
CHANGED
|
@@ -1,11 +1,34 @@
|
|
|
1
|
-
import { createWriteStream } from "node:fs";
|
|
1
|
+
import { createWriteStream, mkdirSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { env } from "node:process";
|
|
4
5
|
const DEBUG_FLAG = env.OPENCODE_ANTIGRAVITY_DEBUG ?? "";
|
|
5
6
|
const MAX_BODY_PREVIEW_CHARS = 12000;
|
|
6
|
-
const
|
|
7
|
+
const MAX_BODY_VERBOSE_CHARS = 50000;
|
|
8
|
+
export const DEBUG_MESSAGE_PREFIX = "[opencode-antigravity-auth debug]";
|
|
9
|
+
// Debug levels: 0 = off, 1 = basic, 2 = verbose (full bodies)
|
|
10
|
+
const debugLevel = parseDebugLevel(DEBUG_FLAG);
|
|
11
|
+
const debugEnabled = debugLevel >= 1;
|
|
12
|
+
const verboseEnabled = debugLevel >= 2;
|
|
7
13
|
const logFilePath = debugEnabled ? defaultLogFilePath() : undefined;
|
|
8
14
|
const logWriter = createLogWriter(logFilePath);
|
|
15
|
+
function parseDebugLevel(flag) {
|
|
16
|
+
const trimmed = flag.trim();
|
|
17
|
+
if (trimmed === "2" || trimmed === "verbose")
|
|
18
|
+
return 2;
|
|
19
|
+
if (trimmed === "1" || trimmed === "true")
|
|
20
|
+
return 1;
|
|
21
|
+
return 0;
|
|
22
|
+
}
|
|
23
|
+
export function isDebugEnabled() {
|
|
24
|
+
return debugEnabled;
|
|
25
|
+
}
|
|
26
|
+
export function isVerboseEnabled() {
|
|
27
|
+
return verboseEnabled;
|
|
28
|
+
}
|
|
29
|
+
export function getLogFilePath() {
|
|
30
|
+
return logFilePath;
|
|
31
|
+
}
|
|
9
32
|
let requestCounter = 0;
|
|
10
33
|
/**
|
|
11
34
|
* Begins a debug trace for an Antigravity request, logging request metadata when debugging is enabled.
|
|
@@ -121,22 +144,127 @@ function formatError(error) {
|
|
|
121
144
|
}
|
|
122
145
|
}
|
|
123
146
|
/**
|
|
124
|
-
*
|
|
147
|
+
* Returns the logs directory inside the opencode config folder.
|
|
148
|
+
* Creates the directory if it doesn't exist.
|
|
125
149
|
*/
|
|
126
|
-
function
|
|
127
|
-
const
|
|
128
|
-
|
|
150
|
+
function getLogsDir() {
|
|
151
|
+
const platform = process.platform;
|
|
152
|
+
let configDir;
|
|
153
|
+
if (platform === "win32") {
|
|
154
|
+
configDir = join(env.APPDATA || join(homedir(), "AppData", "Roaming"), "opencode");
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
const xdgConfig = env.XDG_CONFIG_HOME || join(homedir(), ".config");
|
|
158
|
+
configDir = join(xdgConfig, "opencode");
|
|
159
|
+
}
|
|
160
|
+
const logsDir = env.OPENCODE_ANTIGRAVITY_LOG_DIR || join(configDir, "antigravity-logs");
|
|
161
|
+
try {
|
|
162
|
+
mkdirSync(logsDir, { recursive: true });
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// Directory may already exist or we don't have permission
|
|
166
|
+
}
|
|
167
|
+
return logsDir;
|
|
129
168
|
}
|
|
130
169
|
/**
|
|
131
|
-
*
|
|
170
|
+
* Builds a timestamped log file path in the opencode logs directory.
|
|
132
171
|
*/
|
|
172
|
+
function defaultLogFilePath() {
|
|
173
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
174
|
+
return join(getLogsDir(), `antigravity-debug-${timestamp}.log`);
|
|
175
|
+
}
|
|
133
176
|
function createLogWriter(filePath) {
|
|
134
177
|
if (!filePath) {
|
|
135
178
|
return () => { };
|
|
136
179
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
stream.
|
|
140
|
-
|
|
180
|
+
try {
|
|
181
|
+
const stream = createWriteStream(filePath, { flags: "a" });
|
|
182
|
+
stream.on("error", () => { });
|
|
183
|
+
return (line) => {
|
|
184
|
+
const timestamp = new Date().toISOString();
|
|
185
|
+
const formatted = `[${timestamp}] ${line}`;
|
|
186
|
+
stream.write(`${formatted}\n`);
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
return () => { };
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
export function logAccountContext(label, info) {
|
|
194
|
+
if (!debugEnabled)
|
|
195
|
+
return;
|
|
196
|
+
const accountLabel = info.email
|
|
197
|
+
? info.email
|
|
198
|
+
: info.index >= 0
|
|
199
|
+
? `Account ${info.index + 1}`
|
|
200
|
+
: "All accounts";
|
|
201
|
+
const indexLabel = info.index >= 0 ? `${info.index + 1}/${info.totalAccounts}` : `-/${info.totalAccounts}`;
|
|
202
|
+
const rateLimitInfo = info.rateLimitState ? ` rateLimits=${JSON.stringify(info.rateLimitState)}` : "";
|
|
203
|
+
logDebug(`[Account] ${label}: ${accountLabel} (${indexLabel}) family=${info.family}${rateLimitInfo}`);
|
|
204
|
+
}
|
|
205
|
+
export function logRateLimitEvent(accountIndex, email, family, status, retryAfterMs, bodyInfo) {
|
|
206
|
+
if (!debugEnabled)
|
|
207
|
+
return;
|
|
208
|
+
const accountLabel = email || `Account ${accountIndex + 1}`;
|
|
209
|
+
logDebug(`[RateLimit] ${status} on ${accountLabel} family=${family} retryAfterMs=${retryAfterMs}`);
|
|
210
|
+
if (bodyInfo.message) {
|
|
211
|
+
logDebug(`[RateLimit] message: ${bodyInfo.message}`);
|
|
212
|
+
}
|
|
213
|
+
if (bodyInfo.quotaResetTime) {
|
|
214
|
+
logDebug(`[RateLimit] quotaResetTime: ${bodyInfo.quotaResetTime}`);
|
|
215
|
+
}
|
|
216
|
+
if (bodyInfo.retryDelayMs !== undefined && bodyInfo.retryDelayMs !== null) {
|
|
217
|
+
logDebug(`[RateLimit] body retryDelayMs: ${bodyInfo.retryDelayMs}`);
|
|
218
|
+
}
|
|
219
|
+
if (bodyInfo.reason) {
|
|
220
|
+
logDebug(`[RateLimit] reason: ${bodyInfo.reason}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
export function logRateLimitSnapshot(family, accounts) {
|
|
224
|
+
if (!debugEnabled)
|
|
225
|
+
return;
|
|
226
|
+
const now = Date.now();
|
|
227
|
+
const entries = accounts.map((account) => {
|
|
228
|
+
const label = account.email ? account.email : `Account ${account.index + 1}`;
|
|
229
|
+
const reset = account.rateLimitResetTimes?.[family];
|
|
230
|
+
if (typeof reset !== "number") {
|
|
231
|
+
return `${label}=ready`;
|
|
232
|
+
}
|
|
233
|
+
const remaining = Math.max(0, reset - now);
|
|
234
|
+
const seconds = Math.ceil(remaining / 1000);
|
|
235
|
+
return `${label}=wait ${seconds}s`;
|
|
236
|
+
});
|
|
237
|
+
logDebug(`[RateLimit] snapshot family=${family} ${entries.join(" | ")}`);
|
|
238
|
+
}
|
|
239
|
+
export async function logResponseBody(context, response, status) {
|
|
240
|
+
if (!debugEnabled || !context)
|
|
241
|
+
return undefined;
|
|
242
|
+
const isError = status >= 400;
|
|
243
|
+
const shouldLogBody = verboseEnabled || isError;
|
|
244
|
+
if (!shouldLogBody)
|
|
245
|
+
return undefined;
|
|
246
|
+
try {
|
|
247
|
+
const text = await response.clone().text();
|
|
248
|
+
const maxChars = verboseEnabled ? MAX_BODY_VERBOSE_CHARS : MAX_BODY_PREVIEW_CHARS;
|
|
249
|
+
const preview = text.length <= maxChars
|
|
250
|
+
? text
|
|
251
|
+
: `${text.slice(0, maxChars)}... (truncated ${text.length - maxChars} chars)`;
|
|
252
|
+
logDebug(`[Antigravity Debug ${context.id}] Response Body (${status}): ${preview}`);
|
|
253
|
+
return text;
|
|
254
|
+
}
|
|
255
|
+
catch (e) {
|
|
256
|
+
logDebug(`[Antigravity Debug ${context.id}] Failed to read response body: ${formatError(e)}`);
|
|
257
|
+
return undefined;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
export function logModelFamily(url, extractedModel, family) {
|
|
261
|
+
if (!debugEnabled)
|
|
262
|
+
return;
|
|
263
|
+
logDebug(`[ModelFamily] url=${url} model=${extractedModel ?? "unknown"} family=${family}`);
|
|
264
|
+
}
|
|
265
|
+
export function debugLogToFile(message) {
|
|
266
|
+
if (!debugEnabled)
|
|
267
|
+
return;
|
|
268
|
+
logDebug(message);
|
|
141
269
|
}
|
|
142
270
|
//# sourceMappingURL=debug.js.map
|