@ravshansbox/pi-quota 0.10.4 → 0.10.6
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/index.ts +21 -9
- package/package.json +1 -1
package/index.ts
CHANGED
|
@@ -17,6 +17,7 @@ interface QuotaState {
|
|
|
17
17
|
fiveHourReset: Date | null;
|
|
18
18
|
sevenDayUsed: number | null;
|
|
19
19
|
sevenDayReset: Date | null;
|
|
20
|
+
sevenDayExhausted: boolean;
|
|
20
21
|
resetsAvailable: number;
|
|
21
22
|
resetSoonestExpiry: Date | null;
|
|
22
23
|
lastUpdated: Date;
|
|
@@ -132,6 +133,7 @@ function parseAnthropicHeaders(headers: Record<string, string>): QuotaState | nu
|
|
|
132
133
|
fiveHourReset: fiveHour.reset,
|
|
133
134
|
sevenDayUsed: sevenDay.used,
|
|
134
135
|
sevenDayReset: sevenDay.reset,
|
|
136
|
+
sevenDayExhausted: false,
|
|
135
137
|
resetsAvailable: 0,
|
|
136
138
|
resetSoonestExpiry: null,
|
|
137
139
|
lastUpdated: new Date(),
|
|
@@ -325,6 +327,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
325
327
|
existing.fiveHourReset = parsed.fiveHourReset;
|
|
326
328
|
existing.sevenDayUsed = parsed.sevenDayUsed;
|
|
327
329
|
existing.sevenDayReset = parsed.sevenDayReset;
|
|
330
|
+
existing.sevenDayExhausted = parsed.sevenDayExhausted;
|
|
328
331
|
existing.resetsAvailable = parsed.resetsAvailable;
|
|
329
332
|
existing.resetSoonestExpiry = parsed.resetSoonestExpiry;
|
|
330
333
|
existing.lastUpdated = parsed.lastUpdated;
|
|
@@ -428,20 +431,27 @@ export default function (pi: ExtensionAPI) {
|
|
|
428
431
|
}
|
|
429
432
|
}
|
|
430
433
|
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
+
function soonestCodexResetCredit(
|
|
435
|
+
creditList: CodexResetCreditList,
|
|
436
|
+
): { credit: CodexResetCredit; expiry: Date | null } | null {
|
|
434
437
|
const now = Date.now();
|
|
435
|
-
|
|
438
|
+
const time = (expiry: Date | null) => expiry?.getTime() ?? Infinity;
|
|
439
|
+
let soonest: { credit: CodexResetCredit; expiry: Date | null } | null = null;
|
|
436
440
|
for (const credit of creditList.credits) {
|
|
437
441
|
if (credit.status && credit.status !== 'available') continue;
|
|
438
442
|
const expiry = parseCreditExpiry(credit.expires_at);
|
|
439
|
-
if (
|
|
440
|
-
if (!soonest || expiry
|
|
443
|
+
if (expiry && expiry.getTime() <= now) continue;
|
|
444
|
+
if (!soonest || time(expiry) < time(soonest.expiry)) soonest = { credit, expiry };
|
|
441
445
|
}
|
|
442
446
|
return soonest;
|
|
443
447
|
}
|
|
444
448
|
|
|
449
|
+
async function fetchCodexSoonestResetExpiry(accessToken: string): Promise<Date | null> {
|
|
450
|
+
const creditList = await listCodexResetCredits(accessToken);
|
|
451
|
+
if (!creditList) return null;
|
|
452
|
+
return soonestCodexResetCredit(creditList)?.expiry ?? null;
|
|
453
|
+
}
|
|
454
|
+
|
|
445
455
|
async function consumeCodexResetCredit(
|
|
446
456
|
accessToken: string,
|
|
447
457
|
creditId: string,
|
|
@@ -505,6 +515,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
505
515
|
fiveHourReset: fiveHour?.resets_at ? new Date(fiveHour.resets_at) : null,
|
|
506
516
|
sevenDayUsed: sevenDay ? clampPercent(sevenDay.utilization ?? 0) : null,
|
|
507
517
|
sevenDayReset: sevenDay?.resets_at ? new Date(sevenDay.resets_at) : null,
|
|
518
|
+
sevenDayExhausted: false,
|
|
508
519
|
resetsAvailable: 0,
|
|
509
520
|
resetSoonestExpiry: null,
|
|
510
521
|
lastUpdated: new Date(),
|
|
@@ -548,6 +559,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
548
559
|
fiveHourReset: fiveHour?.reset_at ? new Date(fiveHour.reset_at * 1000) : null,
|
|
549
560
|
sevenDayUsed: sevenDay ? clampPercent(sevenDay.used_percent ?? 0) : null,
|
|
550
561
|
sevenDayReset: sevenDay?.reset_at ? new Date(sevenDay.reset_at * 1000) : null,
|
|
562
|
+
sevenDayExhausted: (sevenDay?.used_percent ?? 0) >= 100,
|
|
551
563
|
resetsAvailable: resetCount,
|
|
552
564
|
resetSoonestExpiry:
|
|
553
565
|
resetCount > 0 ? await fetchCodexSoonestResetExpiry(openaiAuth.access) : null,
|
|
@@ -570,11 +582,11 @@ export default function (pi: ExtensionAPI) {
|
|
|
570
582
|
const codexState = states.find((s) => s.provider === 'openai-codex');
|
|
571
583
|
if (!codexState) return;
|
|
572
584
|
|
|
573
|
-
if (codexState.sevenDayUsed !== null && codexState.
|
|
585
|
+
if (codexState.sevenDayUsed !== null && !codexState.sevenDayExhausted) {
|
|
574
586
|
codexRedeemAttempted = false;
|
|
575
587
|
}
|
|
576
588
|
|
|
577
|
-
if (codexState.
|
|
589
|
+
if (!codexState.sevenDayExhausted) return;
|
|
578
590
|
if (codexState.resetsAvailable === 0) return;
|
|
579
591
|
if (codexRedeemAttempted) return;
|
|
580
592
|
|
|
@@ -594,7 +606,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
594
606
|
return;
|
|
595
607
|
}
|
|
596
608
|
|
|
597
|
-
const availableCredit = creditList
|
|
609
|
+
const availableCredit = soonestCodexResetCredit(creditList)?.credit;
|
|
598
610
|
if (!availableCredit) {
|
|
599
611
|
logError('No available reset credit found');
|
|
600
612
|
return;
|