feat(codex): show reset credit expiry details (#2290)

Add read-only GET to inspect per-credit reset inventory (status, granted,
expiry, remaining) with a Quota Tracker modal. DRY the route via shared
connection/refresh helpers; keep existing consume POST unchanged.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Rafli Ahmad Zulfikar
2026-07-03 15:07:45 +07:00
committed by decolua
co-authored by Cursor
parent cd557a2552
commit 5cc4f222f8
6 changed files with 495 additions and 57 deletions
@@ -2,7 +2,7 @@
import "open-sse/index.js";
import { getProviderConnectionById } from "@/lib/localDb";
import { consumeCodexRateLimitResetCredit } from "open-sse/services/usage.js";
import { consumeCodexRateLimitResetCredit, getCodexRateLimitResetCredits } from "open-sse/services/usage.js";
import { resolveConnectionProxyConfig } from "@/lib/network/connectionProxy";
import { refreshAndUpdateCredentials } from "../route.js";
@@ -15,6 +15,10 @@ function isAuthExpiredResult(result) {
return values.some((value) => AUTH_EXPIRED_PATTERNS.some((pattern) => value.includes(pattern)));
}
function isAuthExpiredError(error) {
return isAuthExpiredResult({ message: error?.message });
}
function getResponseForConsumeResult(result, redeemRequestId) {
if (result.ok) {
return Response.json({
@@ -43,42 +47,90 @@ function getResponseForConsumeResult(result, redeemRequestId) {
}, { status: result.status >= 400 && result.status < 500 ? result.status : 502 });
}
async function getCodexConnection(connectionId) {
const connection = await getProviderConnectionById(connectionId);
if (!connection) {
return { response: Response.json({ error: "Connection not found" }, { status: 404 }) };
}
if (connection.provider !== "codex") {
return { response: Response.json({ error: "Codex reset credits are only available for Codex connections." }, { status: 400 }) };
}
const isOAuth = connection.authType === "oauth";
const isAccessToken = connection.authType === "access_token";
if (!isOAuth && !isAccessToken) {
return { response: Response.json({ error: "Codex reset credits require an OAuth or access-token connection." }, { status: 400 }) };
}
const proxyConfig = await resolveConnectionProxyConfig(connection.providerSpecificData);
const proxyOptions = {
connectionProxyEnabled: proxyConfig.connectionProxyEnabled === true,
connectionProxyUrl: proxyConfig.connectionProxyUrl || "",
connectionNoProxy: proxyConfig.connectionNoProxy || "",
vercelRelayUrl: proxyConfig.vercelRelayUrl || "",
strictProxy: false,
};
return { connection, isOAuth, proxyOptions };
}
async function refreshCodexConnection(connection, proxyOptions) {
try {
const result = await refreshAndUpdateCredentials(connection, false, proxyOptions);
return { connection: result.connection };
} catch (refreshError) {
console.error("[Codex Reset Credits API] Credential refresh failed:", refreshError);
return { response: Response.json({ error: `Credential refresh failed: ${refreshError.message}` }, { status: 401 }) };
}
}
export async function GET(_request, { params }) {
let connection;
try {
const { connectionId } = await params;
const resolved = await getCodexConnection(connectionId);
if (resolved.response) return resolved.response;
({ connection } = resolved);
const { isOAuth, proxyOptions } = resolved;
if (isOAuth) {
const refreshed = await refreshCodexConnection(connection, proxyOptions);
if (refreshed.response) return refreshed.response;
connection = refreshed.connection;
}
let result;
try {
result = await getCodexRateLimitResetCredits(connection.accessToken, proxyOptions, connection.providerSpecificData);
} catch (fetchError) {
if (!isOAuth || !connection.refreshToken || !isAuthExpiredError(fetchError)) throw fetchError;
const retryResult = await refreshAndUpdateCredentials(connection, true, proxyOptions);
connection = retryResult.connection;
result = await getCodexRateLimitResetCredits(connection.accessToken, proxyOptions, connection.providerSpecificData);
}
return Response.json(result);
} catch (error) {
const provider = connection?.provider ?? "unknown";
console.warn(`[Codex Reset Credits] ${provider}: ${error.message}`);
return Response.json({ error: error.message }, { status: 500 });
}
}
export async function POST(request, { params }) {
let connection;
try {
const { connectionId } = await params;
connection = await getProviderConnectionById(connectionId);
if (!connection) {
return Response.json({ error: "Connection not found" }, { status: 404 });
}
if (connection.provider !== "codex") {
return Response.json({ error: "Codex reset credits are only available for Codex connections." }, { status: 400 });
}
const isOAuth = connection.authType === "oauth";
const isAccessToken = connection.authType === "access_token";
if (!isOAuth && !isAccessToken) {
return Response.json({ error: "Codex reset credits require an OAuth or access-token connection." }, { status: 400 });
}
const proxyConfig = await resolveConnectionProxyConfig(connection.providerSpecificData);
const proxyOptions = {
connectionProxyEnabled: proxyConfig.connectionProxyEnabled === true,
connectionProxyUrl: proxyConfig.connectionProxyUrl || "",
connectionNoProxy: proxyConfig.connectionNoProxy || "",
vercelRelayUrl: proxyConfig.vercelRelayUrl || "",
strictProxy: false,
};
const resolved = await getCodexConnection(connectionId);
if (resolved.response) return resolved.response;
({ connection } = resolved);
const { isOAuth, proxyOptions } = resolved;
if (isOAuth) {
try {
const result = await refreshAndUpdateCredentials(connection, false, proxyOptions);
connection = result.connection;
} catch (refreshError) {
console.error("[Codex Reset Credits API] Credential refresh failed:", refreshError);
return Response.json({ error: `Credential refresh failed: ${refreshError.message}` }, { status: 401 });
}
const refreshed = await refreshCodexConnection(connection, proxyOptions);
if (refreshed.response) return refreshed.response;
connection = refreshed.connection;
}
// Server-generated redeem id prevents client-controlled replay