opencode-usage-plugin 0.0.1-dev → 0.0.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/dist/index.js +125 -40
- package/dist/index.js.map +3 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -4,6 +4,42 @@ import { fileURLToPath } from "node:url";
|
|
|
4
4
|
import { readdir, readFile as readFile2 } from "node:fs/promises";
|
|
5
5
|
import path from "path";
|
|
6
6
|
|
|
7
|
+
// src/providers/common/logger.ts
|
|
8
|
+
var maskSecret = (secret) => {
|
|
9
|
+
if (!secret || typeof secret !== "string" || secret.length <= 8) {
|
|
10
|
+
return "***";
|
|
11
|
+
}
|
|
12
|
+
return `${secret.slice(0, 4)}...${secret.slice(-4)}`;
|
|
13
|
+
};
|
|
14
|
+
var noOpLogger = {
|
|
15
|
+
debug: async () => {
|
|
16
|
+
},
|
|
17
|
+
info: async () => {
|
|
18
|
+
},
|
|
19
|
+
warn: async () => {
|
|
20
|
+
},
|
|
21
|
+
error: async () => {
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
var createLogger = (client) => {
|
|
25
|
+
const service = "opencode-usage";
|
|
26
|
+
return {
|
|
27
|
+
debug: async (message, extra) => {
|
|
28
|
+
await client.app.log({ service, level: "debug", message, extra });
|
|
29
|
+
},
|
|
30
|
+
info: async (message, extra) => {
|
|
31
|
+
await client.app.log({ service, level: "info", message, extra });
|
|
32
|
+
},
|
|
33
|
+
warn: async (message, extra) => {
|
|
34
|
+
await client.app.log({ service, level: "warn", message, extra });
|
|
35
|
+
},
|
|
36
|
+
error: async (message, extra) => {
|
|
37
|
+
await client.app.log({ service, level: "error", message, extra });
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
var noopLogger = noOpLogger;
|
|
42
|
+
|
|
7
43
|
// src/providers/common/time.ts
|
|
8
44
|
var calculateResetAfterSeconds = (resetAt, now = Date.now()) => {
|
|
9
45
|
if (!resetAt) {
|
|
@@ -57,16 +93,20 @@ var AUTH_PATHS = {
|
|
|
57
93
|
antigravityConfig: () => join(xdgConfigHome(), "opencode", "antigravity-accounts.json"),
|
|
58
94
|
antigravityData: () => join(xdgDataHome(), "opencode", "antigravity-accounts.json")
|
|
59
95
|
};
|
|
60
|
-
var readJson = async (filePath) => {
|
|
96
|
+
var readJson = async (filePath, logger) => {
|
|
61
97
|
try {
|
|
62
98
|
const content = await readFile(filePath, "utf-8");
|
|
63
99
|
return JSON.parse(content);
|
|
64
|
-
} catch {
|
|
100
|
+
} catch (error) {
|
|
101
|
+
if (logger) {
|
|
102
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
103
|
+
await logger.debug(`Auth file not found or invalid: ${filePath}`, { error: message });
|
|
104
|
+
}
|
|
65
105
|
return null;
|
|
66
106
|
}
|
|
67
107
|
};
|
|
68
|
-
var loadOpenCodeAuth = async () => {
|
|
69
|
-
return readJson(AUTH_PATHS.opencode());
|
|
108
|
+
var loadOpenCodeAuth = async (logger) => {
|
|
109
|
+
return readJson(AUTH_PATHS.opencode(), logger);
|
|
70
110
|
};
|
|
71
111
|
|
|
72
112
|
// src/providers/common/registry.ts
|
|
@@ -104,8 +144,8 @@ var toAuthData = (entry) => {
|
|
|
104
144
|
}
|
|
105
145
|
return null;
|
|
106
146
|
};
|
|
107
|
-
var loadOpenCodeAuthEntry = async () => {
|
|
108
|
-
const auth = await loadOpenCodeAuth();
|
|
147
|
+
var loadOpenCodeAuthEntry = async (logger) => {
|
|
148
|
+
const auth = await loadOpenCodeAuth(logger);
|
|
109
149
|
if (!auth) {
|
|
110
150
|
return null;
|
|
111
151
|
}
|
|
@@ -122,14 +162,21 @@ var toAuthContext = (entry) => {
|
|
|
122
162
|
return null;
|
|
123
163
|
}
|
|
124
164
|
const accessToken = entry.access ?? entry.token;
|
|
125
|
-
|
|
165
|
+
let refreshToken = entry.refresh;
|
|
166
|
+
let projectId = void 0;
|
|
167
|
+
if (refreshToken && refreshToken.includes("|")) {
|
|
168
|
+
const parts = refreshToken.split("|");
|
|
169
|
+
refreshToken = parts[0];
|
|
170
|
+
projectId = parts[1];
|
|
171
|
+
}
|
|
126
172
|
if (!accessToken && !refreshToken) {
|
|
127
173
|
return null;
|
|
128
174
|
}
|
|
129
175
|
return {
|
|
130
176
|
accessToken,
|
|
131
177
|
refreshToken,
|
|
132
|
-
expires: entry.expires
|
|
178
|
+
expires: entry.expires,
|
|
179
|
+
projectId
|
|
133
180
|
};
|
|
134
181
|
};
|
|
135
182
|
var selectAccount = (accounts) => {
|
|
@@ -140,8 +187,11 @@ var selectAccount = (accounts) => {
|
|
|
140
187
|
const account = accounts.accounts[candidateIndex] ?? accounts.accounts[0];
|
|
141
188
|
return account ?? null;
|
|
142
189
|
};
|
|
143
|
-
var loadAuthFromAccounts = async () => {
|
|
144
|
-
const configAccounts = await readJson(
|
|
190
|
+
var loadAuthFromAccounts = async (logger) => {
|
|
191
|
+
const configAccounts = await readJson(
|
|
192
|
+
AUTH_PATHS.antigravityConfig(),
|
|
193
|
+
logger
|
|
194
|
+
);
|
|
145
195
|
const account = selectAccount(configAccounts);
|
|
146
196
|
if (account) {
|
|
147
197
|
return {
|
|
@@ -150,7 +200,10 @@ var loadAuthFromAccounts = async () => {
|
|
|
150
200
|
email: account.email
|
|
151
201
|
};
|
|
152
202
|
}
|
|
153
|
-
const dataAccounts = await readJson(
|
|
203
|
+
const dataAccounts = await readJson(
|
|
204
|
+
AUTH_PATHS.antigravityData(),
|
|
205
|
+
logger
|
|
206
|
+
);
|
|
154
207
|
const fallbackAccount = selectAccount(dataAccounts);
|
|
155
208
|
if (!fallbackAccount) {
|
|
156
209
|
return null;
|
|
@@ -161,13 +214,13 @@ var loadAuthFromAccounts = async () => {
|
|
|
161
214
|
email: fallbackAccount.email
|
|
162
215
|
};
|
|
163
216
|
};
|
|
164
|
-
var getGoogleAuth = async () => {
|
|
165
|
-
const openCodeAuth = await loadOpenCodeAuthEntry();
|
|
217
|
+
var getGoogleAuth = async (logger) => {
|
|
218
|
+
const openCodeAuth = await loadOpenCodeAuthEntry(logger);
|
|
166
219
|
const authContext = toAuthContext(openCodeAuth);
|
|
167
220
|
if (authContext) {
|
|
168
221
|
return authContext;
|
|
169
222
|
}
|
|
170
|
-
return loadAuthFromAccounts();
|
|
223
|
+
return loadAuthFromAccounts(logger);
|
|
171
224
|
};
|
|
172
225
|
|
|
173
226
|
// src/providers/google/fetch.ts
|
|
@@ -185,7 +238,7 @@ var HEADERS = {
|
|
|
185
238
|
"X-Goog-Api-Client": "google-cloud-sdk vscode_cloudshelleditor/0.1",
|
|
186
239
|
"Client-Metadata": '{"ideType":"IDE_UNSPECIFIED","platform":"PLATFORM_UNSPECIFIED","pluginType":"GEMINI"}'
|
|
187
240
|
};
|
|
188
|
-
var refreshAccessToken = async (refreshToken) => {
|
|
241
|
+
var refreshAccessToken = async (refreshToken, logger) => {
|
|
189
242
|
try {
|
|
190
243
|
const response = await fetch("https://oauth2.googleapis.com/token", {
|
|
191
244
|
method: "POST",
|
|
@@ -198,14 +251,20 @@ var refreshAccessToken = async (refreshToken) => {
|
|
|
198
251
|
})
|
|
199
252
|
});
|
|
200
253
|
if (!response.ok) {
|
|
254
|
+
await logger.warn("Failed to refresh OAuth token for google", {
|
|
255
|
+
status: response.status,
|
|
256
|
+
token: maskSecret(refreshToken)
|
|
257
|
+
});
|
|
201
258
|
return null;
|
|
202
259
|
}
|
|
203
260
|
return await response.json();
|
|
204
|
-
} catch {
|
|
261
|
+
} catch (error) {
|
|
262
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
263
|
+
await logger.warn(`Token refresh failed for google: ${message}`);
|
|
205
264
|
return null;
|
|
206
265
|
}
|
|
207
266
|
};
|
|
208
|
-
var fetchModels = async (accessToken, projectId) => {
|
|
267
|
+
var fetchModels = async (accessToken, projectId, logger) => {
|
|
209
268
|
const body = projectId ? { project: projectId } : {};
|
|
210
269
|
for (const endpoint of ENDPOINTS) {
|
|
211
270
|
try {
|
|
@@ -220,12 +279,14 @@ var fetchModels = async (accessToken, projectId) => {
|
|
|
220
279
|
signal: AbortSignal.timeout(15e3)
|
|
221
280
|
});
|
|
222
281
|
if (response.ok) {
|
|
282
|
+
await logger.debug(`Fetched models from ${endpoint}`, { projectId });
|
|
223
283
|
return await response.json();
|
|
224
284
|
}
|
|
225
285
|
} catch {
|
|
226
286
|
continue;
|
|
227
287
|
}
|
|
228
288
|
}
|
|
289
|
+
await logger.error("Failed to fetch models from all google endpoints", { projectId });
|
|
229
290
|
return null;
|
|
230
291
|
};
|
|
231
292
|
var toWindow = (remainingFraction, resetTime) => {
|
|
@@ -258,7 +319,7 @@ var buildUsage = (data) => {
|
|
|
258
319
|
models: Object.keys(models).length ? models : void 0
|
|
259
320
|
};
|
|
260
321
|
};
|
|
261
|
-
var resolveAccessToken = async (refreshToken, accessToken, expires) => {
|
|
322
|
+
var resolveAccessToken = async (refreshToken, accessToken, expires, logger) => {
|
|
262
323
|
const now = Date.now();
|
|
263
324
|
if (accessToken && (!expires || expires > now)) {
|
|
264
325
|
return accessToken;
|
|
@@ -266,12 +327,13 @@ var resolveAccessToken = async (refreshToken, accessToken, expires) => {
|
|
|
266
327
|
if (!refreshToken) {
|
|
267
328
|
return null;
|
|
268
329
|
}
|
|
269
|
-
const refreshed = await refreshAccessToken(refreshToken);
|
|
330
|
+
const refreshed = await refreshAccessToken(refreshToken, logger);
|
|
270
331
|
return refreshed?.access_token ?? null;
|
|
271
332
|
};
|
|
272
|
-
var fetchGoogleUsage = async () => {
|
|
273
|
-
const auth = await getGoogleAuth();
|
|
333
|
+
var fetchGoogleUsage = async (logger = noopLogger) => {
|
|
334
|
+
const auth = await getGoogleAuth(logger);
|
|
274
335
|
if (!auth) {
|
|
336
|
+
await logger.warn("No auth configured for google");
|
|
275
337
|
return {
|
|
276
338
|
provider: "google",
|
|
277
339
|
ok: false,
|
|
@@ -280,8 +342,14 @@ var fetchGoogleUsage = async () => {
|
|
|
280
342
|
usage: null
|
|
281
343
|
};
|
|
282
344
|
}
|
|
283
|
-
const accessToken = await resolveAccessToken(
|
|
345
|
+
const accessToken = await resolveAccessToken(
|
|
346
|
+
auth.refreshToken,
|
|
347
|
+
auth.accessToken,
|
|
348
|
+
auth.expires,
|
|
349
|
+
logger
|
|
350
|
+
);
|
|
284
351
|
if (!accessToken) {
|
|
352
|
+
await logger.warn("Failed to refresh OAuth token for google", { email: auth.email });
|
|
285
353
|
return {
|
|
286
354
|
provider: "google",
|
|
287
355
|
ok: false,
|
|
@@ -291,8 +359,9 @@ var fetchGoogleUsage = async () => {
|
|
|
291
359
|
};
|
|
292
360
|
}
|
|
293
361
|
const projectId = auth.projectId ?? DEFAULT_PROJECT_ID;
|
|
294
|
-
const modelsData = await fetchModels(accessToken, projectId);
|
|
362
|
+
const modelsData = await fetchModels(accessToken, projectId, logger);
|
|
295
363
|
if (!modelsData) {
|
|
364
|
+
await logger.error("Failed to fetch models from google API", { projectId });
|
|
296
365
|
return {
|
|
297
366
|
provider: "google",
|
|
298
367
|
ok: false,
|
|
@@ -301,6 +370,7 @@ var fetchGoogleUsage = async () => {
|
|
|
301
370
|
usage: null
|
|
302
371
|
};
|
|
303
372
|
}
|
|
373
|
+
await logger.info("google usage fetched successfully");
|
|
304
374
|
return {
|
|
305
375
|
provider: "google",
|
|
306
376
|
ok: true,
|
|
@@ -325,8 +395,8 @@ var toAuthData2 = (entry) => {
|
|
|
325
395
|
var hasAccessToken = (auth) => {
|
|
326
396
|
return Boolean(auth?.access || auth?.token);
|
|
327
397
|
};
|
|
328
|
-
var loadOpenCodeAuthEntry2 = async () => {
|
|
329
|
-
const auth = await loadOpenCodeAuth();
|
|
398
|
+
var loadOpenCodeAuthEntry2 = async (logger) => {
|
|
399
|
+
const auth = await loadOpenCodeAuth(logger);
|
|
330
400
|
if (!auth) {
|
|
331
401
|
return null;
|
|
332
402
|
}
|
|
@@ -338,12 +408,12 @@ var loadOpenCodeAuthEntry2 = async () => {
|
|
|
338
408
|
}
|
|
339
409
|
return null;
|
|
340
410
|
};
|
|
341
|
-
var getOpenaiAuth = async () => {
|
|
342
|
-
const openCodeAuth = await loadOpenCodeAuthEntry2();
|
|
411
|
+
var getOpenaiAuth = async (logger) => {
|
|
412
|
+
const openCodeAuth = await loadOpenCodeAuthEntry2(logger);
|
|
343
413
|
if (openCodeAuth && hasAccessToken(openCodeAuth)) {
|
|
344
414
|
return openCodeAuth;
|
|
345
415
|
}
|
|
346
|
-
const pluginAuth = await readJson(AUTH_PATHS.openaiPlugin());
|
|
416
|
+
const pluginAuth = await readJson(AUTH_PATHS.openaiPlugin(), logger);
|
|
347
417
|
if (pluginAuth && hasAccessToken(pluginAuth)) {
|
|
348
418
|
return pluginAuth;
|
|
349
419
|
}
|
|
@@ -368,9 +438,10 @@ var toWindow2 = (window) => {
|
|
|
368
438
|
resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null
|
|
369
439
|
};
|
|
370
440
|
};
|
|
371
|
-
var fetchOpenaiUsage = async () => {
|
|
372
|
-
const auth = await getOpenaiAuth();
|
|
441
|
+
var fetchOpenaiUsage = async (logger = noopLogger) => {
|
|
442
|
+
const auth = await getOpenaiAuth(logger);
|
|
373
443
|
if (!auth) {
|
|
444
|
+
await logger.warn("No auth configured for openai");
|
|
374
445
|
return {
|
|
375
446
|
provider: "openai",
|
|
376
447
|
ok: false,
|
|
@@ -381,6 +452,7 @@ var fetchOpenaiUsage = async () => {
|
|
|
381
452
|
}
|
|
382
453
|
const accessToken = auth.access ?? auth.token;
|
|
383
454
|
if (!accessToken) {
|
|
455
|
+
await logger.warn("Auth configured but access token missing for openai");
|
|
384
456
|
return {
|
|
385
457
|
provider: "openai",
|
|
386
458
|
ok: false,
|
|
@@ -398,6 +470,9 @@ var fetchOpenaiUsage = async () => {
|
|
|
398
470
|
}
|
|
399
471
|
});
|
|
400
472
|
if (!response.ok) {
|
|
473
|
+
await logger.error(`API error ${response.status} for openai`, {
|
|
474
|
+
token: maskSecret(accessToken)
|
|
475
|
+
});
|
|
401
476
|
return {
|
|
402
477
|
provider: "openai",
|
|
403
478
|
ok: false,
|
|
@@ -419,6 +494,7 @@ var fetchOpenaiUsage = async () => {
|
|
|
419
494
|
const usage = {
|
|
420
495
|
windows
|
|
421
496
|
};
|
|
497
|
+
await logger.info("openai usage fetched successfully");
|
|
422
498
|
return {
|
|
423
499
|
provider: "openai",
|
|
424
500
|
ok: true,
|
|
@@ -427,6 +503,7 @@ var fetchOpenaiUsage = async () => {
|
|
|
427
503
|
};
|
|
428
504
|
} catch (error) {
|
|
429
505
|
const message = error instanceof Error ? error.message : String(error);
|
|
506
|
+
await logger.error(`Request failed for openai: ${message}`);
|
|
430
507
|
return {
|
|
431
508
|
provider: "openai",
|
|
432
509
|
ok: false,
|
|
@@ -450,11 +527,11 @@ var resolveAuthValue = (entry) => {
|
|
|
450
527
|
}
|
|
451
528
|
return null;
|
|
452
529
|
};
|
|
453
|
-
var getZaiApiKey = async () => {
|
|
530
|
+
var getZaiApiKey = async (logger) => {
|
|
454
531
|
if (process.env.ZAI_API_KEY) {
|
|
455
532
|
return process.env.ZAI_API_KEY;
|
|
456
533
|
}
|
|
457
|
-
const auth = await loadOpenCodeAuth();
|
|
534
|
+
const auth = await loadOpenCodeAuth(logger);
|
|
458
535
|
if (!auth) {
|
|
459
536
|
return null;
|
|
460
537
|
}
|
|
@@ -518,9 +595,10 @@ var toWindow3 = (limit) => {
|
|
|
518
595
|
resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null
|
|
519
596
|
};
|
|
520
597
|
};
|
|
521
|
-
var fetchZaiUsage = async () => {
|
|
522
|
-
const apiKey = await getZaiApiKey();
|
|
598
|
+
var fetchZaiUsage = async (logger = noopLogger) => {
|
|
599
|
+
const apiKey = await getZaiApiKey(logger);
|
|
523
600
|
if (!apiKey) {
|
|
601
|
+
await logger.warn("No auth configured for zai-coding-plan");
|
|
524
602
|
return {
|
|
525
603
|
provider: "zai-coding-plan",
|
|
526
604
|
ok: false,
|
|
@@ -538,6 +616,9 @@ var fetchZaiUsage = async () => {
|
|
|
538
616
|
}
|
|
539
617
|
});
|
|
540
618
|
if (!response.ok) {
|
|
619
|
+
await logger.error(`API error ${response.status} for zai-coding-plan`, {
|
|
620
|
+
token: maskSecret(apiKey)
|
|
621
|
+
});
|
|
541
622
|
return {
|
|
542
623
|
provider: "zai-coding-plan",
|
|
543
624
|
ok: false,
|
|
@@ -558,6 +639,7 @@ var fetchZaiUsage = async () => {
|
|
|
558
639
|
const usage = {
|
|
559
640
|
windows
|
|
560
641
|
};
|
|
642
|
+
await logger.info("zai-coding-plan usage fetched successfully");
|
|
561
643
|
return {
|
|
562
644
|
provider: "zai-coding-plan",
|
|
563
645
|
ok: true,
|
|
@@ -566,6 +648,7 @@ var fetchZaiUsage = async () => {
|
|
|
566
648
|
};
|
|
567
649
|
} catch (error) {
|
|
568
650
|
const message = error instanceof Error ? error.message : String(error);
|
|
651
|
+
await logger.error(`Request failed for zai-coding-plan: ${message}`);
|
|
569
652
|
return {
|
|
570
653
|
provider: "zai-coding-plan",
|
|
571
654
|
ok: false,
|
|
@@ -623,17 +706,18 @@ var loadCommands = async () => {
|
|
|
623
706
|
await walkDir(commandDir);
|
|
624
707
|
return commands;
|
|
625
708
|
};
|
|
626
|
-
var fetchUsage = async (provider) => {
|
|
709
|
+
var fetchUsage = async (provider, logger) => {
|
|
627
710
|
switch (provider) {
|
|
628
711
|
case "openai":
|
|
629
|
-
return fetchOpenaiUsage();
|
|
712
|
+
return fetchOpenaiUsage(logger);
|
|
630
713
|
case "google":
|
|
631
|
-
return fetchGoogleUsage();
|
|
714
|
+
return fetchGoogleUsage(logger);
|
|
632
715
|
case "zai-coding-plan":
|
|
633
|
-
return fetchZaiUsage();
|
|
716
|
+
return fetchZaiUsage(logger);
|
|
634
717
|
}
|
|
635
718
|
};
|
|
636
|
-
var UsagePlugin = async () => {
|
|
719
|
+
var UsagePlugin = async ({ client }) => {
|
|
720
|
+
const logger = createLogger(client);
|
|
637
721
|
const commands = await loadCommands();
|
|
638
722
|
const usageTool = tool({
|
|
639
723
|
description: "Fetch subscription usage for OpenAI, Google, and z.ai providers.",
|
|
@@ -645,7 +729,8 @@ var UsagePlugin = async () => {
|
|
|
645
729
|
async execute(args) {
|
|
646
730
|
const targetProvider = parseProvider(args.provider);
|
|
647
731
|
const providers = targetProvider ? [targetProvider] : PROVIDERS;
|
|
648
|
-
|
|
732
|
+
await logger.info(`Fetching usage for: ${providers.join(", ")}`);
|
|
733
|
+
const results = await Promise.all(providers.map((provider) => fetchUsage(provider, logger)));
|
|
649
734
|
return JSON.stringify(results, null, 2);
|
|
650
735
|
}
|
|
651
736
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../src/providers/common/time.ts", "../src/providers/common/files.ts", "../src/providers/common/registry.ts", "../src/providers/google/auth.ts", "../src/providers/google/fetch.ts", "../src/providers/openai/auth.ts", "../src/providers/openai/fetch.ts", "../src/providers/zai-coding-plan/auth.ts", "../src/providers/zai-coding-plan/fetch.ts", "../src/types.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Plugin } from '@opencode-ai/plugin';\nimport { tool } from '@opencode-ai/plugin';\nimport { fileURLToPath } from 'node:url';\nimport { readdir, readFile } from 'node:fs/promises';\nimport path from 'path';\n\nimport { fetchGoogleUsage } from './providers/google/fetch.ts';\nimport { fetchOpenaiUsage } from './providers/openai/fetch.ts';\nimport { fetchZaiUsage } from './providers/zai-coding-plan/fetch.ts';\nimport { parseProvider } from './providers/common/registry.ts';\nimport { PROVIDERS, type ProviderId, type ProviderResult } from './types.ts';\n\ninterface CommandFrontmatter {\n description?: string;\n}\n\ninterface ParsedCommand {\n name: string;\n frontmatter: CommandFrontmatter;\n template: string;\n}\n\ninterface UsageArgs {\n provider?: string;\n}\n\nconst parseFrontmatter = (content: string): { frontmatter: CommandFrontmatter; body: string } => {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n if (!match) {\n return { frontmatter: {}, body: content.trim() };\n }\n\n const [, yamlContent, body] = match;\n const frontmatter: CommandFrontmatter = {};\n\n for (const line of yamlContent.split('\\n')) {\n const colonIndex = line.indexOf(':');\n if (colonIndex === -1) {\n continue;\n }\n\n const key = line.slice(0, colonIndex).trim();\n const value = line.slice(colonIndex + 1).trim();\n if (key === 'description') {\n frontmatter.description = value;\n }\n }\n\n return { frontmatter, body: body.trim() };\n};\n\nconst loadCommands = async (): Promise<ParsedCommand[]> => {\n const commands: ParsedCommand[] = [];\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n const commandDir = path.join(__dirname, 'command');\n\n const walkDir = async (dir: string, baseDir: string = dir): Promise<void> => {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n await walkDir(fullPath, baseDir);\n } else if (entry.name.endsWith('.md')) {\n const content = await readFile(fullPath, 'utf-8');\n const { frontmatter, body } = parseFrontmatter(content);\n const relativePath = path.relative(baseDir, fullPath);\n const name = relativePath.replace(/\\.md$/, '').replace(/\\//g, '-');\n commands.push({ name, frontmatter, template: body });\n }\n }\n };\n\n await walkDir(commandDir);\n return commands;\n};\n\nconst fetchUsage = async (provider: ProviderId): Promise<ProviderResult> => {\n switch (provider) {\n case 'openai':\n return fetchOpenaiUsage();\n case 'google':\n return fetchGoogleUsage();\n case 'zai-coding-plan':\n return fetchZaiUsage();\n }\n};\n\nexport const UsagePlugin: Plugin = async () => {\n const commands = await loadCommands();\n\n const usageTool = tool({\n description: 'Fetch subscription usage for OpenAI, Google, and z.ai providers.',\n args: {\n provider: tool.schema\n .string()\n .optional()\n .describe(\n 'Provider to check: openai, google, or zai-coding-plan. Aliases: codex, antigravity, zai.'\n ),\n },\n async execute(args: UsageArgs) {\n const targetProvider = parseProvider(args.provider);\n const providers: ProviderId[] = targetProvider ? [targetProvider] : PROVIDERS;\n const results = await Promise.all(providers.map(fetchUsage));\n\n return JSON.stringify(results, null, 2);\n },\n });\n\n return {\n tool: {\n usage: usageTool,\n },\n async config(config) {\n config.command = config.command ?? {};\n\n for (const cmd of commands) {\n config.command[cmd.name] = {\n template: cmd.template,\n description: cmd.frontmatter.description,\n };\n }\n },\n };\n};\n\nexport default UsagePlugin;\n", "export const calculateResetAfterSeconds = (\n resetAt: number | null,\n now: number = Date.now()\n): number | null => {\n if (!resetAt) {\n return null;\n }\n\n const diffMs = resetAt - now;\n if (diffMs <= 0) {\n return 0;\n }\n\n return Math.floor(diffMs / 1000);\n};\n\nexport const calculateResetAt = (\n resetAfterSeconds: number | null,\n now: number = Date.now()\n): number | null => {\n if (resetAfterSeconds === null || resetAfterSeconds === undefined) {\n return null;\n }\n\n return now + resetAfterSeconds * 1000;\n};\n\nexport const formatDuration = (seconds: number): string => {\n if (seconds <= 0) {\n return '0s';\n }\n\n const weeks = Math.floor(seconds / 604800);\n const days = Math.floor((seconds % 604800) / 86400);\n const hours = Math.floor((seconds % 86400) / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n const parts: string[] = [];\n if (weeks > 0) parts.push(`${weeks}w`);\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (secs > 0 || parts.length === 0) parts.push(`${secs}s`);\n\n return parts.join(' ');\n};\n\nexport const formatResetAt = (resetAtMs: number): string => {\n return new Date(resetAtMs).toLocaleString(undefined, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n timeZoneName: 'short',\n });\n};\n", "import { readFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nimport type { OpenCodeAuth } from '../../types.ts';\n\nexport const xdgDataHome = (): string =>\n process.env.XDG_DATA_HOME ?? join(homedir(), '.local', 'share');\n\nexport const xdgConfigHome = (): string =>\n process.env.XDG_CONFIG_HOME ?? join(homedir(), '.config');\n\nexport const AUTH_PATHS = {\n opencode: (): string => join(xdgDataHome(), 'opencode', 'auth.json'),\n openaiPlugin: (): string => join(homedir(), '.opencode', 'auth', 'openai.json'),\n antigravityConfig: (): string => join(xdgConfigHome(), 'opencode', 'antigravity-accounts.json'),\n antigravityData: (): string => join(xdgDataHome(), 'opencode', 'antigravity-accounts.json'),\n} as const;\n\nexport const readJson = async <T>(filePath: string): Promise<T | null> => {\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n};\n\nexport const loadOpenCodeAuth = async (): Promise<OpenCodeAuth | null> => {\n return readJson<OpenCodeAuth>(AUTH_PATHS.opencode());\n};\n", "import type { ProviderAlias, ProviderId } from '../../types.ts';\n\nexport const PROVIDER_ALIASES: Record<ProviderId, ProviderAlias[]> = {\n openai: ['openai', 'codex', 'chatgpt'],\n google: ['google', 'antigravity'],\n 'zai-coding-plan': ['zai-coding-plan', 'zai', 'z.ai'],\n};\n\nexport const parseProvider = (input?: string): ProviderId | null => {\n if (!input) {\n return null;\n }\n\n const normalized = input.trim().toLowerCase();\n for (const [providerId, aliases] of Object.entries(PROVIDER_ALIASES)) {\n if (aliases.includes(normalized as ProviderAlias)) {\n return providerId as ProviderId;\n }\n }\n\n return null;\n};\n\nexport const getProviderAliases = (provider: ProviderId): ProviderAlias[] => {\n return PROVIDER_ALIASES[provider];\n};\n", "import type {\n AntigravityAccount,\n AntigravityAccountsFile,\n OpenCodeAuth,\n ProviderAuthData,\n} from '../../types.ts';\nimport { AUTH_PATHS, loadOpenCodeAuth, readJson } from '../common/files.ts';\nimport { getProviderAliases } from '../common/registry.ts';\n\nexport interface GoogleAuthContext {\n refreshToken?: string;\n accessToken?: string;\n expires?: number;\n projectId?: string;\n email?: string;\n}\n\nconst toAuthData = (entry: OpenCodeAuth[string]): ProviderAuthData | null => {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n return { token: entry };\n }\n\n if (typeof entry === 'object') {\n return entry as ProviderAuthData;\n }\n\n return null;\n};\n\nconst loadOpenCodeAuthEntry = async (): Promise<ProviderAuthData | null> => {\n const auth = await loadOpenCodeAuth();\n if (!auth) {\n return null;\n }\n\n for (const alias of getProviderAliases('google')) {\n const entry = toAuthData(auth[alias]);\n if (entry) {\n return entry;\n }\n }\n\n return null;\n};\n\nconst toAuthContext = (entry: ProviderAuthData | null): GoogleAuthContext | null => {\n if (!entry) {\n return null;\n }\n\n const accessToken = entry.access ?? entry.token;\n const refreshToken = entry.refresh;\n\n if (!accessToken && !refreshToken) {\n return null;\n }\n\n return {\n accessToken,\n refreshToken,\n expires: entry.expires,\n };\n};\n\nconst selectAccount = (accounts: AntigravityAccountsFile | null): AntigravityAccount | null => {\n if (!accounts?.accounts?.length) {\n return null;\n }\n\n const candidateIndex = accounts.activeIndex ?? 0;\n const account = accounts.accounts[candidateIndex] ?? accounts.accounts[0];\n return account ?? null;\n};\n\nconst loadAuthFromAccounts = async (): Promise<GoogleAuthContext | null> => {\n const configAccounts = await readJson<AntigravityAccountsFile>(AUTH_PATHS.antigravityConfig());\n const account = selectAccount(configAccounts);\n if (account) {\n return {\n refreshToken: account.refreshToken,\n projectId: account.projectId ?? account.managedProjectId,\n email: account.email,\n };\n }\n\n const dataAccounts = await readJson<AntigravityAccountsFile>(AUTH_PATHS.antigravityData());\n const fallbackAccount = selectAccount(dataAccounts);\n if (!fallbackAccount) {\n return null;\n }\n\n return {\n refreshToken: fallbackAccount.refreshToken,\n projectId: fallbackAccount.projectId ?? fallbackAccount.managedProjectId,\n email: fallbackAccount.email,\n };\n};\n\nexport const getGoogleAuth = async (): Promise<GoogleAuthContext | null> => {\n const openCodeAuth = await loadOpenCodeAuthEntry();\n const authContext = toAuthContext(openCodeAuth);\n if (authContext) {\n return authContext;\n }\n\n return loadAuthFromAccounts();\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../../types.ts';\nimport { calculateResetAfterSeconds, formatDuration, formatResetAt } from '../common/time.ts';\nimport { getGoogleAuth } from './auth.ts';\n\nconst GOOGLE_CLIENT_ID =\n '1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com';\nconst GOOGLE_CLIENT_SECRET = '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';\nconst DEFAULT_PROJECT_ID = 'rising-fact-p41fc';\nconst WINDOW_SECONDS = 5 * 60 * 60;\n\nconst ENDPOINTS: readonly string[] = [\n 'https://daily-cloudcode-pa.sandbox.googleapis.com',\n 'https://autopush-cloudcode-pa.sandbox.googleapis.com',\n 'https://cloudcode-pa.googleapis.com',\n];\n\nconst HEADERS = {\n 'User-Agent': 'antigravity/1.11.5 windows/amd64',\n 'X-Goog-Api-Client': 'google-cloud-sdk vscode_cloudshelleditor/0.1',\n 'Client-Metadata':\n '{\"ideType\":\"IDE_UNSPECIFIED\",\"platform\":\"PLATFORM_UNSPECIFIED\",\"pluginType\":\"GEMINI\"}',\n} as const;\n\ninterface TokenResponse {\n access_token: string;\n expires_in?: number;\n}\n\ninterface ModelUsageInfoResponse {\n displayName?: string;\n quotaInfo?: {\n remainingFraction?: number;\n resetTime?: string;\n };\n}\n\ninterface ModelsResponse {\n models?: Record<string, ModelUsageInfoResponse>;\n}\n\nconst refreshAccessToken = async (refreshToken: string): Promise<TokenResponse | null> => {\n try {\n const response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n client_id: GOOGLE_CLIENT_ID,\n client_secret: GOOGLE_CLIENT_SECRET,\n refresh_token: refreshToken,\n grant_type: 'refresh_token',\n }),\n });\n\n if (!response.ok) {\n return null;\n }\n\n return (await response.json()) as TokenResponse;\n } catch {\n return null;\n }\n};\n\nconst fetchModels = async (\n accessToken: string,\n projectId?: string\n): Promise<ModelsResponse | null> => {\n const body = projectId ? { project: projectId } : {};\n\n for (const endpoint of ENDPOINTS) {\n try {\n const response = await fetch(`${endpoint}/v1internal:fetchAvailableModels`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n ...HEADERS,\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(15000),\n });\n\n if (response.ok) {\n return (await response.json()) as ModelsResponse;\n }\n } catch {\n continue;\n }\n }\n\n return null;\n};\n\nconst toWindow = (remainingFraction?: number, resetTime?: string): UsageWindow => {\n const remainingPercent =\n remainingFraction !== undefined ? Math.round(remainingFraction * 100) : null;\n const usedPercent = remainingPercent !== null ? Math.max(0, 100 - remainingPercent) : null;\n const resetAt = resetTime ? new Date(resetTime).getTime() : null;\n const resetAfterSeconds = calculateResetAfterSeconds(resetAt);\n\n return {\n usedPercent,\n remainingPercent,\n windowSeconds: WINDOW_SECONDS,\n resetAfterSeconds,\n resetAt,\n resetAtFormatted: resetAt ? formatResetAt(resetAt) : null,\n resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null,\n };\n};\n\nconst buildUsage = (data: ModelsResponse): ProviderUsage => {\n const models: Record<string, { windows: Record<string, UsageWindow> }> = {};\n\n for (const [modelName, modelData] of Object.entries(data.models ?? {})) {\n const window = toWindow(modelData.quotaInfo?.remainingFraction, modelData.quotaInfo?.resetTime);\n models[modelName] = {\n windows: {\n '5h': window,\n },\n };\n }\n\n return {\n windows: {},\n models: Object.keys(models).length ? models : undefined,\n };\n};\n\nconst resolveAccessToken = async (\n refreshToken?: string,\n accessToken?: string,\n expires?: number\n): Promise<string | null> => {\n const now = Date.now();\n\n if (accessToken && (!expires || expires > now)) {\n return accessToken;\n }\n\n if (!refreshToken) {\n return null;\n }\n\n const refreshed = await refreshAccessToken(refreshToken);\n return refreshed?.access_token ?? null;\n};\n\nexport const fetchGoogleUsage = async (): Promise<ProviderResult> => {\n const auth = await getGoogleAuth();\n\n if (!auth) {\n return {\n provider: 'google',\n ok: false,\n configured: false,\n error: 'Not configured - no accounts found',\n usage: null,\n };\n }\n\n const accessToken = await resolveAccessToken(auth.refreshToken, auth.accessToken, auth.expires);\n\n if (!accessToken) {\n return {\n provider: 'google',\n ok: false,\n configured: true,\n error: 'Failed to refresh OAuth token',\n usage: null,\n };\n }\n\n const projectId = auth.projectId ?? DEFAULT_PROJECT_ID;\n const modelsData = await fetchModels(accessToken, projectId);\n\n if (!modelsData) {\n return {\n provider: 'google',\n ok: false,\n configured: true,\n error: 'Failed to fetch models from API',\n usage: null,\n };\n }\n\n return {\n provider: 'google',\n ok: true,\n configured: true,\n usage: buildUsage(modelsData),\n };\n};\n", "import type { OpenCodeAuth, ProviderAuthData } from '../../types.ts';\nimport { AUTH_PATHS, loadOpenCodeAuth, readJson } from '../common/files.ts';\nimport { getProviderAliases } from '../common/registry.ts';\n\nconst toAuthData = (entry: OpenCodeAuth[string]): ProviderAuthData | null => {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n return { token: entry };\n }\n\n if (typeof entry === 'object') {\n return entry as ProviderAuthData;\n }\n\n return null;\n};\n\nconst hasAccessToken = (auth: ProviderAuthData | null): auth is ProviderAuthData => {\n return Boolean(auth?.access || auth?.token);\n};\n\nconst loadOpenCodeAuthEntry = async (): Promise<ProviderAuthData | null> => {\n const auth = await loadOpenCodeAuth();\n if (!auth) {\n return null;\n }\n\n for (const alias of getProviderAliases('openai')) {\n const entry = toAuthData(auth[alias]);\n if (entry && hasAccessToken(entry)) {\n return entry;\n }\n }\n\n return null;\n};\n\nexport const getOpenaiAuth = async (): Promise<ProviderAuthData | null> => {\n const openCodeAuth = await loadOpenCodeAuthEntry();\n if (openCodeAuth && hasAccessToken(openCodeAuth)) {\n return openCodeAuth;\n }\n\n const pluginAuth = await readJson<ProviderAuthData>(AUTH_PATHS.openaiPlugin());\n if (pluginAuth && hasAccessToken(pluginAuth)) {\n return pluginAuth;\n }\n\n return null;\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../../types.ts';\nimport { calculateResetAfterSeconds, formatDuration, formatResetAt } from '../common/time.ts';\nimport { getOpenaiAuth } from './auth.ts';\n\ninterface OpenaiBackendWindow {\n used_percent: number;\n limit_window_seconds: number;\n reset_after_seconds: number;\n reset_at: number;\n}\n\ninterface OpenaiBackendResponse {\n plan_type: string;\n rate_limit: {\n allowed: boolean;\n limit_reached: boolean;\n primary_window?: OpenaiBackendWindow;\n secondary_window?: OpenaiBackendWindow;\n };\n}\n\nconst toWindow = (window?: OpenaiBackendWindow): UsageWindow | null => {\n if (!window) {\n return null;\n }\n\n const usedPercent = window.used_percent;\n const resetAt = window.reset_at ? window.reset_at * 1000 : null;\n const resetAfterSeconds = window.reset_after_seconds ?? calculateResetAfterSeconds(resetAt);\n\n return {\n usedPercent,\n remainingPercent: Math.max(0, 100 - usedPercent),\n windowSeconds: window.limit_window_seconds ?? null,\n resetAfterSeconds,\n resetAt,\n resetAtFormatted: resetAt ? formatResetAt(resetAt) : null,\n resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null,\n };\n};\n\nexport const fetchOpenaiUsage = async (): Promise<ProviderResult> => {\n const auth = await getOpenaiAuth();\n\n if (!auth) {\n return {\n provider: 'openai',\n ok: false,\n configured: false,\n error: 'Not configured - no OAuth token found',\n usage: null,\n };\n }\n\n const accessToken = auth.access ?? auth.token;\n if (!accessToken) {\n return {\n provider: 'openai',\n ok: false,\n configured: false,\n error: 'Not configured - access token missing',\n usage: null,\n };\n }\n\n try {\n const response = await fetch('https://chatgpt.com/backend-api/wham/usage', {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n return {\n provider: 'openai',\n ok: false,\n configured: true,\n error: `API error: ${response.status}`,\n usage: null,\n };\n }\n\n const payload = (await response.json()) as OpenaiBackendResponse;\n const primary = toWindow(payload.rate_limit.primary_window);\n const secondary = toWindow(payload.rate_limit.secondary_window);\n\n const windows: Record<string, UsageWindow> = {};\n if (primary) {\n windows['5h'] = primary;\n }\n if (secondary) {\n windows['weekly'] = secondary;\n }\n\n const usage: ProviderUsage = {\n windows,\n };\n\n return {\n provider: 'openai',\n ok: true,\n configured: true,\n usage,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n provider: 'openai',\n ok: false,\n configured: true,\n error: `Request failed: ${message}`,\n usage: null,\n };\n }\n};\n", "import type { OpenCodeAuth } from '../../types.ts';\nimport { loadOpenCodeAuth } from '../common/files.ts';\nimport { getProviderAliases } from '../common/registry.ts';\n\nconst resolveAuthValue = (entry: OpenCodeAuth[string]): string | null => {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n return entry;\n }\n\n if (typeof entry === 'object') {\n return entry.api_key ?? entry.token ?? entry.key ?? null;\n }\n\n return null;\n};\n\nexport const getZaiApiKey = async (): Promise<string | null> => {\n if (process.env.ZAI_API_KEY) {\n return process.env.ZAI_API_KEY;\n }\n\n const auth = await loadOpenCodeAuth();\n if (!auth) {\n return null;\n }\n\n for (const alias of getProviderAliases('zai-coding-plan')) {\n const value = resolveAuthValue(auth[alias]);\n if (value) {\n return value;\n }\n }\n\n return null;\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../../types.ts';\nimport { calculateResetAfterSeconds, formatDuration, formatResetAt } from '../common/time.ts';\nimport { getZaiApiKey } from './auth.ts';\n\ninterface ZaiLimit {\n type: 'TIME_LIMIT' | 'TOKENS_LIMIT';\n unit: number;\n number: number;\n usage: number;\n currentValue: number;\n remaining: number;\n percentage: number;\n nextResetTime?: number;\n}\n\ninterface ZaiUsageResponse {\n code: number;\n msg: string;\n data?: {\n limits?: ZaiLimit[];\n };\n success: boolean;\n}\n\nconst normalizeTimestamp = (value: number): number => {\n return value < 1_000_000_000_000 ? value * 1000 : value;\n};\n\nconst TOKEN_WINDOW_SECONDS: Record<number, number> = {\n 3: 3600,\n};\n\nconst resolveWindowSeconds = (limit?: ZaiLimit): number | null => {\n if (!limit) {\n return null;\n }\n\n if (!limit.number) {\n return null;\n }\n\n const unitSeconds = TOKEN_WINDOW_SECONDS[limit.unit];\n if (!unitSeconds) {\n return null;\n }\n\n return unitSeconds * limit.number;\n};\n\nconst resolveWindowLabel = (windowSeconds: number | null): string => {\n if (!windowSeconds) {\n return 'tokens';\n }\n\n if (windowSeconds % 86400 === 0) {\n const days = windowSeconds / 86400;\n return days === 7 ? 'weekly' : `${days}d`;\n }\n\n if (windowSeconds % 3600 === 0) {\n return `${windowSeconds / 3600}h`;\n }\n\n return `${windowSeconds}s`;\n};\n\nconst toWindow = (limit?: ZaiLimit): UsageWindow | null => {\n if (!limit) {\n return null;\n }\n\n const usedPercent = limit.percentage ?? null;\n const remainingPercent = usedPercent !== null ? Math.max(0, 100 - usedPercent) : null;\n const resetAt = limit.nextResetTime ? normalizeTimestamp(limit.nextResetTime) : null;\n const resetAfterSeconds = calculateResetAfterSeconds(resetAt);\n\n return {\n usedPercent,\n remainingPercent,\n windowSeconds: resolveWindowSeconds(limit),\n resetAfterSeconds,\n resetAt,\n resetAtFormatted: resetAt ? formatResetAt(resetAt) : null,\n resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null,\n };\n};\n\nexport const fetchZaiUsage = async (): Promise<ProviderResult> => {\n const apiKey = await getZaiApiKey();\n\n if (!apiKey) {\n return {\n provider: 'zai-coding-plan',\n ok: false,\n configured: false,\n error: 'Not configured - no API key found',\n usage: null,\n };\n }\n\n try {\n const response = await fetch('https://api.z.ai/api/monitor/usage/quota/limit', {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n return {\n provider: 'zai-coding-plan',\n ok: false,\n configured: true,\n error: `API error: ${response.status}`,\n usage: null,\n };\n }\n\n const payload = (await response.json()) as ZaiUsageResponse;\n const limits = payload.data?.limits ?? [];\n const tokensLimit = limits.find((limit) => limit.type === 'TOKENS_LIMIT');\n\n const windows: Record<string, UsageWindow> = {};\n const window = toWindow(tokensLimit);\n if (window) {\n const label = resolveWindowLabel(window.windowSeconds);\n windows[label] = window;\n }\n\n const usage: ProviderUsage = {\n windows,\n };\n\n return {\n provider: 'zai-coding-plan',\n ok: true,\n configured: true,\n usage,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n provider: 'zai-coding-plan',\n ok: false,\n configured: true,\n error: `Request failed: ${message}`,\n usage: null,\n };\n }\n};\n", "export type ProviderId = 'openai' | 'google' | 'zai-coding-plan';\n\nexport type ProviderAlias = ProviderId | 'codex' | 'antigravity' | 'zai' | 'z.ai' | 'chatgpt';\n\nexport const PROVIDERS: ProviderId[] = ['openai', 'google', 'zai-coding-plan'];\n\nexport interface UsageWindow {\n usedPercent: number | null;\n remainingPercent: number | null;\n windowSeconds: number | null;\n resetAfterSeconds: number | null;\n resetAt: number | null;\n resetAtFormatted: string | null;\n resetAfterFormatted: string | null;\n}\n\nexport interface UsageWindows {\n windows: Record<string, UsageWindow>;\n}\n\nexport interface ProviderUsage extends UsageWindows {\n models?: Record<string, UsageWindows>;\n}\n\nexport interface ProviderResult {\n provider: ProviderId;\n ok: boolean;\n configured: boolean;\n error?: string;\n usage: ProviderUsage | null;\n}\n\nexport type OpenCodeAuth = Record<string, string | ProviderAuthData>;\n\nexport interface ProviderAuthData {\n type?: 'oauth' | 'api' | string;\n access?: string;\n refresh?: string;\n expires?: number;\n api_key?: string;\n token?: string;\n key?: string;\n accountId?: string;\n}\n\nexport interface AntigravityAccount {\n email: string;\n refreshToken: string;\n projectId?: string;\n addedAt: number | string;\n lastUsed?: number;\n rateLimitResetTimes?: Record<string, number>;\n managedProjectId?: string;\n}\n\nexport interface AntigravityAccountsFile {\n version?: number;\n accounts: AntigravityAccount[];\n activeIndex?: number;\n activeIndexByFamily?: Record<string, number>;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
3
|
+
"sources": ["../src/index.ts", "../src/providers/common/logger.ts", "../src/providers/common/time.ts", "../src/providers/common/files.ts", "../src/providers/common/registry.ts", "../src/providers/google/auth.ts", "../src/providers/google/fetch.ts", "../src/providers/openai/auth.ts", "../src/providers/openai/fetch.ts", "../src/providers/zai-coding-plan/auth.ts", "../src/providers/zai-coding-plan/fetch.ts", "../src/types.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Plugin } from '@opencode-ai/plugin';\nimport { tool } from '@opencode-ai/plugin';\nimport { fileURLToPath } from 'node:url';\nimport { readdir, readFile } from 'node:fs/promises';\nimport path from 'path';\n\nimport { createLogger, type Logger } from './providers/common/logger.ts';\nimport { fetchGoogleUsage } from './providers/google/fetch.ts';\nimport { fetchOpenaiUsage } from './providers/openai/fetch.ts';\nimport { fetchZaiUsage } from './providers/zai-coding-plan/fetch.ts';\nimport { parseProvider } from './providers/common/registry.ts';\nimport { PROVIDERS, type ProviderId, type ProviderResult } from './types.ts';\n\ninterface CommandFrontmatter {\n description?: string;\n}\n\ninterface ParsedCommand {\n name: string;\n frontmatter: CommandFrontmatter;\n template: string;\n}\n\ninterface UsageArgs {\n provider?: string;\n}\n\nconst parseFrontmatter = (content: string): { frontmatter: CommandFrontmatter; body: string } => {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n if (!match) {\n return { frontmatter: {}, body: content.trim() };\n }\n\n const [, yamlContent, body] = match;\n const frontmatter: CommandFrontmatter = {};\n\n for (const line of yamlContent.split('\\n')) {\n const colonIndex = line.indexOf(':');\n if (colonIndex === -1) {\n continue;\n }\n\n const key = line.slice(0, colonIndex).trim();\n const value = line.slice(colonIndex + 1).trim();\n if (key === 'description') {\n frontmatter.description = value;\n }\n }\n\n return { frontmatter, body: body.trim() };\n};\n\nconst loadCommands = async (): Promise<ParsedCommand[]> => {\n const commands: ParsedCommand[] = [];\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n const commandDir = path.join(__dirname, 'command');\n\n const walkDir = async (dir: string, baseDir: string = dir): Promise<void> => {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n await walkDir(fullPath, baseDir);\n } else if (entry.name.endsWith('.md')) {\n const content = await readFile(fullPath, 'utf-8');\n const { frontmatter, body } = parseFrontmatter(content);\n const relativePath = path.relative(baseDir, fullPath);\n const name = relativePath.replace(/\\.md$/, '').replace(/\\//g, '-');\n commands.push({ name, frontmatter, template: body });\n }\n }\n };\n\n await walkDir(commandDir);\n return commands;\n};\n\nconst fetchUsage = async (provider: ProviderId, logger: Logger): Promise<ProviderResult> => {\n switch (provider) {\n case 'openai':\n return fetchOpenaiUsage(logger);\n case 'google':\n return fetchGoogleUsage(logger);\n case 'zai-coding-plan':\n return fetchZaiUsage(logger);\n }\n};\n\nexport const UsagePlugin: Plugin = async ({ client }) => {\n const logger = createLogger(client);\n const commands = await loadCommands();\n\n const usageTool = tool({\n description: 'Fetch subscription usage for OpenAI, Google, and z.ai providers.',\n args: {\n provider: tool.schema\n .string()\n .optional()\n .describe(\n 'Provider to check: openai, google, or zai-coding-plan. Aliases: codex, antigravity, zai.'\n ),\n },\n async execute(args: UsageArgs) {\n const targetProvider = parseProvider(args.provider);\n const providers: ProviderId[] = targetProvider ? [targetProvider] : PROVIDERS;\n\n await logger.info(`Fetching usage for: ${providers.join(', ')}`);\n\n const results = await Promise.all(providers.map((provider) => fetchUsage(provider, logger)));\n\n return JSON.stringify(results, null, 2);\n },\n });\n\n return {\n tool: {\n usage: usageTool,\n },\n async config(config) {\n config.command = config.command ?? {};\n\n for (const cmd of commands) {\n config.command[cmd.name] = {\n template: cmd.template,\n description: cmd.frontmatter.description,\n };\n }\n },\n };\n};\n\nexport default UsagePlugin;\n", "export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport interface Logger {\n debug: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n info: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n warn: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n error: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n}\n\nexport const maskSecret = (secret: string): string => {\n if (!secret || typeof secret !== 'string' || secret.length <= 8) {\n return '***';\n }\n return `${secret.slice(0, 4)}...${secret.slice(-4)}`;\n};\n\nconst noOpLogger: Logger = {\n debug: async () => {},\n info: async () => {},\n warn: async () => {},\n error: async () => {},\n};\n\ninterface LogOptions {\n service: string;\n level: LogLevel;\n message: string;\n extra?: Record<string, unknown>;\n}\n\ninterface OpenCodeClient {\n app: {\n log: (_options: LogOptions) => Promise<boolean> | { ok: boolean };\n };\n}\n\nexport const createLogger = (client: unknown): Logger => {\n const service = 'opencode-usage';\n\n return {\n debug: async (message, extra) => {\n await (client as OpenCodeClient).app.log({ service, level: 'debug', message, extra });\n },\n info: async (message, extra) => {\n await (client as OpenCodeClient).app.log({ service, level: 'info', message, extra });\n },\n warn: async (message, extra) => {\n await (client as OpenCodeClient).app.log({ service, level: 'warn', message, extra });\n },\n error: async (message, extra) => {\n await (client as OpenCodeClient).app.log({ service, level: 'error', message, extra });\n },\n };\n};\n\nexport const noopLogger = noOpLogger;\n", "export const calculateResetAfterSeconds = (\n resetAt: number | null,\n now: number = Date.now()\n): number | null => {\n if (!resetAt) {\n return null;\n }\n\n const diffMs = resetAt - now;\n if (diffMs <= 0) {\n return 0;\n }\n\n return Math.floor(diffMs / 1000);\n};\n\nexport const calculateResetAt = (\n resetAfterSeconds: number | null,\n now: number = Date.now()\n): number | null => {\n if (resetAfterSeconds === null || resetAfterSeconds === undefined) {\n return null;\n }\n\n return now + resetAfterSeconds * 1000;\n};\n\nexport const formatDuration = (seconds: number): string => {\n if (seconds <= 0) {\n return '0s';\n }\n\n const weeks = Math.floor(seconds / 604800);\n const days = Math.floor((seconds % 604800) / 86400);\n const hours = Math.floor((seconds % 86400) / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n const parts: string[] = [];\n if (weeks > 0) parts.push(`${weeks}w`);\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (secs > 0 || parts.length === 0) parts.push(`${secs}s`);\n\n return parts.join(' ');\n};\n\nexport const formatResetAt = (resetAtMs: number): string => {\n return new Date(resetAtMs).toLocaleString(undefined, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n timeZoneName: 'short',\n });\n};\n", "import { readFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nimport type { Logger } from './logger.ts';\nimport type { OpenCodeAuth } from '../../types.ts';\n\nexport const xdgDataHome = (): string =>\n process.env.XDG_DATA_HOME ?? join(homedir(), '.local', 'share');\n\nexport const xdgConfigHome = (): string =>\n process.env.XDG_CONFIG_HOME ?? join(homedir(), '.config');\n\nexport const AUTH_PATHS = {\n opencode: (): string => join(xdgDataHome(), 'opencode', 'auth.json'),\n openaiPlugin: (): string => join(homedir(), '.opencode', 'auth', 'openai.json'),\n antigravityConfig: (): string => join(xdgConfigHome(), 'opencode', 'antigravity-accounts.json'),\n antigravityData: (): string => join(xdgDataHome(), 'opencode', 'antigravity-accounts.json'),\n} as const;\n\nexport const readJson = async <T>(filePath: string, logger?: Logger): Promise<T | null> => {\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch (error) {\n if (logger) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.debug(`Auth file not found or invalid: ${filePath}`, { error: message });\n }\n return null;\n }\n};\n\nexport const loadOpenCodeAuth = async (logger?: Logger): Promise<OpenCodeAuth | null> => {\n return readJson<OpenCodeAuth>(AUTH_PATHS.opencode(), logger);\n};\n", "import type { ProviderAlias, ProviderId } from '../../types.ts';\n\nexport const PROVIDER_ALIASES: Record<ProviderId, ProviderAlias[]> = {\n openai: ['openai', 'codex', 'chatgpt'],\n google: ['google', 'antigravity'],\n 'zai-coding-plan': ['zai-coding-plan', 'zai', 'z.ai'],\n};\n\nexport const parseProvider = (input?: string): ProviderId | null => {\n if (!input) {\n return null;\n }\n\n const normalized = input.trim().toLowerCase();\n for (const [providerId, aliases] of Object.entries(PROVIDER_ALIASES)) {\n if (aliases.includes(normalized as ProviderAlias)) {\n return providerId as ProviderId;\n }\n }\n\n return null;\n};\n\nexport const getProviderAliases = (provider: ProviderId): ProviderAlias[] => {\n return PROVIDER_ALIASES[provider];\n};\n", "import type {\n AntigravityAccount,\n AntigravityAccountsFile,\n OpenCodeAuth,\n ProviderAuthData,\n} from '../../types.ts';\nimport type { Logger } from '../common/logger.ts';\nimport { AUTH_PATHS, loadOpenCodeAuth, readJson } from '../common/files.ts';\nimport { getProviderAliases } from '../common/registry.ts';\n\nexport interface GoogleAuthContext {\n refreshToken?: string;\n accessToken?: string;\n expires?: number;\n projectId?: string;\n email?: string;\n}\n\nconst toAuthData = (entry: OpenCodeAuth[string]): ProviderAuthData | null => {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n return { token: entry };\n }\n\n if (typeof entry === 'object') {\n return entry as ProviderAuthData;\n }\n\n return null;\n};\n\nconst loadOpenCodeAuthEntry = async (logger?: Logger): Promise<ProviderAuthData | null> => {\n const auth = await loadOpenCodeAuth(logger);\n if (!auth) {\n return null;\n }\n\n for (const alias of getProviderAliases('google')) {\n const entry = toAuthData(auth[alias]);\n if (entry) {\n return entry;\n }\n }\n\n return null;\n};\n\nconst toAuthContext = (entry: ProviderAuthData | null): GoogleAuthContext | null => {\n if (!entry) {\n return null;\n }\n\n const accessToken = entry.access ?? entry.token;\n let refreshToken = entry.refresh;\n let projectId: string | undefined = undefined;\n\n if (refreshToken && refreshToken.includes('|')) {\n const parts = refreshToken.split('|');\n refreshToken = parts[0];\n projectId = parts[1];\n }\n\n if (!accessToken && !refreshToken) {\n return null;\n }\n\n return {\n accessToken,\n refreshToken,\n expires: entry.expires,\n projectId,\n };\n};\n\nconst selectAccount = (accounts: AntigravityAccountsFile | null): AntigravityAccount | null => {\n if (!accounts?.accounts?.length) {\n return null;\n }\n\n const candidateIndex = accounts.activeIndex ?? 0;\n const account = accounts.accounts[candidateIndex] ?? accounts.accounts[0];\n return account ?? null;\n};\n\nconst loadAuthFromAccounts = async (logger?: Logger): Promise<GoogleAuthContext | null> => {\n const configAccounts = await readJson<AntigravityAccountsFile>(\n AUTH_PATHS.antigravityConfig(),\n logger\n );\n const account = selectAccount(configAccounts);\n if (account) {\n return {\n refreshToken: account.refreshToken,\n projectId: account.projectId ?? account.managedProjectId,\n email: account.email,\n };\n }\n\n const dataAccounts = await readJson<AntigravityAccountsFile>(\n AUTH_PATHS.antigravityData(),\n logger\n );\n const fallbackAccount = selectAccount(dataAccounts);\n if (!fallbackAccount) {\n return null;\n }\n\n return {\n refreshToken: fallbackAccount.refreshToken,\n projectId: fallbackAccount.projectId ?? fallbackAccount.managedProjectId,\n email: fallbackAccount.email,\n };\n};\n\nexport const getGoogleAuth = async (logger?: Logger): Promise<GoogleAuthContext | null> => {\n const openCodeAuth = await loadOpenCodeAuthEntry(logger);\n const authContext = toAuthContext(openCodeAuth);\n if (authContext) {\n return authContext;\n }\n\n return loadAuthFromAccounts(logger);\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../../types.ts';\nimport { maskSecret, type Logger, noopLogger } from '../common/logger.ts';\nimport { calculateResetAfterSeconds, formatDuration, formatResetAt } from '../common/time.ts';\nimport { getGoogleAuth } from './auth.ts';\n\nconst GOOGLE_CLIENT_ID =\n '1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com';\nconst GOOGLE_CLIENT_SECRET = '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';\nconst DEFAULT_PROJECT_ID = 'rising-fact-p41fc';\nconst WINDOW_SECONDS = 5 * 60 * 60;\n\nconst ENDPOINTS: readonly string[] = [\n 'https://daily-cloudcode-pa.sandbox.googleapis.com',\n 'https://autopush-cloudcode-pa.sandbox.googleapis.com',\n 'https://cloudcode-pa.googleapis.com',\n];\n\nconst HEADERS = {\n 'User-Agent': 'antigravity/1.11.5 windows/amd64',\n 'X-Goog-Api-Client': 'google-cloud-sdk vscode_cloudshelleditor/0.1',\n 'Client-Metadata':\n '{\"ideType\":\"IDE_UNSPECIFIED\",\"platform\":\"PLATFORM_UNSPECIFIED\",\"pluginType\":\"GEMINI\"}',\n} as const;\n\ninterface TokenResponse {\n access_token: string;\n expires_in?: number;\n}\n\ninterface ModelUsageInfoResponse {\n displayName?: string;\n quotaInfo?: {\n remainingFraction?: number;\n resetTime?: string;\n };\n}\n\ninterface ModelsResponse {\n models?: Record<string, ModelUsageInfoResponse>;\n}\n\nconst refreshAccessToken = async (\n refreshToken: string,\n logger: Logger\n): Promise<TokenResponse | null> => {\n try {\n const response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n client_id: GOOGLE_CLIENT_ID,\n client_secret: GOOGLE_CLIENT_SECRET,\n refresh_token: refreshToken,\n grant_type: 'refresh_token',\n }),\n });\n\n if (!response.ok) {\n await logger.warn('Failed to refresh OAuth token for google', {\n status: response.status,\n token: maskSecret(refreshToken),\n });\n return null;\n }\n\n return (await response.json()) as TokenResponse;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.warn(`Token refresh failed for google: ${message}`);\n return null;\n }\n};\n\nconst fetchModels = async (\n accessToken: string,\n projectId: string | undefined,\n logger: Logger\n): Promise<ModelsResponse | null> => {\n const body = projectId ? { project: projectId } : {};\n\n for (const endpoint of ENDPOINTS) {\n try {\n const response = await fetch(`${endpoint}/v1internal:fetchAvailableModels`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n ...HEADERS,\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(15000),\n });\n\n if (response.ok) {\n await logger.debug(`Fetched models from ${endpoint}`, { projectId });\n return (await response.json()) as ModelsResponse;\n }\n } catch {\n continue;\n }\n }\n\n await logger.error('Failed to fetch models from all google endpoints', { projectId });\n return null;\n};\n\nconst toWindow = (remainingFraction?: number, resetTime?: string): UsageWindow => {\n const remainingPercent =\n remainingFraction !== undefined ? Math.round(remainingFraction * 100) : null;\n const usedPercent = remainingPercent !== null ? Math.max(0, 100 - remainingPercent) : null;\n const resetAt = resetTime ? new Date(resetTime).getTime() : null;\n const resetAfterSeconds = calculateResetAfterSeconds(resetAt);\n\n return {\n usedPercent,\n remainingPercent,\n windowSeconds: WINDOW_SECONDS,\n resetAfterSeconds,\n resetAt,\n resetAtFormatted: resetAt ? formatResetAt(resetAt) : null,\n resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null,\n };\n};\n\nconst buildUsage = (data: ModelsResponse): ProviderUsage => {\n const models: Record<string, { windows: Record<string, UsageWindow> }> = {};\n\n for (const [modelName, modelData] of Object.entries(data.models ?? {})) {\n const window = toWindow(modelData.quotaInfo?.remainingFraction, modelData.quotaInfo?.resetTime);\n models[modelName] = {\n windows: {\n '5h': window,\n },\n };\n }\n\n return {\n windows: {},\n models: Object.keys(models).length ? models : undefined,\n };\n};\n\nconst resolveAccessToken = async (\n refreshToken: string | undefined,\n accessToken: string | undefined,\n expires: number | undefined,\n logger: Logger\n): Promise<string | null> => {\n const now = Date.now();\n\n if (accessToken && (!expires || expires > now)) {\n return accessToken;\n }\n\n if (!refreshToken) {\n return null;\n }\n\n const refreshed = await refreshAccessToken(refreshToken, logger);\n return refreshed?.access_token ?? null;\n};\n\nexport const fetchGoogleUsage = async (logger: Logger = noopLogger): Promise<ProviderResult> => {\n const auth = await getGoogleAuth(logger);\n\n if (!auth) {\n await logger.warn('No auth configured for google');\n return {\n provider: 'google',\n ok: false,\n configured: false,\n error: 'Not configured - no accounts found',\n usage: null,\n };\n }\n\n const accessToken = await resolveAccessToken(\n auth.refreshToken,\n auth.accessToken,\n auth.expires,\n logger\n );\n\n if (!accessToken) {\n await logger.warn('Failed to refresh OAuth token for google', { email: auth.email });\n return {\n provider: 'google',\n ok: false,\n configured: true,\n error: 'Failed to refresh OAuth token',\n usage: null,\n };\n }\n\n const projectId = auth.projectId ?? DEFAULT_PROJECT_ID;\n const modelsData = await fetchModels(accessToken, projectId, logger);\n\n if (!modelsData) {\n await logger.error('Failed to fetch models from google API', { projectId });\n return {\n provider: 'google',\n ok: false,\n configured: true,\n error: 'Failed to fetch models from API',\n usage: null,\n };\n }\n\n await logger.info('google usage fetched successfully');\n\n return {\n provider: 'google',\n ok: true,\n configured: true,\n usage: buildUsage(modelsData),\n };\n};\n", "import type { Logger } from '../common/logger.ts';\nimport type { OpenCodeAuth, ProviderAuthData } from '../../types.ts';\nimport { AUTH_PATHS, loadOpenCodeAuth, readJson } from '../common/files.ts';\nimport { getProviderAliases } from '../common/registry.ts';\n\nconst toAuthData = (entry: OpenCodeAuth[string]): ProviderAuthData | null => {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n return { token: entry };\n }\n\n if (typeof entry === 'object') {\n return entry as ProviderAuthData;\n }\n\n return null;\n};\n\nconst hasAccessToken = (auth: ProviderAuthData | null): auth is ProviderAuthData => {\n return Boolean(auth?.access || auth?.token);\n};\n\nconst loadOpenCodeAuthEntry = async (logger?: Logger): Promise<ProviderAuthData | null> => {\n const auth = await loadOpenCodeAuth(logger);\n if (!auth) {\n return null;\n }\n\n for (const alias of getProviderAliases('openai')) {\n const entry = toAuthData(auth[alias]);\n if (entry && hasAccessToken(entry)) {\n return entry;\n }\n }\n\n return null;\n};\n\nexport const getOpenaiAuth = async (logger?: Logger): Promise<ProviderAuthData | null> => {\n const openCodeAuth = await loadOpenCodeAuthEntry(logger);\n if (openCodeAuth && hasAccessToken(openCodeAuth)) {\n return openCodeAuth;\n }\n\n const pluginAuth = await readJson<ProviderAuthData>(AUTH_PATHS.openaiPlugin(), logger);\n if (pluginAuth && hasAccessToken(pluginAuth)) {\n return pluginAuth;\n }\n\n return null;\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../../types.ts';\nimport { maskSecret, type Logger, noopLogger } from '../common/logger.ts';\nimport { calculateResetAfterSeconds, formatDuration, formatResetAt } from '../common/time.ts';\nimport { getOpenaiAuth } from './auth.ts';\n\ninterface OpenaiBackendWindow {\n used_percent: number;\n limit_window_seconds: number;\n reset_after_seconds: number;\n reset_at: number;\n}\n\ninterface OpenaiBackendResponse {\n plan_type: string;\n rate_limit: {\n allowed: boolean;\n limit_reached: boolean;\n primary_window?: OpenaiBackendWindow;\n secondary_window?: OpenaiBackendWindow;\n };\n}\n\nconst toWindow = (window?: OpenaiBackendWindow): UsageWindow | null => {\n if (!window) {\n return null;\n }\n\n const usedPercent = window.used_percent;\n const resetAt = window.reset_at ? window.reset_at * 1000 : null;\n const resetAfterSeconds = window.reset_after_seconds ?? calculateResetAfterSeconds(resetAt);\n\n return {\n usedPercent,\n remainingPercent: Math.max(0, 100 - usedPercent),\n windowSeconds: window.limit_window_seconds ?? null,\n resetAfterSeconds,\n resetAt,\n resetAtFormatted: resetAt ? formatResetAt(resetAt) : null,\n resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null,\n };\n};\n\nexport const fetchOpenaiUsage = async (logger: Logger = noopLogger): Promise<ProviderResult> => {\n const auth = await getOpenaiAuth(logger);\n\n if (!auth) {\n await logger.warn('No auth configured for openai');\n return {\n provider: 'openai',\n ok: false,\n configured: false,\n error: 'Not configured - no OAuth token found',\n usage: null,\n };\n }\n\n const accessToken = auth.access ?? auth.token;\n if (!accessToken) {\n await logger.warn('Auth configured but access token missing for openai');\n return {\n provider: 'openai',\n ok: false,\n configured: false,\n error: 'Not configured - access token missing',\n usage: null,\n };\n }\n\n try {\n const response = await fetch('https://chatgpt.com/backend-api/wham/usage', {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n await logger.error(`API error ${response.status} for openai`, {\n token: maskSecret(accessToken),\n });\n return {\n provider: 'openai',\n ok: false,\n configured: true,\n error: `API error: ${response.status}`,\n usage: null,\n };\n }\n\n const payload = (await response.json()) as OpenaiBackendResponse;\n const primary = toWindow(payload.rate_limit.primary_window);\n const secondary = toWindow(payload.rate_limit.secondary_window);\n\n const windows: Record<string, UsageWindow> = {};\n if (primary) {\n windows['5h'] = primary;\n }\n if (secondary) {\n windows['weekly'] = secondary;\n }\n\n const usage: ProviderUsage = {\n windows,\n };\n\n await logger.info('openai usage fetched successfully');\n\n return {\n provider: 'openai',\n ok: true,\n configured: true,\n usage,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.error(`Request failed for openai: ${message}`);\n return {\n provider: 'openai',\n ok: false,\n configured: true,\n error: `Request failed: ${message}`,\n usage: null,\n };\n }\n};\n", "import type { Logger } from '../common/logger.ts';\nimport type { OpenCodeAuth } from '../../types.ts';\nimport { loadOpenCodeAuth } from '../common/files.ts';\nimport { getProviderAliases } from '../common/registry.ts';\n\nconst resolveAuthValue = (entry: OpenCodeAuth[string]): string | null => {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n return entry;\n }\n\n if (typeof entry === 'object') {\n return entry.api_key ?? entry.token ?? entry.key ?? null;\n }\n\n return null;\n};\n\nexport const getZaiApiKey = async (logger?: Logger): Promise<string | null> => {\n if (process.env.ZAI_API_KEY) {\n return process.env.ZAI_API_KEY;\n }\n\n const auth = await loadOpenCodeAuth(logger);\n if (!auth) {\n return null;\n }\n\n for (const alias of getProviderAliases('zai-coding-plan')) {\n const value = resolveAuthValue(auth[alias]);\n if (value) {\n return value;\n }\n }\n\n return null;\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../../types.ts';\nimport { maskSecret, type Logger, noopLogger } from '../common/logger.ts';\nimport { calculateResetAfterSeconds, formatDuration, formatResetAt } from '../common/time.ts';\nimport { getZaiApiKey } from './auth.ts';\n\ninterface ZaiLimit {\n type: 'TIME_LIMIT' | 'TOKENS_LIMIT';\n unit: number;\n number: number;\n usage: number;\n currentValue: number;\n remaining: number;\n percentage: number;\n nextResetTime?: number;\n}\n\ninterface ZaiUsageResponse {\n code: number;\n msg: string;\n data?: {\n limits?: ZaiLimit[];\n };\n success: boolean;\n}\n\nconst normalizeTimestamp = (value: number): number => {\n return value < 1_000_000_000_000 ? value * 1000 : value;\n};\n\nconst TOKEN_WINDOW_SECONDS: Record<number, number> = {\n 3: 3600,\n};\n\nconst resolveWindowSeconds = (limit?: ZaiLimit): number | null => {\n if (!limit) {\n return null;\n }\n\n if (!limit.number) {\n return null;\n }\n\n const unitSeconds = TOKEN_WINDOW_SECONDS[limit.unit];\n if (!unitSeconds) {\n return null;\n }\n\n return unitSeconds * limit.number;\n};\n\nconst resolveWindowLabel = (windowSeconds: number | null): string => {\n if (!windowSeconds) {\n return 'tokens';\n }\n\n if (windowSeconds % 86400 === 0) {\n const days = windowSeconds / 86400;\n return days === 7 ? 'weekly' : `${days}d`;\n }\n\n if (windowSeconds % 3600 === 0) {\n return `${windowSeconds / 3600}h`;\n }\n\n return `${windowSeconds}s`;\n};\n\nconst toWindow = (limit?: ZaiLimit): UsageWindow | null => {\n if (!limit) {\n return null;\n }\n\n const usedPercent = limit.percentage ?? null;\n const remainingPercent = usedPercent !== null ? Math.max(0, 100 - usedPercent) : null;\n const resetAt = limit.nextResetTime ? normalizeTimestamp(limit.nextResetTime) : null;\n const resetAfterSeconds = calculateResetAfterSeconds(resetAt);\n\n return {\n usedPercent,\n remainingPercent,\n windowSeconds: resolveWindowSeconds(limit),\n resetAfterSeconds,\n resetAt,\n resetAtFormatted: resetAt ? formatResetAt(resetAt) : null,\n resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null,\n };\n};\n\nexport const fetchZaiUsage = async (logger: Logger = noopLogger): Promise<ProviderResult> => {\n const apiKey = await getZaiApiKey(logger);\n\n if (!apiKey) {\n await logger.warn('No auth configured for zai-coding-plan');\n return {\n provider: 'zai-coding-plan',\n ok: false,\n configured: false,\n error: 'Not configured - no API key found',\n usage: null,\n };\n }\n\n try {\n const response = await fetch('https://api.z.ai/api/monitor/usage/quota/limit', {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n await logger.error(`API error ${response.status} for zai-coding-plan`, {\n token: maskSecret(apiKey),\n });\n return {\n provider: 'zai-coding-plan',\n ok: false,\n configured: true,\n error: `API error: ${response.status}`,\n usage: null,\n };\n }\n\n const payload = (await response.json()) as ZaiUsageResponse;\n const limits = payload.data?.limits ?? [];\n const tokensLimit = limits.find((limit) => limit.type === 'TOKENS_LIMIT');\n\n const windows: Record<string, UsageWindow> = {};\n const window = toWindow(tokensLimit);\n if (window) {\n const label = resolveWindowLabel(window.windowSeconds);\n windows[label] = window;\n }\n\n const usage: ProviderUsage = {\n windows,\n };\n\n await logger.info('zai-coding-plan usage fetched successfully');\n\n return {\n provider: 'zai-coding-plan',\n ok: true,\n configured: true,\n usage,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.error(`Request failed for zai-coding-plan: ${message}`);\n return {\n provider: 'zai-coding-plan',\n ok: false,\n configured: true,\n error: `Request failed: ${message}`,\n usage: null,\n };\n }\n};\n", "export type ProviderId = 'openai' | 'google' | 'zai-coding-plan';\n\nexport type ProviderAlias = ProviderId | 'codex' | 'antigravity' | 'zai' | 'z.ai' | 'chatgpt';\n\nexport const PROVIDERS: ProviderId[] = ['openai', 'google', 'zai-coding-plan'];\n\nexport interface UsageWindow {\n usedPercent: number | null;\n remainingPercent: number | null;\n windowSeconds: number | null;\n resetAfterSeconds: number | null;\n resetAt: number | null;\n resetAtFormatted: string | null;\n resetAfterFormatted: string | null;\n}\n\nexport interface UsageWindows {\n windows: Record<string, UsageWindow>;\n}\n\nexport interface ProviderUsage extends UsageWindows {\n models?: Record<string, UsageWindows>;\n}\n\nexport interface ProviderResult {\n provider: ProviderId;\n ok: boolean;\n configured: boolean;\n error?: string;\n usage: ProviderUsage | null;\n}\n\nexport type OpenCodeAuth = Record<string, string | ProviderAuthData>;\n\nexport interface ProviderAuthData {\n type?: 'oauth' | 'api' | string;\n access?: string;\n refresh?: string;\n expires?: number;\n api_key?: string;\n token?: string;\n key?: string;\n accountId?: string;\n}\n\nexport interface AntigravityAccount {\n email: string;\n refreshToken: string;\n projectId?: string;\n addedAt: number | string;\n lastUsed?: number;\n rateLimitResetTimes?: Record<string, number>;\n managedProjectId?: string;\n}\n\nexport interface AntigravityAccountsFile {\n version?: number;\n accounts: AntigravityAccount[];\n activeIndex?: number;\n activeIndexByFamily?: Record<string, number>;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["readFile", "toAuthData", "loadOpenCodeAuthEntry", "toWindow", "toWindow", "readFile"]
|
|
7
7
|
}
|