@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.
Files changed (2) hide show
  1. package/index.ts +21 -9
  2. 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
- async function fetchCodexSoonestResetExpiry(accessToken: string): Promise<Date | null> {
432
- const creditList = await listCodexResetCredits(accessToken);
433
- if (!creditList) return null;
434
+ function soonestCodexResetCredit(
435
+ creditList: CodexResetCreditList,
436
+ ): { credit: CodexResetCredit; expiry: Date | null } | null {
434
437
  const now = Date.now();
435
- let soonest: Date | null = null;
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 (!expiry || expiry.getTime() <= now) continue;
440
- if (!soonest || expiry.getTime() < soonest.getTime()) 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.sevenDayUsed < 100) {
585
+ if (codexState.sevenDayUsed !== null && !codexState.sevenDayExhausted) {
574
586
  codexRedeemAttempted = false;
575
587
  }
576
588
 
577
- if (codexState.sevenDayUsed !== 100) return;
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.credits.find((c) => c.status === 'available' || !c.status);
609
+ const availableCredit = soonestCodexResetCredit(creditList)?.credit;
598
610
  if (!availableCredit) {
599
611
  logError('No available reset credit found');
600
612
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ravshansbox/pi-quota",
3
- "version": "0.10.4",
3
+ "version": "0.10.6",
4
4
  "description": "Anthropic and OpenAI Codex quota status extension for pi",
5
5
  "license": "MIT",
6
6
  "type": "module",