


























@@ -28,6 +28,7 @@ import {
2828loadCostUsageSummaryFromCache,
2929loadSessionLogs,
3030loadSessionCostSummaryFromCache,
31+loadSessionCostSummariesFromCache,
3132loadSessionUsageTimeSeries,
3233discoverAllSessions,
3334resolveExistingUsageSessionFile,
@@ -1145,7 +1146,6 @@ export const usageHandlers: GatewayRequestHandlers = {
11451146// Sort by most recent first
11461147mergedEntries.sort((a, b) => b.updatedAt - a.updatedAt);
114711481148-// Apply limit
11491149const limitedEntries = mergedEntries.slice(0, limit);
1150115011511151// Load usage for each session
@@ -1232,7 +1232,7 @@ export const usageHandlers: GatewayRequestHandlers = {
12321232};
1233123312341234const usageByEntryIndex: Array<SessionCostSummary | null> = Array.from(
1235-{ length: limitedEntries.length },
1235+{ length: mergedEntries.length },
12361236() => null,
12371237);
12381238const usageLoadTasks: Array<
@@ -1289,15 +1289,61 @@ export const usageHandlers: GatewayRequestHandlers = {
12891289if (!loaded.summary) {
12901290continue;
12911291}
1292-const merged = limitedEntries[loaded.entryIndex];
1292+const merged = mergedEntries[loaded.entryIndex];
12931293const usage = usageByEntryIndex[loaded.entryIndex] ?? createEmptySessionCostSummary();
12941294usage.sessionId = merged.sessionId;
12951295usage.sessionFile = merged.sessionFile;
12961296mergeSessionUsageInto(usage, loaded.summary);
12971297usageByEntryIndex[loaded.entryIndex] = usage;
12981298}
129912991300-for (const [entryIndex, merged] of limitedEntries.entries()) {
1300+const hiddenSessionsByAgent = new Map<
1301+string | undefined,
1302+Array<{ entryIndex: number; sessionId: string; sessionFile: string }>
1303+>();
1304+for (const [entryIndex, merged] of mergedEntries.entries()) {
1305+if (entryIndex < limitedEntries.length) {
1306+continue;
1307+}
1308+const hiddenSessions = hiddenSessionsByAgent.get(merged.agentId) ?? [];
1309+for (const includedSessionId of merged.includedSessionIds ?? [merged.sessionId]) {
1310+const sessionFile =
1311+includedSessionId === merged.sessionId
1312+ ? merged.sessionFile
1313+ : resolveExistingUsageSessionFile({
1314+sessionId: includedSessionId,
1315+agentId: merged.agentId,
1316+});
1317+if (sessionFile) {
1318+hiddenSessions.push({ entryIndex, sessionId: includedSessionId, sessionFile });
1319+}
1320+}
1321+hiddenSessionsByAgent.set(merged.agentId, hiddenSessions);
1322+}
1323+for (const [agentId, hiddenSessions] of hiddenSessionsByAgent) {
1324+const hiddenUsage = await loadSessionCostSummariesFromCache({
1325+sessions: hiddenSessions,
1326+ config,
1327+ agentId,
1328+ startMs,
1329+ endMs,
1330+});
1331+cacheStatus = mergeUsageCacheStatus(cacheStatus, hiddenUsage.cacheStatus);
1332+for (const [hiddenIndex, summary] of hiddenUsage.summaries.entries()) {
1333+if (!summary) {
1334+continue;
1335+}
1336+const hiddenSession = hiddenSessions[hiddenIndex];
1337+const merged = mergedEntries[hiddenSession.entryIndex];
1338+const usage = usageByEntryIndex[hiddenSession.entryIndex] ?? createEmptySessionCostSummary();
1339+usage.sessionId = merged.sessionId;
1340+usage.sessionFile = merged.sessionFile;
1341+mergeSessionUsageInto(usage, summary);
1342+usageByEntryIndex[hiddenSession.entryIndex] = usage;
1343+}
1344+}
1345+1346+for (const [entryIndex, merged] of mergedEntries.entries()) {
13011347const agentId = merged.agentId;
13021348const usage = usageByEntryIndex[entryIndex];
13031349@@ -1433,29 +1479,31 @@ export const usageHandlers: GatewayRequestHandlers = {
14331479}
14341480}
143514811436-sessions.push({
1437-key: merged.key,
1438-label: merged.label,
1439-sessionId: merged.sessionId,
1440-scope: merged.scope ?? "instance",
1441-sessionFamilyKey: merged.sessionFamilyKey,
1442-currentSessionId: merged.currentSessionId,
1443-includedSessionIds: merged.includedSessionIds,
1444-historicalInstanceCount: merged.includedSessionIds?.length,
1445-updatedAt: merged.updatedAt,
1446- agentId,
1447- channel,
1448- chatType,
1449-origin: merged.storeEntry?.origin,
1450-modelOverride: merged.storeEntry?.modelOverride,
1451-providerOverride: merged.storeEntry?.providerOverride,
1452-modelProvider: merged.storeEntry?.modelProvider,
1453-model: merged.storeEntry?.model,
1454- usage,
1455-contextWeight: includeContextWeight
1456- ? (merged.storeEntry?.systemPromptReport ?? null)
1457- : undefined,
1458-});
1482+if (entryIndex < limit) {
1483+sessions.push({
1484+key: merged.key,
1485+label: merged.label,
1486+sessionId: merged.sessionId,
1487+scope: merged.scope ?? "instance",
1488+sessionFamilyKey: merged.sessionFamilyKey,
1489+currentSessionId: merged.currentSessionId,
1490+includedSessionIds: merged.includedSessionIds,
1491+historicalInstanceCount: merged.includedSessionIds?.length,
1492+updatedAt: merged.updatedAt,
1493+ agentId,
1494+ channel,
1495+ chatType,
1496+origin: merged.storeEntry?.origin,
1497+modelOverride: merged.storeEntry?.modelOverride,
1498+providerOverride: merged.storeEntry?.providerOverride,
1499+modelProvider: merged.storeEntry?.modelProvider,
1500+model: merged.storeEntry?.model,
1501+ usage,
1502+contextWeight: includeContextWeight
1503+ ? (merged.storeEntry?.systemPromptReport ?? null)
1504+ : undefined,
1505+});
1506+}
14591507}
1460150814611509// Format dates back to YYYY-MM-DD strings
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。