diff --git a/apps/server/src/providers/codex-provider.ts b/apps/server/src/providers/codex-provider.ts index e2df3de9..2e3962a0 100644 --- a/apps/server/src/providers/codex-provider.ts +++ b/apps/server/src/providers/codex-provider.ts @@ -21,6 +21,7 @@ import { extractTextFromContent, classifyError, getUserFriendlyErrorMessage, + createLogger, } from '@automaker/utils'; import type { ExecuteOptions, @@ -658,6 +659,8 @@ async function loadCodexInstructions(cwd: string, enabled: boolean): Promise { + router.get('/usage', async (_req: Request, res: Response) => { try { // Check if Codex CLI is available first const isAvailable = await usageService.isAvailable(); @@ -60,7 +60,7 @@ export function createCodexRoutes( router.get('/models', async (req: Request, res: Response) => { try { const forceRefresh = req.query.refresh === 'true'; - const models = await modelCacheService.getModels(forceRefresh); + const { models, cachedAt } = await modelCacheService.getModelsWithMetadata(forceRefresh); if (models.length === 0) { res.status(503).json({ @@ -74,7 +74,7 @@ export function createCodexRoutes( res.json({ success: true, models, - cachedAt: Date.now(), + cachedAt, }); } catch (error) { logger.error('Error fetching models:', error); diff --git a/apps/server/src/services/codex-model-cache-service.ts b/apps/server/src/services/codex-model-cache-service.ts index ec65720f..7e171428 100644 --- a/apps/server/src/services/codex-model-cache-service.ts +++ b/apps/server/src/services/codex-model-cache-service.ts @@ -86,6 +86,24 @@ export class CodexModelCacheService { return this.refreshModels(); } + /** + * Get models with cache metadata + * + * @param forceRefresh - If true, bypass cache and fetch fresh data + * @returns Object containing models and cache timestamp + */ + async getModelsWithMetadata( + forceRefresh = false + ): Promise<{ models: CodexModel[]; cachedAt: number }> { + const models = await this.getModels(forceRefresh); + + // Try to get the actual cache timestamp + const cached = await this.loadFromCache(); + const cachedAt = cached?.cachedAt ?? Date.now(); + + return { models, cachedAt }; + } + /** * Refresh models from app-server and update cache * diff --git a/apps/server/src/services/codex-usage-service.ts b/apps/server/src/services/codex-usage-service.ts index c10e8df3..e18d508e 100644 --- a/apps/server/src/services/codex-usage-service.ts +++ b/apps/server/src/services/codex-usage-service.ts @@ -157,9 +157,9 @@ export class CodexUsageService { if (rateLimitsResult?.rateLimits?.primary) { const primary = rateLimitsResult.rateLimits.primary; result.rateLimits!.primary = { - limit: 100, // Not provided by API, using placeholder - used: primary.usedPercent, - remaining: 100 - primary.usedPercent, + limit: -1, // Not provided by API + used: -1, // Not provided by API + remaining: -1, // Not provided by API usedPercent: primary.usedPercent, windowDurationMins: primary.windowDurationMins, resetsAt: primary.resetsAt, @@ -170,9 +170,9 @@ export class CodexUsageService { if (rateLimitsResult?.rateLimits?.secondary) { const secondary = rateLimitsResult.rateLimits.secondary; result.rateLimits!.secondary = { - limit: 100, - used: secondary.usedPercent, - remaining: 100 - secondary.usedPercent, + limit: -1, // Not provided by API + used: -1, // Not provided by API + remaining: -1, // Not provided by API usedPercent: secondary.usedPercent, windowDurationMins: secondary.windowDurationMins, resetsAt: secondary.resetsAt,