import type { IControllerCodexAccount } from '../ts_interfaces/index.js'; import { codexArray, codexRecord, codexString, codexTimestamp } from './classes.codexprojection.js'; export const codexNonnegativeInteger = (valueArg: unknown): number => { if (!Number.isSafeInteger(valueArg) || Number(valueArg) < 0) throw new Error('Invalid Codex usage count.'); return Number(valueArg); }; /** Project only documented account fields. Provider banners and arbitrary metadata stay private. */ export const codexAccount = (accountArg: Record): IControllerCodexAccount => { if (typeof accountArg.requiresOpenaiAuth !== 'boolean') throw new Error('Invalid Codex account response.'); const account = accountArg.account === null ? { type: 'signedOut' } : codexRecord(accountArg.account); if (!['signedOut', 'apiKey', 'chatgpt', 'amazonBedrock'].includes(String(account.type))) throw new Error('Unknown Codex account type.'); return { type: account.type as IControllerCodexAccount['type'], requiresOpenaiAuth: accountArg.requiresOpenaiAuth, ...(account.type === 'chatgpt' && account.email !== null ? { email: codexString(account.email, 512) } : {}), ...(account.type === 'chatgpt' ? { plan: codexString(account.planType, 128) } : {}), rateLimits: [], rateLimitsAvailable: false, usageAvailable: false, readAt: Date.now() }; }; export const codexRateLimits = (valueArg: Record): IControllerCodexAccount['rateLimits'] => { const values = valueArg.rateLimitsByLimitId === null || valueArg.rateLimitsByLimitId === undefined ? [valueArg.rateLimits] : Object.values(codexRecord(valueArg.rateLimitsByLimitId)); return codexArray(values, 32).map((value) => { const limit = codexRecord(value); return { name: typeof limit.limitName === 'string' ? codexString(limit.limitName, 256) : typeof limit.limitId === 'string' ? codexString(limit.limitId, 128) : 'Codex', windows: [limit.primary, limit.secondary].filter((window) => window !== null && window !== undefined).map((value) => { const window = codexRecord(value); if (typeof window.usedPercent !== 'number' || !Number.isFinite(window.usedPercent) || window.usedPercent < 0) throw new Error('Invalid Codex rate limit.'); return { usedPercent: window.usedPercent, ...(window.windowDurationMins === null ? {} : { durationMinutes: codexNonnegativeInteger(window.windowDurationMins) }), ...(window.resetsAt === null ? {} : { resetsAt: codexTimestamp(window.resetsAt) }) }; }) }; }); };