From f13cf27a22d975db2927e71960cec6e5fea02288 Mon Sep 17 00:00:00 2001 From: SB Yoon <44089734+yansigit@users.noreply.github.com> Date: Fri, 4 Sep 2026 22:32:56 -0600 Subject: [PATCH 1/9] feat(logs): add composable filter controls --- gui/src/i18n/de.ts | 20 +++++ gui/src/i18n/en.ts | 20 +++++ gui/src/i18n/fr.ts | 20 +++++ gui/src/i18n/ja.ts | 20 +++++ gui/src/i18n/ko.ts | 20 +++++ gui/src/i18n/ru.ts | 20 +++++ gui/src/i18n/tr.ts | 20 +++++ gui/src/i18n/zh-TW.ts | 20 +++++ gui/src/i18n/zh.ts | 20 +++++ gui/src/pages/Logs.tsx | 108 ++++++----------------- gui/src/pages/logs-filter-bar.tsx | 123 +++++++++++++++++++++++++++ gui/src/styles.css | 2 + gui/tests/logs-auto-refresh.test.tsx | 11 +-- gui/tests/logs-filter-bar.test.ts | 81 ++++++++++++++++++ 14 files changed, 419 insertions(+), 86 deletions(-) create mode 100644 gui/src/pages/logs-filter-bar.tsx create mode 100644 gui/tests/logs-filter-bar.test.ts diff --git a/gui/src/i18n/de.ts b/gui/src/i18n/de.ts index cf04d02f67..b670ccda4c 100644 --- a/gui/src/i18n/de.ts +++ b/gui/src/i18n/de.ts @@ -665,6 +665,26 @@ export const de: Record = { "logs.noRequests": "Noch keine Anfragen.", "logs.loadError": "Anfrageprotokolle konnten nicht geladen werden.", "logs.filter.surface.label": "Oberfläche", + "logs.filter.model.all": "Alle Modelle", + "logs.filter.provider.label": "Anbieter", + "logs.filter.provider.all": "Alle Anbieter", + "logs.filter.status.label": "Status", + "logs.filter.status.all": "Alle Status", + "logs.filter.status.success": "Erfolg (2xx)", + "logs.filter.status.errors": "Fehler (4xx/5xx)", + "logs.filter.time.label": "Zeit", + "logs.filter.time.all": "Alle Zeiten", + "logs.filter.time.15m": "Letzte 15 Min.", + "logs.filter.time.1h": "Letzte Stunde", + "logs.filter.time.24h": "Letzter Tag", + "logs.filter.speed.label": "Geschwindigkeit", + "logs.filter.speed.all": "Alle Geschwindigkeiten", + "logs.filter.speed.slow": "< 15 Tok/s", + "logs.filter.speed.medium": "15–< 50 Tok/s", + "logs.filter.speed.fast": "≥ 50 Tok/s", + "logs.filter.reset": "Filter zurücksetzen", + "logs.filter.showingCount": "{count} von {total} angezeigt", + "logs.noMatchingRequests": "Keine passenden Anfragen.", "logs.filter.surface.all": "Alle", "logs.filter.surface.claude": "Claude", "logs.filter.surface.codex": "Codex", diff --git a/gui/src/i18n/en.ts b/gui/src/i18n/en.ts index 5d0c0b0983..a3bff471c0 100644 --- a/gui/src/i18n/en.ts +++ b/gui/src/i18n/en.ts @@ -698,6 +698,26 @@ export const en = { "logs.noRequests": "No requests yet.", "logs.loadError": "Could not load request logs.", "logs.filter.surface.label": "Surface", + "logs.filter.model.all": "All models", + "logs.filter.provider.label": "Provider", + "logs.filter.provider.all": "All providers", + "logs.filter.status.label": "Status", + "logs.filter.status.all": "All statuses", + "logs.filter.status.success": "Success (2xx)", + "logs.filter.status.errors": "Errors (4xx/5xx)", + "logs.filter.time.label": "Time", + "logs.filter.time.all": "All time", + "logs.filter.time.15m": "Last 15m", + "logs.filter.time.1h": "Last 1h", + "logs.filter.time.24h": "Last 1d", + "logs.filter.speed.label": "Speed", + "logs.filter.speed.all": "All speeds", + "logs.filter.speed.slow": "< 15 tok/s", + "logs.filter.speed.medium": "15–< 50 tok/s", + "logs.filter.speed.fast": "≥ 50 tok/s", + "logs.filter.reset": "Reset filters", + "logs.filter.showingCount": "Showing {count} of {total}", + "logs.noMatchingRequests": "No matching requests.", "logs.filter.surface.all": "All", "logs.filter.surface.claude": "Claude", "logs.filter.surface.codex": "Codex", diff --git a/gui/src/i18n/fr.ts b/gui/src/i18n/fr.ts index ac0d9f17c3..79e8fd5805 100644 --- a/gui/src/i18n/fr.ts +++ b/gui/src/i18n/fr.ts @@ -679,6 +679,26 @@ export const fr: Record = { "logs.noRequests": "Aucune requête pour le moment.", "logs.loadError": "Impossible de charger les journaux des requêtes.", "logs.filter.surface.label": "Interface", + "logs.filter.model.all": "Tous les modèles", + "logs.filter.provider.label": "Fournisseur", + "logs.filter.provider.all": "Tous les fournisseurs", + "logs.filter.status.label": "Statut", + "logs.filter.status.all": "Tous les statuts", + "logs.filter.status.success": "Réussites (2xx)", + "logs.filter.status.errors": "Erreurs (4xx/5xx)", + "logs.filter.time.label": "Temps", + "logs.filter.time.all": "Toutes les périodes", + "logs.filter.time.15m": "15 dernières min", + "logs.filter.time.1h": "Dernière heure", + "logs.filter.time.24h": "Dernier jour", + "logs.filter.speed.label": "Vitesse", + "logs.filter.speed.all": "Toutes les vitesses", + "logs.filter.speed.slow": "< 15 jetons/s", + "logs.filter.speed.medium": "15–< 50 jetons/s", + "logs.filter.speed.fast": "≥ 50 jetons/s", + "logs.filter.reset": "Réinitialiser les filtres", + "logs.filter.showingCount": "{count} sur {total} affichées", + "logs.noMatchingRequests": "Aucune requête correspondante.", "logs.filter.surface.all": "Toutes", "logs.filter.surface.claude": "Claude", "logs.filter.surface.codex": "Codex", diff --git a/gui/src/i18n/ja.ts b/gui/src/i18n/ja.ts index 7c6eab5675..6467a9ed4b 100644 --- a/gui/src/i18n/ja.ts +++ b/gui/src/i18n/ja.ts @@ -641,6 +641,26 @@ export const ja: Record = { "logs.noRequests": "まだリクエストがありません。", "logs.loadError": "リクエストログを読み込めませんでした。", "logs.filter.surface.label": "サーフェス", + "logs.filter.model.all": "すべてのモデル", + "logs.filter.provider.label": "プロバイダー", + "logs.filter.provider.all": "すべてのプロバイダー", + "logs.filter.status.label": "ステータス", + "logs.filter.status.all": "すべてのステータス", + "logs.filter.status.success": "成功 (2xx)", + "logs.filter.status.errors": "エラー (4xx/5xx)", + "logs.filter.time.label": "時間", + "logs.filter.time.all": "すべての時間", + "logs.filter.time.15m": "過去15分", + "logs.filter.time.1h": "過去1時間", + "logs.filter.time.24h": "過去1日", + "logs.filter.speed.label": "速度", + "logs.filter.speed.all": "すべての速度", + "logs.filter.speed.slow": "< 15 トークン/秒", + "logs.filter.speed.medium": "15–< 50 トークン/秒", + "logs.filter.speed.fast": "≥ 50 トークン/秒", + "logs.filter.reset": "フィルターをリセット", + "logs.filter.showingCount": "{total} 件中 {count} 件を表示", + "logs.noMatchingRequests": "一致するリクエストはありません。", "logs.filter.surface.all": "すべて", "logs.filter.surface.claude": "Claude", "logs.filter.surface.codex": "Codex", diff --git a/gui/src/i18n/ko.ts b/gui/src/i18n/ko.ts index 21d9ab45eb..7d5a918439 100644 --- a/gui/src/i18n/ko.ts +++ b/gui/src/i18n/ko.ts @@ -684,6 +684,26 @@ export const ko: Record = { "logs.noRequests": "아직 요청이 없습니다.", "logs.loadError": "요청 로그를 불러오지 못했습니다.", "logs.filter.surface.label": "표면", + "logs.filter.model.all": "모든 모델", + "logs.filter.provider.label": "공급자", + "logs.filter.provider.all": "모든 공급자", + "logs.filter.status.label": "상태", + "logs.filter.status.all": "모든 상태", + "logs.filter.status.success": "성공 (2xx)", + "logs.filter.status.errors": "오류 (4xx/5xx)", + "logs.filter.time.label": "시간", + "logs.filter.time.all": "전체 시간", + "logs.filter.time.15m": "최근 15분", + "logs.filter.time.1h": "최근 1시간", + "logs.filter.time.24h": "최근 1일", + "logs.filter.speed.label": "속도", + "logs.filter.speed.all": "모든 속도", + "logs.filter.speed.slow": "< 15 토큰/초", + "logs.filter.speed.medium": "15–< 50 토큰/초", + "logs.filter.speed.fast": "≥ 50 토큰/초", + "logs.filter.reset": "필터 초기화", + "logs.filter.showingCount": "{total}개 중 {count}개 표시", + "logs.noMatchingRequests": "일치하는 요청이 없습니다.", "logs.filter.surface.all": "전체", "logs.filter.surface.claude": "Claude", "logs.filter.surface.codex": "Codex", diff --git a/gui/src/i18n/ru.ts b/gui/src/i18n/ru.ts index c97b62e9ac..82c3ea4e8a 100644 --- a/gui/src/i18n/ru.ts +++ b/gui/src/i18n/ru.ts @@ -682,6 +682,26 @@ export const ru: Record = { "logs.noRequests": "Запросов пока нет.", "logs.loadError": "Не удалось загрузить журнал запросов.", "logs.filter.surface.label": "Источник", + "logs.filter.model.all": "Все модели", + "logs.filter.provider.label": "Провайдер", + "logs.filter.provider.all": "Все провайдеры", + "logs.filter.status.label": "Статус", + "logs.filter.status.all": "Все статусы", + "logs.filter.status.success": "Успешные (2xx)", + "logs.filter.status.errors": "Ошибки (4xx/5xx)", + "logs.filter.time.label": "Время", + "logs.filter.time.all": "За всё время", + "logs.filter.time.15m": "Последние 15 мин", + "logs.filter.time.1h": "Последний час", + "logs.filter.time.24h": "Последний день", + "logs.filter.speed.label": "Скорость", + "logs.filter.speed.all": "Все скорости", + "logs.filter.speed.slow": "< 15 ток/с", + "logs.filter.speed.medium": "15–< 50 ток/с", + "logs.filter.speed.fast": "≥ 50 ток/с", + "logs.filter.reset": "Сбросить фильтры", + "logs.filter.showingCount": "Показано {count} из {total}", + "logs.noMatchingRequests": "Подходящих запросов нет.", "logs.filter.surface.all": "Все", "logs.filter.surface.claude": "Claude", "logs.filter.surface.codex": "Codex", diff --git a/gui/src/i18n/tr.ts b/gui/src/i18n/tr.ts index 7a6f5107c0..1b5724021a 100644 --- a/gui/src/i18n/tr.ts +++ b/gui/src/i18n/tr.ts @@ -689,6 +689,26 @@ export const tr: Record = { "logs.noRequests": "Henüz istek yok.", "logs.loadError": "İstek günlükleri yüklenemedi.", "logs.filter.surface.label": "Yüzey", + "logs.filter.model.all": "Tüm modeller", + "logs.filter.provider.label": "Sağlayıcı", + "logs.filter.provider.all": "Tüm sağlayıcılar", + "logs.filter.status.label": "Durum", + "logs.filter.status.all": "Tüm durumlar", + "logs.filter.status.success": "Başarılı (2xx)", + "logs.filter.status.errors": "Hatalar (4xx/5xx)", + "logs.filter.time.label": "Zaman", + "logs.filter.time.all": "Tüm zamanlar", + "logs.filter.time.15m": "Son 15 dk", + "logs.filter.time.1h": "Son 1 saat", + "logs.filter.time.24h": "Son 1 gün", + "logs.filter.speed.label": "Hız", + "logs.filter.speed.all": "Tüm hızlar", + "logs.filter.speed.slow": "< 15 belirteç/sn", + "logs.filter.speed.medium": "15–< 50 belirteç/sn", + "logs.filter.speed.fast": "≥ 50 belirteç/sn", + "logs.filter.reset": "Filtreleri sıfırla", + "logs.filter.showingCount": "{total} içinden {count} gösteriliyor", + "logs.noMatchingRequests": "Eşleşen istek yok.", "logs.filter.surface.all": "Tümü", "logs.filter.surface.claude": "Claude", "logs.filter.surface.codex": "Codex", diff --git a/gui/src/i18n/zh-TW.ts b/gui/src/i18n/zh-TW.ts index ed0aeba2d4..f543e948a5 100644 --- a/gui/src/i18n/zh-TW.ts +++ b/gui/src/i18n/zh-TW.ts @@ -534,6 +534,26 @@ export const zhTW: Record = { "logs.noRequests": "暫無請求。", "logs.loadError": "無法載入請求日誌。", "logs.filter.surface.label": "介面", + "logs.filter.model.all": "所有模型", + "logs.filter.provider.label": "提供者", + "logs.filter.provider.all": "所有提供者", + "logs.filter.status.label": "狀態", + "logs.filter.status.all": "所有狀態", + "logs.filter.status.success": "成功 (2xx)", + "logs.filter.status.errors": "錯誤 (4xx/5xx)", + "logs.filter.time.label": "時間", + "logs.filter.time.all": "所有時間", + "logs.filter.time.15m": "最近 15 分鐘", + "logs.filter.time.1h": "最近 1 小時", + "logs.filter.time.24h": "最近 1 天", + "logs.filter.speed.label": "速度", + "logs.filter.speed.all": "所有速度", + "logs.filter.speed.slow": "< 15 權杖/秒", + "logs.filter.speed.medium": "15–< 50 權杖/秒", + "logs.filter.speed.fast": "≥ 50 權杖/秒", + "logs.filter.reset": "重設篩選", + "logs.filter.showingCount": "顯示 {count}/{total}", + "logs.noMatchingRequests": "沒有相符的請求。", "logs.filter.surface.all": "全部", "logs.filter.surface.claude": "Claude", "logs.filter.surface.codex": "Codex", diff --git a/gui/src/i18n/zh.ts b/gui/src/i18n/zh.ts index 44450d8785..c0dbd81a5c 100644 --- a/gui/src/i18n/zh.ts +++ b/gui/src/i18n/zh.ts @@ -677,6 +677,26 @@ export const zh: Record = { "logs.noRequests": "暂无请求。", "logs.loadError": "无法加载请求日志。", "logs.filter.surface.label": "界面", + "logs.filter.model.all": "所有模型", + "logs.filter.provider.label": "提供商", + "logs.filter.provider.all": "所有提供商", + "logs.filter.status.label": "状态", + "logs.filter.status.all": "所有状态", + "logs.filter.status.success": "成功 (2xx)", + "logs.filter.status.errors": "错误 (4xx/5xx)", + "logs.filter.time.label": "时间", + "logs.filter.time.all": "所有时间", + "logs.filter.time.15m": "最近 15 分钟", + "logs.filter.time.1h": "最近 1 小时", + "logs.filter.time.24h": "最近 1 天", + "logs.filter.speed.label": "速度", + "logs.filter.speed.all": "所有速度", + "logs.filter.speed.slow": "< 15 令牌/秒", + "logs.filter.speed.medium": "15–< 50 令牌/秒", + "logs.filter.speed.fast": "≥ 50 令牌/秒", + "logs.filter.reset": "重置筛选", + "logs.filter.showingCount": "显示 {count}/{total}", + "logs.noMatchingRequests": "没有匹配的请求。", "logs.filter.surface.all": "全部", "logs.filter.surface.claude": "Claude", "logs.filter.surface.codex": "Codex", diff --git a/gui/src/pages/Logs.tsx b/gui/src/pages/Logs.tsx index 40b3a265c8..a41b6bdb62 100644 --- a/gui/src/pages/Logs.tsx +++ b/gui/src/pages/Logs.tsx @@ -1,9 +1,9 @@ -import { useCallback, useEffect, useRef, useState } from "react"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useVirtualizer } from "@tanstack/react-virtual"; import { useI18n, LOCALES, type TFn } from "../i18n/shared"; import { formatProviderDisplayName } from "../provider-icons"; import { formatTokens } from "../format-tokens"; -import { hashLogConversationQuery, matchesLogConversationId } from "../log-conversation-id"; +import { hashLogConversationQuery } from "../log-conversation-id"; import { statusCodeInfo } from "../status-codes"; import { IconX } from "../icons"; import { modelLabel } from "../model-display"; @@ -12,6 +12,8 @@ import { useDataSurface } from "../data-surface"; import { DataSurfaceSkeleton } from "../components/data-surface"; import { EmptyState, Notice } from "../ui"; import Debug from "./Debug"; +import { LogsFilterBar } from "./logs-filter-bar"; +import { DEFAULT_LOG_FILTER_STATE, extractLogFilterOptions, filterLogs, hasActiveLogFilters, type LogFilterState } from "./logs-filter"; import type { LogsTab } from "./logs-tab-keydown"; import { logsTabKeyDown, readTabFromHash, selectLogsTab } from "./logs-tab-keydown"; @@ -19,9 +21,7 @@ import { modelTitle, type ModelTitleTierOutcome } from "./logs-model-title"; import { speedLabel } from "./logs-speed-label"; import { formatEstimatedUsd, formatEstimatedUsdValue, summarizeEstimatedCosts } from "./logs-cost-format"; import { cacheSplit, isCursorUsageProvider, tokensTitle } from "./logs-token-title"; -import type { LogSurface, LogSurfaceFilter } from "./logs-surface-filter"; -import { logMatchesSurface } from "./logs-surface-filter"; -import { logMatchesModelQuery } from "./logs-model-filter"; +import type { LogSurface } from "./logs-surface-filter"; import { sanitizeLogEntryRouteDecision, validCachedRouteDecision, @@ -31,6 +31,8 @@ function logsCacheKey(apiBase: string): string { return `ocx.logs.list.v1:${apiBase}`; } +const EMPTY_LOGS: LogEntry[] = []; + interface UsageBreakdown { inputTokens: number; outputTokens: number; @@ -373,11 +375,7 @@ export default function Logs({ apiBase }: { apiBase: string }) { { error: null, count: 0 }, ); const [detail, setDetail] = useState(null); - const [surfaceFilter, setSurfaceFilter] = useState("all"); - const [interceptedHelpersOnly, setInterceptedHelpersOnly] = useState(false); - const [conversationFilter, setConversationFilter] = useState(""); - const [modelFilter, setModelFilter] = useState(""); - const [conversationQueryHash, setConversationQueryHash] = useState(); + const [filters, setFilters] = useState(DEFAULT_LOG_FILTER_STATE); const scrollContainerRef = useRef(null); const logRetryRef = useRef<{ key: string; failures: number; nextAttemptAt: number; error: unknown }>( { key: resourceKey, failures: 0, nextAttemptAt: 0, error: null }, @@ -472,7 +470,7 @@ export default function Logs({ apiBase }: { apiBase: string }) { }, ); const logsState = logsResource.state; - const logs = logsState.data ?? cachedLogs ?? []; + const logs = logsState.data ?? cachedLogs ?? EMPTY_LOGS; const fetchLogs = logsResource.refresh; const retryLogs = useCallback(() => { logRetryRef.current = { key: resourceKey, failures: 0, nextAttemptAt: 0, error: null }; @@ -499,26 +497,23 @@ export default function Logs({ apiBase }: { apiBase: string }) { || (!autoRefresh && settledFailure); const detailInfo = detail ? statusCodeInfo(detail.status, locale) : null; - const conversationQuery = conversationFilter.trim(); + const conversationQuery = filters.conversationId.trim(); useEffect(() => { let cancelled = false; if (!conversationQuery) { - setConversationQueryHash(undefined); + setFilters(prev => prev.conversationQueryHash === undefined ? prev : { ...prev, conversationQueryHash: undefined }); return; } void hashLogConversationQuery(conversationQuery).then(hash => { - if (!cancelled) setConversationQueryHash(hash); + if (!cancelled) setFilters(prev => prev.conversationQueryHash === hash ? prev : { ...prev, conversationQueryHash: hash }); }); return () => { cancelled = true; }; }, [conversationQuery]); - const filteredLogs = logs.filter(log => ( - logMatchesSurface(log, surfaceFilter) - && (!interceptedHelpersOnly || Boolean(log.shadowCallRewrittenFrom)) - && logMatchesModelQuery(log, modelFilter) - && (!conversationQuery || matchesLogConversationId(log.conversationId, conversationQuery, conversationQueryHash)) - )); + const filterOptions = useMemo(() => extractLogFilterOptions(logs), [logs]); + const activeFilters = hasActiveLogFilters(filters); + const filteredLogs = useMemo(() => filterLogs(logs, filters), [logs, filters]); const conversationTotals = conversationQuery ? summarizeFilteredLogs(filteredLogs) : null; // TanStack Virtual returns unstable function identities; React Compiler skips this call. @@ -597,65 +592,16 @@ export default function Logs({ apiBase }: { apiBase: string }) { hidden={tab !== "logs"} > -
- {t("logs.filter.surface.label")} -
- {(["all", "claude", "codex", "grok"] as const).map(surface => ( - - ))} -
- {/* - "Intercepted", not "helper". The marker only exists when Shadow Call Intercept - rewrote the request, so a helper request that was not intercepted looks exactly like - ordinary traffic here. A broader label would promise a classification this data - cannot support. - */} - - - - {conversationQuery && ( - - )} -
+ setFilters(DEFAULT_LOG_FILTER_STATE)} + /> {conversationTotals && (
@@ -714,7 +660,7 @@ export default function Logs({ apiBase }: { apiBase: string }) { {logsState.kind === "failed-cold" ? null : logsState.showSkeleton && logs.length === 0 ? ( ) : filteredLogs.length === 0 ? ( - + 0 && activeFilters ? t("logs.noMatchingRequests") : t("logs.noRequests")} /> ) : ( <>
@@ -864,7 +810,7 @@ export default function Logs({ apiBase }: { apiBase: string }) { t={t} onClose={() => setDetail(null)} onFilterConversation={id => { - setConversationFilter(id); + setFilters(prev => ({ ...prev, conversationId: id })); setDetail(null); }} /> diff --git a/gui/src/pages/logs-filter-bar.tsx b/gui/src/pages/logs-filter-bar.tsx new file mode 100644 index 0000000000..047440f109 --- /dev/null +++ b/gui/src/pages/logs-filter-bar.tsx @@ -0,0 +1,123 @@ +import type { TFn } from "../i18n/shared"; +import { IconX } from "../icons"; +import { formatProviderDisplayName } from "../provider-icons"; +import type { LogFilterState, LogStatusFilter, LogTimeWindow } from "./logs-filter"; + +interface LogsFilterBarProps { + filters: LogFilterState; + options: { models: string[]; providers: string[] }; + hasActiveFilters: boolean; + filteredCount: number; + totalCount: number; + t: TFn; + onFilterChange: (next: LogFilterState) => void; + onResetFilters: () => void; +} + +export function LogsFilterBar({ + filters, options, hasActiveFilters, filteredCount, totalCount, t, onFilterChange, onResetFilters, +}: LogsFilterBarProps) { + const currentSpeed = filters.maxTokPerSec === 15 + ? "slow" + : filters.minTokPerSec === 15 && filters.maxTokPerSec === 50 + ? "medium" + : filters.minTokPerSec === 50 ? "fast" : "all"; + + const handleSpeedChange = (value: string) => { + const bounds = value === "slow" + ? { minTokPerSec: undefined, maxTokPerSec: 15 } + : value === "medium" + ? { minTokPerSec: 15, maxTokPerSec: 50 } + : value === "fast" + ? { minTokPerSec: 50, maxTokPerSec: undefined } + : { minTokPerSec: undefined, maxTokPerSec: undefined }; + onFilterChange({ ...filters, ...bounds }); + }; + + return ( +
+
+ {t("logs.filter.surface.label")} +
+ {(["all", "claude", "codex", "grok"] as const).map(surface => ( + + ))} +
+ + + + + + + + + + + + +
+ +
+ + + {hasActiveFilters && ( +
+ {t("logs.filter.showingCount", { count: filteredCount, total: totalCount })} + +
+ )} +
+
+ ); +} diff --git a/gui/src/styles.css b/gui/src/styles.css index 654d384068..7c10871761 100644 --- a/gui/src/styles.css +++ b/gui/src/styles.css @@ -2149,6 +2149,8 @@ table.logs-table { gap: var(--space-2); margin-bottom: var(--space-3); } +.logs-filter-status { display: inline-flex; align-items: center; gap: var(--space-2); margin-left: auto; } +.logs-toolbar-secondary { margin-top: calc(var(--space-1) * -1); } .logs-segmented { display: inline-flex; diff --git a/gui/tests/logs-auto-refresh.test.tsx b/gui/tests/logs-auto-refresh.test.tsx index b0dbda2501..8038f7550c 100644 --- a/gui/tests/logs-auto-refresh.test.tsx +++ b/gui/tests/logs-auto-refresh.test.tsx @@ -542,8 +542,9 @@ test("Logs: an intercepted helper row is badged and filterable", async () => { await flushMicrotasks(); // The badge names the ORIGINAL helper model, which is the attribution that was being lost. - expect(container.textContent).toContain("I · gpt-5.6-luna"); - expect(container.textContent).toContain("gpt-test"); + const tableText = () => container.querySelector(".logs-table tbody")?.textContent ?? ""; + expect(tableText()).toContain("I · gpt-5.6-luna"); + expect(tableText()).toContain("gpt-test"); const toggle = [...container.querySelectorAll("input[type=checkbox]")].find( input => input.closest("label")?.textContent?.includes("Intercepted helpers only"), @@ -557,8 +558,8 @@ test("Logs: an intercepted helper row is badged and filterable", async () => { }); // Filtered: the marked row stays, the ordinary one goes. - expect(container.textContent).toContain("I · gpt-5.6-luna"); - expect(container.textContent).not.toContain("gpt-test"); + expect(tableText()).toContain("I · gpt-5.6-luna"); + expect(tableText()).not.toContain("gpt-test"); await act(async () => { toggle!.click(); }); await act(async () => { @@ -566,7 +567,7 @@ test("Logs: an intercepted helper row is badged and filterable", async () => { await Promise.resolve(); }); - expect(container.textContent).toContain("gpt-test"); + expect(tableText()).toContain("gpt-test"); await act(async () => { root.unmount(); }); }); diff --git a/gui/tests/logs-filter-bar.test.ts b/gui/tests/logs-filter-bar.test.ts new file mode 100644 index 0000000000..40a6b0027c --- /dev/null +++ b/gui/tests/logs-filter-bar.test.ts @@ -0,0 +1,81 @@ +import { expect, test } from "bun:test"; +import { Window } from "happy-dom"; +import { act, createElement } from "react"; +import { createRoot } from "react-dom/client"; +import { LanguageProvider } from "../src/i18n/provider"; +import { DEFAULT_LOG_FILTER_STATE, type LogFilterState } from "../src/pages/logs-filter"; +import { LogsFilterBar } from "../src/pages/logs-filter-bar"; + +test("Logs mounts the shared rich-filter predicate and filter bar", async () => { + const source = await Bun.file(new URL("../src/pages/Logs.tsx", import.meta.url)).text(); + expect(source).toContain('import { LogsFilterBar } from "./logs-filter-bar";'); + expect(source).toContain("filterLogs(logs, filters)"); + expect(source).toContain("extractLogFilterOptions(logs)"); + expect(source).not.toContain("logMatchesSurface(log, surfaceFilter)"); + expect(source).not.toContain("logMatchesModelQuery(log, modelFilter)"); +}); + +test("LogsFilterBar exposes every engine filter field and reset affordance", async () => { + const source = await Bun.file(new URL("../src/pages/logs-filter-bar.tsx", import.meta.url)).text(); + for (const key of [ + "filters.surface", "filters.interceptedOnly", "filters.provider", "filters.model", + "filters.timeWindow", "filters.minTokPerSec", "filters.maxTokPerSec", "filters.status", + "filters.conversationId", + ]) { + expect(source).toContain(key); + } + expect(source).toContain('t("logs.filter.reset")'); +}); + +test("LogsFilterBar renders labeled controls, count, and reset interaction", async () => { + const win = new Window({ url: "http://localhost/#logs" }); + const previous = { + document: globalThis.document, + window: globalThis.window, + navigator: globalThis.navigator, + actEnvironment: (globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT, + }; + Object.defineProperties(globalThis, { + document: { configurable: true, value: win.document }, + window: { configurable: true, value: win }, + navigator: { configurable: true, value: win.navigator }, + }); + (globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true; + try { + const container = document.createElement("div"); + document.body.append(container); + const updates: LogFilterState[] = []; + const root = createRoot(container); + const filters = { ...DEFAULT_LOG_FILTER_STATE }; + await act(async () => { + root.render(createElement(LanguageProvider, null, + createElement(LogsFilterBar, { + filters: { ...filters, status: "errors" }, + options: { models: ["gpt-test"], providers: ["openai"] }, + hasActiveFilters: true, + filteredCount: 1, + totalCount: 2, + t: ((key: string, vars?: Record) => key === "logs.filter.showingCount" ? `Showing ${vars?.count} of ${vars?.total}` : key) as never, + onFilterChange: next => updates.push(next), + onResetFilters: () => updates.push(filters), + }), + )); + }); + expect(container.querySelector('select[aria-label="logs.filter.status.label"]')).not.toBeNull(); + expect(container.querySelector('select[aria-label="logs.filter.provider.label"]')).not.toBeNull(); + expect(container.textContent).toContain("Showing 1 of 2"); + const reset = [...container.querySelectorAll("button")].find(button => button.textContent?.includes("logs.filter.reset")); + expect(reset).toBeTruthy(); + await act(async () => { reset!.click(); }); + expect(updates.at(-1)).toEqual(filters); + await act(async () => { root.unmount(); }); + } finally { + Object.defineProperties(globalThis, { + document: { configurable: true, value: previous.document }, + window: { configurable: true, value: previous.window }, + navigator: { configurable: true, value: previous.navigator }, + }); + (globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = previous.actEnvironment; + win.close(); + } +}); From 0073dd331b075578d1616d39a915bf87f00befaa Mon Sep 17 00:00:00 2001 From: SB Yoon <44089734+yansigit@users.noreply.github.com> Date: Fri, 4 Sep 2026 23:03:12 -0600 Subject: [PATCH 2/9] fix(gui): address logs filter review findings --- gui/src/i18n/fr.ts | 2 +- gui/src/i18n/tr.ts | 10 ++++----- gui/src/pages/Logs.tsx | 30 +++++++++++++++++++++++++- gui/src/pages/logs-filter-bar.tsx | 4 ++++ gui/src/pages/logs-filter.ts | 5 ++++- gui/src/pages/logs-surface-keydown.ts | 24 +++++++++++++++++++++ gui/tests/logs-filter-bar.test.ts | 31 +++++++++++++++++++++++++++ gui/tests/logs-filter.test.ts | 13 +++++++---- 8 files changed, 107 insertions(+), 12 deletions(-) create mode 100644 gui/src/pages/logs-surface-keydown.ts diff --git a/gui/src/i18n/fr.ts b/gui/src/i18n/fr.ts index 79e8fd5805..84b6e3108f 100644 --- a/gui/src/i18n/fr.ts +++ b/gui/src/i18n/fr.ts @@ -697,7 +697,7 @@ export const fr: Record = { "logs.filter.speed.medium": "15–< 50 jetons/s", "logs.filter.speed.fast": "≥ 50 jetons/s", "logs.filter.reset": "Réinitialiser les filtres", - "logs.filter.showingCount": "{count} sur {total} affichées", + "logs.filter.showingCount": "Affichage de {count} sur {total}", "logs.noMatchingRequests": "Aucune requête correspondante.", "logs.filter.surface.all": "Toutes", "logs.filter.surface.claude": "Claude", diff --git a/gui/src/i18n/tr.ts b/gui/src/i18n/tr.ts index 1b5724021a..3b637bbb47 100644 --- a/gui/src/i18n/tr.ts +++ b/gui/src/i18n/tr.ts @@ -703,9 +703,9 @@ export const tr: Record = { "logs.filter.time.24h": "Son 1 gün", "logs.filter.speed.label": "Hız", "logs.filter.speed.all": "Tüm hızlar", - "logs.filter.speed.slow": "< 15 belirteç/sn", - "logs.filter.speed.medium": "15–< 50 belirteç/sn", - "logs.filter.speed.fast": "≥ 50 belirteç/sn", + "logs.filter.speed.slow": "< 15 token/sn", + "logs.filter.speed.medium": "15–< 50 token/sn", + "logs.filter.speed.fast": "≥ 50 token/sn", "logs.filter.reset": "Filtreleri sıfırla", "logs.filter.showingCount": "{total} içinden {count} gösteriliyor", "logs.noMatchingRequests": "Eşleşen istek yok.", @@ -738,9 +738,9 @@ export const tr: Record = { "logs.col.provider": "Sağlayıcı", "logs.col.status": "Durum", "logs.col.tokens": "Jetonlar", - "logs.col.tokPerSec": "jeton/sn", + "logs.col.tokPerSec": "token/sn", "logs.col.estimatedCost": "~$", - "logs.metric.tokPerSecTitle": "Çıktı jetonu / saniye", + "logs.metric.tokPerSecTitle": "Tam istek süresince saniye başına çıktı tokenı", "logs.metric.estimatedCostTitle": "Tahmini API liste fiyatı", "usage.cost.total": "API liste fiyatı eşdeğeri", "usage.cost.disclaimer": "Fatura makbuzu değildir.", diff --git a/gui/src/pages/Logs.tsx b/gui/src/pages/Logs.tsx index a41b6bdb62..19b5f19bc4 100644 --- a/gui/src/pages/Logs.tsx +++ b/gui/src/pages/Logs.tsx @@ -257,6 +257,10 @@ function formatTokPerSecond(result: TokPerSecondResult | undefined, localeTag?: } const LOGS_POLL_INTERVAL_MS = 2000; +// Relative time filters must advance even when the polled snapshot is unchanged. Keep the +// refresh independent from the network poll so an active 15m/1h/24h window expires rows while +// the proxy is idle. +const LOGS_FILTER_CLOCK_INTERVAL_MS = 30_000; const LOGS_POLL_BACKOFF_MAX_EXPONENT = 4; /** Consecutive failed polls before a stale table is called out. */ const STALE_POLL_FAILURE_LIMIT = 3; @@ -376,6 +380,7 @@ export default function Logs({ apiBase }: { apiBase: string }) { ); const [detail, setDetail] = useState(null); const [filters, setFilters] = useState(DEFAULT_LOG_FILTER_STATE); + const [filterClockNow, setFilterClockNow] = useState(() => Date.now()); const scrollContainerRef = useRef(null); const logRetryRef = useRef<{ key: string; failures: number; nextAttemptAt: number; error: unknown }>( { key: resourceKey, failures: 0, nextAttemptAt: 0, error: null }, @@ -499,6 +504,13 @@ export default function Logs({ apiBase }: { apiBase: string }) { const detailInfo = detail ? statusCodeInfo(detail.status, locale) : null; const conversationQuery = filters.conversationId.trim(); + useEffect(() => { + if (filters.timeWindow === "all" || tab !== "logs") return; + setFilterClockNow(Date.now()); + const timer = window.setInterval(() => setFilterClockNow(Date.now()), LOGS_FILTER_CLOCK_INTERVAL_MS); + return () => window.clearInterval(timer); + }, [filters.timeWindow, tab]); + useEffect(() => { let cancelled = false; if (!conversationQuery) { @@ -512,8 +524,24 @@ export default function Logs({ apiBase }: { apiBase: string }) { }, [conversationQuery]); const filterOptions = useMemo(() => extractLogFilterOptions(logs), [logs]); + // A selected option can disappear when the bounded log snapshot rolls over. Native + // controls render such a value as an unlabeled/blank selection while the - // filter still excludes every row. Clear only the vanished model/provider identity; - // all other filters remain intact and the control returns to its explicit "All" option. + // Native selects require the exact current option spelling even though filtering + // compares normalized identities. Reconcile casing changes on ring rollover, and + // clear only identities that disappeared; keep every other filter intact. useEffect(() => { - const model = filters.model.trim().toLowerCase(); - const provider = filters.provider.trim().toLowerCase(); - const modelStillPresent = !model || filterOptions.models.some(option => option.trim().toLowerCase() === model); - const providerStillPresent = !provider || filterOptions.providers.some(option => option.trim().toLowerCase() === provider); - if (modelStillPresent && providerStillPresent) return; - setFilters(previous => ({ - ...previous, - ...(modelStillPresent ? {} : { model: "" }), - ...(providerStillPresent ? {} : { provider: "" }), - })); + setFilters(previous => { + const model = previous.model.trim().toLowerCase(); + const provider = previous.provider.trim().toLowerCase(); + const nextModel = model + ? filterOptions.models.find(option => option.trim().toLowerCase() === model) ?? "" + : ""; + const nextProvider = provider + ? filterOptions.providers.find(option => option.trim().toLowerCase() === provider) ?? "" + : ""; + if (previous.model === nextModel && previous.provider === nextProvider) return previous; + return { ...previous, model: nextModel, provider: nextProvider }; + }); }, [filterOptions, filters.model, filters.provider]); const activeFilters = hasActiveLogFilters(filters); const filteredLogs = useMemo(() => filterLogs(logs, filters, filterClockNow), [logs, filters, filterClockNow]); diff --git a/gui/tests/logs-auto-refresh.test.tsx b/gui/tests/logs-auto-refresh.test.tsx index a9cccc613c..e40fad1cda 100644 --- a/gui/tests/logs-auto-refresh.test.tsx +++ b/gui/tests/logs-auto-refresh.test.tsx @@ -790,6 +790,44 @@ test("Logs: ring rollover clears only vanished model and provider selections", a } }); +test("Logs: casing-only rollover retains model and provider selection with current option spellings", async () => { + let rows = [ + { ...sampleLog, requestId: "selected", model: "GPT-5", provider: "OpenAI" }, + { ...sampleLog, requestId: "other-model", model: "model-other", provider: "OpenAI" }, + { ...sampleLog, requestId: "other-provider", model: "GPT-5", provider: "xai" }, + ]; + serveLogSnapshot(() => rows); + const { root, container } = await mountLogs(); + try { + await flushMicrotasks(); + await changeLogSelect(container, "Model", "GPT-5"); + await changeLogSelect(container, "Provider", "OpenAI"); + await changeLogSelect(container, "Status", "success"); + const select = (label: string) => container.querySelector(`select[aria-label="${label}"]`)!; + expect(select("Model").value).toBe("GPT-5"); + expect(select("Provider").value).toBe("OpenAI"); + expect(visibleRequestIds(container)).toEqual(["selected"]); + + rows = rows.map(row => ({ ...row, model: row.model === "GPT-5" ? "gpt-5" : row.model })); + await advanceSilentRefresh(); + expect(select("Model").value).toBe("gpt-5"); + expect(select("Model").selectedOptions[0]?.value).toBe("gpt-5"); + expect(select("Provider").value).toBe("OpenAI"); + expect(visibleRequestIds(container)).toEqual(["selected"]); + + rows = rows.map(row => ({ ...row, provider: row.provider === "OpenAI" ? "openai" : row.provider })); + await advanceSilentRefresh(); + expect(select("Provider").value).toBe("openai"); + expect(select("Provider").selectedOptions[0]?.value).toBe("openai"); + expect(select("Model").value).toBe("gpt-5"); + expect(select("Status").value).toBe("success"); + expect(visibleRequestIds(container)).toEqual(["selected"]); + expect(container.querySelector(".logs-filter-status")?.textContent).toContain("Showing 1 of 3"); + } finally { + await act(async () => { root.unmount(); }); + } +}); + test("Logs: detail conversation action and reset use the same filter state", async () => { const digest = jest.spyOn(crypto.subtle, "digest") .mockResolvedValueOnce(new Uint8Array(32).fill(17).buffer) From a7fd87188db1356e98ee97e6fa1e99293f9c8060 Mon Sep 17 00:00:00 2001 From: t Date: Sun, 6 Sep 2026 05:36:49 +0900 Subject: [PATCH 8/9] fix(logs): retain reset focus and use the proxy clock for windows --- .../042_logs_review_corrections.md | 29 ++ .../screenshots/logs-filters-proxy-clock.png | Bin 0 -> 157068 bytes .../content/docs/fr/guides/web-dashboard.md | 2 +- .../src/content/docs/guides/web-dashboard.md | 10 +- .../content/docs/ja/guides/web-dashboard.md | 2 +- .../content/docs/ko/guides/web-dashboard.md | 9 +- .../content/docs/ru/guides/web-dashboard.md | 2 +- .../content/docs/tr/guides/web-dashboard.md | 2 +- .../docs/zh-cn/guides/web-dashboard.md | 2 +- gui/src/pages/Logs.tsx | 42 ++- gui/src/pages/logs-clock.ts | 17 ++ gui/src/pages/logs-filter-bar.tsx | 9 +- gui/tests/logs-auto-refresh.test.tsx | 262 +++++++++++++++++- gui/tests/logs-clock.test.ts | 23 ++ gui/tests/logs-filter-bar.test.ts | 22 +- src/server/management/logs-usage-routes.ts | 1 + structure/05_gui-and-management-api.md | 2 +- tests/server/logs-timezone.test.ts | 11 +- 18 files changed, 421 insertions(+), 26 deletions(-) create mode 100644 devlog/_plan/260906_d_integrations_delivery/042_logs_review_corrections.md create mode 100644 docs-site/public/screenshots/logs-filters-proxy-clock.png create mode 100644 gui/src/pages/logs-clock.ts create mode 100644 gui/tests/logs-clock.test.ts diff --git a/devlog/_plan/260906_d_integrations_delivery/042_logs_review_corrections.md b/devlog/_plan/260906_d_integrations_delivery/042_logs_review_corrections.md new file mode 100644 index 0000000000..9141d9527f --- /dev/null +++ b/devlog/_plan/260906_d_integrations_delivery/042_logs_review_corrections.md @@ -0,0 +1,29 @@ +# Logs review corrections: focus and proxy-relative windows + +## Loop specification + +Archetype: bounded correctness repair (C3). Trigger: #3712 review threads PRRT_kwDOS-0Gi86fmmdd and PRRT_kwDOS-0Gi86fmpGe. Goal: keyboard Reset returns focus to a stable selected surface control; relative windows use the proxy clock despite browser wall-clock skew. Non-goals: changing log history, server-side filtering, auth, URLs, or UI layout. Verifier: rendered GUI cases, real management envelope test, pinned remote typecheck/root/GUI checks plus browser activation. Stop: candidate verified; final logs-proof/c-2 still require dev integration and hosted CI. Memory: this042 and ignored receipts. Failed gates stay open. Main reclaims a delegated packet after two distinct worker failures; new scopes require a P amendment. + +Prior D accepted the Cursor guidance candidate92f848e8, with final c-4 shipping still open. These parent Logs findings stopped the admin merge before any mutation. Build the correction on Logs248177c9, preserve the child3715 commit, then merge the corrected parent into that child. Do not rewrite either original author history. Existing screenshots describe the unchanged layout; browser verification adds reset-focus and a deliberately skewed synthetic proxy clock. + +## Grounded owners and changes + +- `src/server/management/logs-usage-routes.ts` GET /api/logs already returns an envelope with timeZone,total,logs (older array support remains in the GUI). Add `generatedAt: Date.now()` in that envelope. It is the proxy epoch milliseconds sampled while preparing the response. No headers/auth/CORS or existing fields change. +- `tests/server/logs-timezone.test.ts`: real handleManagementAPI response must include a finite generatedAt between pre/post request wall-clock samples and still carry logs/total/timeZone. Do not mirror the implementation in a fake formatter. +- `gui/src/pages/Logs.tsx`: capture valid numeric generatedAt on successful logs reads and anchor it to browser performance.now at receipt. The filter clock advances from server epoch plus monotonic elapsed time, not browser Date.now. New samples resynchronize the anchor. An aborted/stale response must not change the clock; clear/replace the anchor when apiBase/resourceKey changes. Network failures keep the last accepted anchor. Legacy arrays/envelopes lacking a usable timestamp preserve the existing browser-clock fallback until a server sample exists; do not pretend old servers supply precision they lack. Poll backoff remains separate. +- Small pure clock logic may live in `gui/src/pages/logs-clock.ts` if that keeps the large page readable; no generic clock framework. Document creation (generatedAt), serialization (envelope), validation/deserialization (finite nonnegative number), and consumers (relative-window timer and immediate selection) in the helper/page. Timezone formatting still uses timeZone independently. +- `gui/src/pages/logs-filter-bar.tsx`: the Reset click handler first performs the existing state reset, then restores focus to the stable All surface radio with a component-owned ref; avoid document-global queries or per-render focus stealing. Pointer and keyboard activation share the handler. The surface control remains mounted and selected after reset; no permanently disabled toolbar or layout expansion. +- `gui/tests/logs-auto-refresh.test.tsx` and `logs-filter-bar.test.ts`: actual rendered Reset activation verifies document.activeElement points to All after reset and the filters/default rows are restored. Add generatedAt envelope fixtures for browser clocks ahead AND behind by hours; a fresh row stays in15m while an older row is excluded. Advance the monotonic clock without network/with auto-refresh OFF to expire the row. A browser wall-clock jump after sampling must not shift the window. Cover fresh sample resync, malformed/legacy fallback, API-base switch and aborted late response not poisoning the active clock. Existing rollover/hash/timer tests remain meaningful, adapting their clock seam where required. A small logs-clock.test.ts is allowed for pure fallback validation; the skew acceptance must exercise rendered Logs. +- `docs-site/src/content/docs/guides/web-dashboard.md`, Korean counterpart and `structure/05_gui-and-management-api.md`: explain proxy-clock windows and stable reset focus, with older-proxy fallback stated accurately. Other translations must not contradict the source; no new untranslated UI strings are needed. + +## Activation matrix + +1. Apply a filter, focus Reset, activate it with keyboard: button can disappear but focus lands on selected All; subsequent navigation continues within the stable surface group. Also click Reset and verify focus. +2. Browser Date.now is six hours ahead, then six hours behind proxy generatedAt. Fifteen-minute window still selects only the same fresh proxy row; all-time remains unaffected. +3. Pause auto refresh, advance monotonic30s tick past a relative cutoff: old row expires with no fetch. Change browser wall-clock separately: rows do not jump. +4. Later successful server sample updates the anchor. A failed or aborted request cannot replace it; a different apiBase cannot inherit the previous server epoch. Legacy/malformed metadata uses documented fallback, never NaN windows. +5. Real management API returns generatedAt in the request time interval and preserves the envelope shape. Existing metrics/authorization tests remain green. + +## Delegation and verification + +Main owns server route/test, docs, Git/CI/FSM and native browser QA. Inherited Huygens owns only the GUI page/filter bar/optional clock helper and the corresponding GUI tests. Nash audits before B; independent implementation review follows. All application test/typecheck/lint/build commands run remotely; no local suite. Remote GUI checks include all GUI tests, lint/i18n/build, plus root typecheck/full suite and docs build. Final receipts state any queued GitHub jobs explicitly rather than marking them passed. diff --git a/docs-site/public/screenshots/logs-filters-proxy-clock.png b/docs-site/public/screenshots/logs-filters-proxy-clock.png new file mode 100644 index 0000000000000000000000000000000000000000..a82351915b3fc79abeccc0cdb67ad2d3b55d777e GIT binary patch literal 157068 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

GMgK1)G$lmc%hSH{V2L_qgccR@Iq;faBcCulD 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 const [filters, setFilters] = useState(DEFAULT_LOG_FILTER_STATE); const [filterClockNow, setFilterClockNow] = useState(() => Date.now()); + const filterClockRef = useRef<{ + key: string; anchor?: LogsClockAnchor; active: boolean; request: number; + }>({ key: resourceKey, active: false, request: 0 }); + // Invalidate the old resource at commit, before passive resource-loader effects. + // A late body read must not mutate this page's clock, cache or retry state. + useLayoutEffect(() => { + const clock = { key: resourceKey, active: true, request: 0 }; + filterClockRef.current = clock; + setFilterClockNow(Date.now()); + return () => { clock.active = false; }; + }, [resourceKey]); + const readFilterClockNow = useCallback(() => { + const clock = filterClockRef.current; + return logsClockNow(clock.key === resourceKey ? clock.anchor : undefined, performance.now(), Date.now()); + }, [resourceKey]); const scrollContainerRef = useRef(null); const logRetryRef = useRef<{ key: string; failures: number; nextAttemptAt: number; error: unknown }>( { key: resourceKey, failures: 0, nextAttemptAt: 0, error: null }, @@ -433,6 +449,13 @@ export default function Logs({ apiBase }: { apiBase: string }) { const selectTab = selectLogsTab; const loadLogs = useCallback(async (signal: AbortSignal): Promise => { + const clock = filterClockRef.current; + if (signal.aborted || !clock.active || clock.key !== resourceKey) { + throw signal.reason ?? new DOMException("Obsolete log request", "AbortError"); + } + const request = ++clock.request; + const isCurrent = () => !signal.aborted && clock.active + && filterClockRef.current === clock && clock.request === request; let retry = logRetryRef.current; if (retry.key !== resourceKey) { retry = { key: resourceKey, failures: 0, nextAttemptAt: 0, error: null }; @@ -442,14 +465,21 @@ export default function Logs({ apiBase }: { apiBase: string }) { try { const res = await fetch(`${apiBase}/api/logs?limit=2000`, { signal }); if (!res.ok) throw new Error(`${res.status} ${res.statusText}`.trim()); - const body = await res.json() as LogEntry[] | { logs?: LogEntry[] }; + const body = await res.json() as LogEntry[] | { logs?: LogEntry[]; generatedAt?: unknown }; + const receivedAt = performance.now(); const raw = Array.isArray(body) ? body : (body.logs ?? []); const next = raw.map(sanitizeLogEntryRouteDecision); + // The resource-store generation guard runs only after this loader returns. + // Guard these local side effects here as fetch/body readers may ignore abort. + if (!isCurrent()) throw signal.reason ?? new DOMException("Obsolete log request", "AbortError"); + const sample = logsClockAnchor(Array.isArray(body) ? undefined : body.generatedAt, receivedAt); + if (sample) clock.anchor = sample; + setFilterClockNow(logsClockNow(clock.anchor, receivedAt, Date.now())); logRetryRef.current = { key: resourceKey, failures: 0, nextAttemptAt: 0, error: null }; writeSessionListCache(resourceKey, next); return next; } catch (error) { - if (signal.aborted) throw error; + if (!isCurrent()) throw error; const normalized = error ?? new Error("log request failed"); const failures = retry.failures + 1; const backoffMs = LOGS_POLL_INTERVAL_MS * (2 ** Math.min( @@ -506,10 +536,10 @@ export default function Logs({ apiBase }: { apiBase: string }) { useEffect(() => { if (filters.timeWindow === "all" || tab !== "logs") return; - setFilterClockNow(Date.now()); - const timer = window.setInterval(() => setFilterClockNow(Date.now()), LOGS_FILTER_CLOCK_INTERVAL_MS); + setFilterClockNow(readFilterClockNow()); + const timer = window.setInterval(() => setFilterClockNow(readFilterClockNow()), LOGS_FILTER_CLOCK_INTERVAL_MS); return () => window.clearInterval(timer); - }, [filters.timeWindow, tab]); + }, [filters.timeWindow, tab, readFilterClockNow]); useEffect(() => { let cancelled = false; diff --git a/gui/src/pages/logs-clock.ts b/gui/src/pages/logs-clock.ts new file mode 100644 index 0000000000..e9a8a8bf1f --- /dev/null +++ b/gui/src/pages/logs-clock.ts @@ -0,0 +1,17 @@ +/** Proxy epoch sampled by GET /api/logs, paired with the browser's monotonic receipt time. */ +export interface LogsClockAnchor { + generatedAt: number; + receivedAt: number; +} + +/** Legacy arrays and envelopes without a valid server sample do not replace an anchor. */ +export function logsClockAnchor(generatedAt: unknown, receivedAt: number): LogsClockAnchor | undefined { + return typeof generatedAt === "number" && Number.isFinite(generatedAt) && generatedAt >= 0 + ? { generatedAt, receivedAt } + : undefined; +} + +/** Older proxies retain browser-wall-clock behavior until this resource supplies a sample. */ +export function logsClockNow(anchor: LogsClockAnchor | undefined, monotonicNow: number, wallNow: number): number { + return anchor ? anchor.generatedAt + Math.max(0, monotonicNow - anchor.receivedAt) : wallNow; +} diff --git a/gui/src/pages/logs-filter-bar.tsx b/gui/src/pages/logs-filter-bar.tsx index 20bb4c19b5..ae478bf61b 100644 --- a/gui/src/pages/logs-filter-bar.tsx +++ b/gui/src/pages/logs-filter-bar.tsx @@ -1,3 +1,4 @@ +import { useRef } from "react"; import type { TFn } from "../i18n/shared"; import { IconX } from "../icons"; import { formatProviderDisplayName } from "../provider-icons"; @@ -18,6 +19,11 @@ interface LogsFilterBarProps { export function LogsFilterBar({ filters, options, hasActiveFilters, filteredCount, totalCount, t, onFilterChange, onResetFilters, }: LogsFilterBarProps) { + const allSurfaceRef = useRef(null); + const resetFilters = () => { + onResetFilters(); + allSurfaceRef.current?.focus({ preventScroll: true }); + }; const currentSpeed = filters.maxTokPerSec === 15 ? "slow" : filters.minTokPerSec === 15 && filters.maxTokPerSec === 50 @@ -43,6 +49,7 @@ export function LogsFilterBar({ {(["all", "claude", "codex", "grok"] as const).map(surface => ( +

)}
diff --git a/gui/tests/logs-auto-refresh.test.tsx b/gui/tests/logs-auto-refresh.test.tsx index e40fad1cda..a4bef33462 100644 --- a/gui/tests/logs-auto-refresh.test.tsx +++ b/gui/tests/logs-auto-refresh.test.tsx @@ -108,7 +108,7 @@ afterEach(() => { } }); -async function mountLogs(): Promise<{ root: Root; container: HTMLElement }> { +async function mountLogs(apiBase = "http://localhost"): Promise<{ root: Root; container: HTMLElement }> { const { createRoot } = await import("react-dom/client"); const container = document.createElement("div"); document.body.append(container); @@ -117,7 +117,7 @@ async function mountLogs(): Promise<{ root: Root; container: HTMLElement }> { root = createRoot(container); root.render( - + , ); }); @@ -849,6 +849,8 @@ test("Logs: detail conversation action and reset use the same filter state", asy await act(async () => { container.querySelector(".logs-filter-status button")!.click(); }); expect(visibleRequestIds(container)).toEqual(["other", "hashed"]); expect(container.querySelector(".logs-filter-status")).toBeNull(); + expect(document.activeElement).toBe(container.querySelector("#logs-surface-all")); + expect(container.querySelector("#logs-surface-all")?.getAttribute("aria-checked")).toBe("true"); const detail = container.querySelector('.log-detail-btn[aria-label="Details: other"]')!; expect(detail).not.toBeNull(); await act(async () => { detail.click(); }); @@ -943,3 +945,259 @@ test("Logs: a cold empty snapshot shows no requests rather than no matches", asy await act(async () => { root.unmount(); }); } }); + +const PROXY_NOW = 1_800_000_000_000; + +function proxyLogEnvelope(generatedAt: unknown, logs: unknown[]) { + return { generatedAt, timeZone: "UTC", total: logs.length, logs }; +} + +async function renderLogsAt(root: Root, apiBase: string): Promise { + await act(async () => { + root.render(); + }); + await flushMicrotasks(); +} + +test.each([-6, 6])("Logs: proxy clock handles browser skew of %sh, wall jumps and paused expiry", async hours => { + let wallNow = PROXY_NOW + hours * 60 * 60_000; + let monotonic = 1000; + const wall = jest.spyOn(Date, "now").mockImplementation(() => wallNow); + const monotonicClock = jest.spyOn(performance, "now").mockImplementation(() => monotonic); + const clock = trackFilterClock(); + let requests = 0; + const rows = [ + { ...sampleLog, requestId: "too-old", timestamp: PROXY_NOW - 15 * 60_000 - 1000 }, + { ...sampleLog, requestId: "fresh", timestamp: PROXY_NOW - 15 * 60_000 + 1000 }, + ]; + globalThis.fetch = (async input => { + if (!String(input).includes("/api/logs")) return jsonResponse({ timeZone: "UTC" }); + requests++; + return jsonResponse(proxyLogEnvelope(PROXY_NOW, rows)); + }) as typeof fetch; + let mounted: Awaited> | undefined; + try { + mounted = await mountLogs(); + const { container } = mounted; + await flushMicrotasks(); + expect(visibleRequestIds(container)).toEqual(["fresh", "too-old"]); + await changeLogSelect(container, "Time", "15m"); + expect(visibleRequestIds(container)).toEqual(["fresh"]); + await act(async () => { container.querySelector(".logs-auto-refresh input")!.click(); }); + await flushMicrotasks(); + const pausedRequests = requests; + wallNow += 12 * 60 * 60_000; + monotonic += 500; + await act(async () => { jest.advanceTimersByTime(30_000); }); + await flushMicrotasks(); + expect(visibleRequestIds(container)).toEqual(["fresh"]); + wallNow -= 24 * 60 * 60_000; + monotonic += 30_000; + await act(async () => { jest.advanceTimersByTime(30_000); }); + await flushMicrotasks(); + expect(visibleRequestIds(container)).toEqual([]); + expect(container.textContent).toContain("No matching requests."); + expect(requests).toBe(pausedRequests); + await changeLogSelect(container, "Time", "all"); + expect(visibleRequestIds(container)).toEqual(["fresh", "too-old"]); + } finally { + try { + if (mounted) await act(async () => { mounted!.root.unmount(); }); + } finally { + clock.restore(); + wall.mockRestore(); + monotonicClock.mockRestore(); + } + } +}); + +test("Logs: successful proxy samples resync immediately; legacy, malformed and failed refreshes retain the anchor", async () => { + const wall = jest.spyOn(Date, "now").mockReturnValue(PROXY_NOW - 6 * 60 * 60_000); + let monotonic = 1000; + const monotonicClock = jest.spyOn(performance, "now").mockImplementation(() => monotonic); + const clock = trackFilterClock(); + const rows = [{ ...sampleLog, requestId: "row", timestamp: PROXY_NOW - 5 * 60_000 }]; + let mode: "initial" | "resync" | "legacy" | "malformed" | "failed" = "initial"; + globalThis.fetch = (async input => { + if (!String(input).includes("/api/logs")) return jsonResponse({ timeZone: "UTC" }); + if (mode === "failed") return jsonResponse({ error: "unavailable" }, 503); + if (mode === "legacy") return jsonResponse(rows); + if (mode === "malformed") return jsonResponse(proxyLogEnvelope(-1, rows)); + return jsonResponse(proxyLogEnvelope(mode === "initial" ? PROXY_NOW : PROXY_NOW + 20 * 60_000, rows)); + }) as typeof fetch; + let mounted: Awaited> | undefined; + try { + mounted = await mountLogs(); + const { container } = mounted; + await flushMicrotasks(); + await changeLogSelect(container, "Time", "15m"); + expect(visibleRequestIds(container)).toEqual(["row"]); + mode = "resync"; + await advanceSilentRefresh(); + // No 30s interval tick yet: receipt of a new server sample updates the filter. + expect(visibleRequestIds(container)).toEqual([]); + for (const next of ["legacy", "malformed", "failed"] as const) { + mode = next; + await advanceSilentRefresh(); + expect(visibleRequestIds(container)).toEqual([]); + } + monotonic += 30_000; + await act(async () => { jest.advanceTimersByTime(30_000); }); + await flushMicrotasks(); + expect(visibleRequestIds(container)).toEqual([]); + expect(container.textContent).toContain("No matching requests."); + } finally { + try { + if (mounted) await act(async () => { mounted!.root.unmount(); }); + } finally { + clock.restore(); + wall.mockRestore(); + monotonicClock.mockRestore(); + } + } +}); + +test("Logs: switching apiBase clears the old proxy anchor for a legacy envelope", async () => { + const browserNow = PROXY_NOW + 6 * 60 * 60_000; + const wall = jest.spyOn(Date, "now").mockReturnValue(browserNow); + const monotonicClock = jest.spyOn(performance, "now").mockReturnValue(1000); + globalThis.fetch = (async input => { + const url = String(input); + if (!url.includes("/api/logs")) return jsonResponse({ timeZone: "UTC" }); + if (url.startsWith("http://proxy-a/")) return jsonResponse(proxyLogEnvelope(PROXY_NOW, [ + { ...sampleLog, requestId: "proxy-a", timestamp: PROXY_NOW - 60_000 }, + ])); + return jsonResponse({ logs: [ + { ...sampleLog, requestId: "legacy-old", timestamp: browserNow - 20 * 60_000 }, + { ...sampleLog, requestId: "legacy-fresh", timestamp: browserNow - 5 * 60_000 }, + ] }); + }) as typeof fetch; + let mounted: Awaited> | undefined; + try { + mounted = await mountLogs("http://proxy-a"); + const { root, container } = mounted; + await flushMicrotasks(); + await changeLogSelect(container, "Time", "15m"); + expect(visibleRequestIds(container)).toEqual(["proxy-a"]); + await renderLogsAt(root, "http://proxy-b"); + expect(container.querySelector('select[aria-label="Time"]')!.value).toBe("15m"); + expect(visibleRequestIds(container)).toEqual(["legacy-fresh"]); + } finally { + try { + if (mounted) await act(async () => { mounted!.root.unmount(); }); + } finally { + wall.mockRestore(); + monotonicClock.mockRestore(); + } + } +}); + +// The response headers have arrived, but its body reader deliberately ignores abort. +// This reaches the loader's side-effect boundary after the resource-store guard fired. +function delayedLogBody() { + let resolve!: (body: unknown) => void; + const body = new Promise(done => { resolve = done; }); + const response = jsonResponse({}); + response.json = () => body; + return { response, resolve }; +} + +test("Logs: a late body from an aborted old apiBase cannot poison the new proxy clock", async () => { + const late = delayedLogBody(); + let oldSignal: AbortSignal | undefined; + let oldRequests = 0; + const wall = jest.spyOn(Date, "now").mockReturnValue(PROXY_NOW + 6 * 60 * 60_000); + let monotonic = 1000; + const monotonicClock = jest.spyOn(performance, "now").mockImplementation(() => monotonic); + const clock = trackFilterClock(); + globalThis.fetch = (async (input, init) => { + const url = String(input); + if (!url.includes("/api/logs")) return jsonResponse({ timeZone: "UTC" }); + if (url.startsWith("http://proxy-a/")) { + oldRequests++; + oldSignal = init?.signal ?? undefined; + return late.response; + } + return jsonResponse(proxyLogEnvelope(PROXY_NOW, [ + { ...sampleLog, requestId: "proxy-b", timestamp: PROXY_NOW - 60_000 }, + ])); + }) as typeof fetch; + let mounted: Awaited> | undefined; + try { + mounted = await mountLogs("http://proxy-a"); + const { root, container } = mounted; + await flushMicrotasks(); + expect(oldRequests).toBe(1); + await renderLogsAt(root, "http://proxy-b"); + expect(oldSignal?.aborted).toBe(true); + await changeLogSelect(container, "Time", "15m"); + await act(async () => { container.querySelector(".logs-auto-refresh input")!.click(); }); + await flushMicrotasks(); + expect(visibleRequestIds(container)).toEqual(["proxy-b"]); + await act(async () => { late.resolve(proxyLogEnvelope(PROXY_NOW + 12 * 60 * 60_000, [])); }); + await flushMicrotasks(); + expect(visibleRequestIds(container)).toEqual(["proxy-b"]); + monotonic += 30_000; + await act(async () => { jest.advanceTimersByTime(30_000); }); + await flushMicrotasks(); + expect(visibleRequestIds(container)).toEqual(["proxy-b"]); + } finally { + try { + if (mounted) await act(async () => { mounted!.root.unmount(); }); + } finally { + clock.restore(); + wall.mockRestore(); + monotonicClock.mockRestore(); + } + } +}); + +test("Logs: aborting an in-flight refresh before pausing cannot replace the accepted clock", async () => { + const late = delayedLogBody(); + let requests = 0; + let lateSignal: AbortSignal | undefined; + const wall = jest.spyOn(Date, "now").mockReturnValue(PROXY_NOW - 6 * 60 * 60_000); + let monotonic = 1000; + const monotonicClock = jest.spyOn(performance, "now").mockImplementation(() => monotonic); + const clock = trackFilterClock(); + globalThis.fetch = (async (input, init) => { + if (!String(input).includes("/api/logs")) return jsonResponse({ timeZone: "UTC" }); + requests++; + if (requests === 2) { + lateSignal = init?.signal ?? undefined; + return late.response; + } + return jsonResponse(proxyLogEnvelope(PROXY_NOW, [ + { ...sampleLog, requestId: "current", timestamp: PROXY_NOW - 60_000 }, + ])); + }) as typeof fetch; + let mounted: Awaited> | undefined; + try { + mounted = await mountLogs(); + const { container } = mounted; + await flushMicrotasks(); + await changeLogSelect(container, "Time", "15m"); + await advanceSilentRefresh(); + expect(requests).toBe(2); + await act(async () => { container.querySelector(".logs-auto-refresh input")!.click(); }); + await flushMicrotasks(); + expect(lateSignal?.aborted).toBe(true); + const pausedRequests = requests; + await act(async () => { late.resolve(proxyLogEnvelope(PROXY_NOW + 12 * 60 * 60_000, [])); }); + await flushMicrotasks(); + expect(visibleRequestIds(container)).toEqual(["current"]); + monotonic += 30_000; + await act(async () => { jest.advanceTimersByTime(30_000); }); + await flushMicrotasks(); + expect(visibleRequestIds(container)).toEqual(["current"]); + expect(requests).toBe(pausedRequests); + } finally { + try { + if (mounted) await act(async () => { mounted!.root.unmount(); }); + } finally { + clock.restore(); + wall.mockRestore(); + monotonicClock.mockRestore(); + } + } +}); diff --git a/gui/tests/logs-clock.test.ts b/gui/tests/logs-clock.test.ts new file mode 100644 index 0000000000..e26bca8612 --- /dev/null +++ b/gui/tests/logs-clock.test.ts @@ -0,0 +1,23 @@ +import { expect, test } from "bun:test"; +import { logsClockAnchor, logsClockNow } from "../src/pages/logs-clock"; + +test.each([undefined, null, "1700000000000", -1, NaN, Infinity, -Infinity])( + "invalid generatedAt %s leaves the browser fallback in effect", generatedAt => { + const anchor = logsClockAnchor(generatedAt, 10); + expect(anchor).toBeUndefined(); + expect(logsClockNow(anchor, 100, 42_000)).toBe(42_000); + }, +); + +test("zero is a valid proxy epoch and elapsed time is monotonic", () => { + const anchor = logsClockAnchor(0, 100); + expect(anchor).toEqual({ generatedAt: 0, receivedAt: 100 }); + expect(logsClockNow(anchor, 150, 80_000)).toBe(50); + expect(logsClockNow(anchor, 160, 1)).toBe(60); +}); + +test("proxy-relative time ignores browser wall-clock skew and subsequent jumps", () => { + const anchor = logsClockAnchor(1_800_000_000_000, 500); + expect(logsClockNow(anchor, 30_500, 1_800_021_600_000)).toBe(1_800_000_030_000); + expect(logsClockNow(anchor, 30_500, 1_799_978_400_000)).toBe(1_800_000_030_000); +}); diff --git a/gui/tests/logs-filter-bar.test.ts b/gui/tests/logs-filter-bar.test.ts index 8c5ff7b64c..259c5defd4 100644 --- a/gui/tests/logs-filter-bar.test.ts +++ b/gui/tests/logs-filter-bar.test.ts @@ -1,4 +1,4 @@ -import { expect, test } from "bun:test"; +import { expect, jest, test } from "bun:test"; import { Window } from "happy-dom"; import { act, createElement, useState } from "react"; import type { Root } from "react-dom/client"; @@ -121,7 +121,7 @@ test("LogsFilterBar speed choices have non-overlapping bounds and clear both bou }); }); -test("LogsFilterBar reset clears multiple fields and removes the count and reset control", async () => { +test.each(["pointer", "keyboard"] as const)("LogsFilterBar %s reset restores focus to All and clears every field", async activation => { await withFilterBar({ ...DEFAULT_LOG_FILTER_STATE, surface: "grok", status: "errors", provider: "xai", model: "model-a", timeWindow: "1h", minTokPerSec: 50, interceptedOnly: true, @@ -132,7 +132,23 @@ test("LogsFilterBar reset clears multiple fields and removes the count and reset expect(reset).not.toBeNull(); reset.focus(); expect(document.activeElement).toBe(reset); - await act(async () => { reset.click(); }); + const all = ui.container.querySelector("#logs-surface-all")!; + const focus = jest.spyOn(all, "focus"); + try { + // Native buttons dispatch click with detail=0 for keyboard activation. + // Browser QA separately exercises Enter/Space's native event synthesis. + await act(async () => { + reset.dispatchEvent(new ui.win.MouseEvent("click", { + bubbles: true, cancelable: true, detail: activation === "keyboard" ? 0 : 1, + })); + }); + expect(document.activeElement).toBe(all); + expect(all.getAttribute("aria-checked")).toBe("true"); + expect(all.tabIndex).toBe(0); + expect(focus).toHaveBeenCalledWith({ preventScroll: true }); + } finally { + focus.mockRestore(); + } expect(ui.filters()).toEqual(DEFAULT_LOG_FILTER_STATE); expect(ui.container.querySelector(".logs-filter-status")).toBeNull(); expect(ui.container.querySelector('input[type="search"]')!.value).toBe(""); diff --git a/src/server/management/logs-usage-routes.ts b/src/server/management/logs-usage-routes.ts index 5d909283f2..dfb3c74df0 100644 --- a/src/server/management/logs-usage-routes.ts +++ b/src/server/management/logs-usage-routes.ts @@ -111,6 +111,7 @@ export async function handleLogsUsageRoutes(ctx: ManagementContext): Promise { @@ -24,16 +24,23 @@ describe("log timestamp timezone (#725)", () => { expect(() => new Intl.DateTimeFormat("en-US", { timeZone: body.timeZone as string })).not.toThrow(); }); - test("/api/logs envelope includes a usable timeZone", async () => { + test("/api/logs envelope includes the proxy clock and a usable timeZone", async () => { const url = new URL("http://localhost/api/logs"); + const before = Date.now(); const response = await handleManagementAPI(new Request(url), url, config); + const after = Date.now(); expect(response?.status).toBe(200); const body = await response!.json() as { timeZone?: unknown; + generatedAt?: unknown; total?: unknown; logs?: unknown; }; expect(typeof body.timeZone).toBe("string"); + expect(typeof body.generatedAt).toBe("number"); + expect(Number.isFinite(body.generatedAt)).toBe(true); + expect(body.generatedAt as number).toBeGreaterThanOrEqual(before); + expect(body.generatedAt as number).toBeLessThanOrEqual(after); expect(typeof body.total).toBe("number"); expect(Array.isArray(body.logs)).toBe(true); expect(() => new Intl.DateTimeFormat("en-US", { timeZone: body.timeZone as string })).not.toThrow(); From 2221aed73cf8ef5b24452f22eda369c6539b2273 Mon Sep 17 00:00:00 2001 From: t Date: Sun, 6 Sep 2026 05:49:52 +0900 Subject: [PATCH 9/9] fix(logs): reconcile filters when accepting refreshed rows --- .../042_logs_review_corrections.md | 4 ++ gui/src/pages/Logs.tsx | 33 +++++---- gui/tests/logs-auto-refresh.test.tsx | 71 +++++++++++++++++++ gui/tests/logs-filter-bar.test.ts | 4 +- 4 files changed, 93 insertions(+), 19 deletions(-) diff --git a/devlog/_plan/260906_d_integrations_delivery/042_logs_review_corrections.md b/devlog/_plan/260906_d_integrations_delivery/042_logs_review_corrections.md index 9141d9527f..7568eed82e 100644 --- a/devlog/_plan/260906_d_integrations_delivery/042_logs_review_corrections.md +++ b/devlog/_plan/260906_d_integrations_delivery/042_logs_review_corrections.md @@ -27,3 +27,7 @@ Prior D accepted the Cursor guidance candidate92f848e8, with final c-4 shipping ## Delegation and verification Main owns server route/test, docs, Git/CI/FSM and native browser QA. Inherited Huygens owns only the GUI page/filter bar/optional clock helper and the corresponding GUI tests. Nash audits before B; independent implementation review follows. All application test/typecheck/lint/build commands run remotely; no local suite. Remote GUI checks include all GUI tests, lint/i18n/build, plus root typecheck/full suite and docs build. Final receipts state any queued GitHub jobs explicitly rather than marking them passed. + +## Check-phase React Doctor correction + +A cold pinned0.9.11 scan with the actual6005 base available reported two concrete diagnostics: rollover selection was adjusted in a post-render effect, and the rendered filter-bar test assigned an external observer during render. Move reconciliation into acceptance of the latest valid log response, preserving permanent reset when an identity disappears and current spelling when it remains. Keep component rendering pure by observing test state from an effect/event. No rule suppression is planned. Re-run the cold changed-scope scan before the regression suites. The earlier same-head hosted success is retained as an observed run result; it is not evidence that these diagnostics were absent. diff --git a/gui/src/pages/Logs.tsx b/gui/src/pages/Logs.tsx index e175096c95..2632ae8788 100644 --- a/gui/src/pages/Logs.tsx +++ b/gui/src/pages/Logs.tsx @@ -472,6 +472,22 @@ export default function Logs({ apiBase }: { apiBase: string }) { // The resource-store generation guard runs only after this loader returns. // Guard these local side effects here as fetch/body readers may ignore abort. if (!isCurrent()) throw signal.reason ?? new DOMException("Obsolete log request", "AbortError"); + // Reconcile when the accepted snapshot changes, using the latest user state + // rather than filters captured when the request started. Persist disappearance + // as All so a later ring cannot resurrect a cleared selection. + const options = extractLogFilterOptions(next); + setFilters(previous => { + const model = previous.model.trim().toLowerCase(); + const provider = previous.provider.trim().toLowerCase(); + const nextModel = model + ? options.models.find(option => option.trim().toLowerCase() === model) ?? "" + : ""; + const nextProvider = provider + ? options.providers.find(option => option.trim().toLowerCase() === provider) ?? "" + : ""; + if (previous.model === nextModel && previous.provider === nextProvider) return previous; + return { ...previous, model: nextModel, provider: nextProvider }; + }); const sample = logsClockAnchor(Array.isArray(body) ? undefined : body.generatedAt, receivedAt); if (sample) clock.anchor = sample; setFilterClockNow(logsClockNow(clock.anchor, receivedAt, Date.now())); @@ -554,23 +570,6 @@ export default function Logs({ apiBase }: { apiBase: string }) { }, [conversationQuery]); const filterOptions = useMemo(() => extractLogFilterOptions(logs), [logs]); - // Native selects require the exact current option spelling even though filtering - // compares normalized identities. Reconcile casing changes on ring rollover, and - // clear only identities that disappeared; keep every other filter intact. - useEffect(() => { - setFilters(previous => { - const model = previous.model.trim().toLowerCase(); - const provider = previous.provider.trim().toLowerCase(); - const nextModel = model - ? filterOptions.models.find(option => option.trim().toLowerCase() === model) ?? "" - : ""; - const nextProvider = provider - ? filterOptions.providers.find(option => option.trim().toLowerCase() === provider) ?? "" - : ""; - if (previous.model === nextModel && previous.provider === nextProvider) return previous; - return { ...previous, model: nextModel, provider: nextProvider }; - }); - }, [filterOptions, filters.model, filters.provider]); const activeFilters = hasActiveLogFilters(filters); const filteredLogs = useMemo(() => filterLogs(logs, filters, filterClockNow), [logs, filters, filterClockNow]); const conversationTotals = conversationQuery ? summarizeFilteredLogs(filteredLogs) : null; diff --git a/gui/tests/logs-auto-refresh.test.tsx b/gui/tests/logs-auto-refresh.test.tsx index a4bef33462..44366f146b 100644 --- a/gui/tests/logs-auto-refresh.test.tsx +++ b/gui/tests/logs-auto-refresh.test.tsx @@ -1131,12 +1131,16 @@ test("Logs: a late body from an aborted old apiBase cannot poison the new proxy await renderLogsAt(root, "http://proxy-b"); expect(oldSignal?.aborted).toBe(true); await changeLogSelect(container, "Time", "15m"); + await changeLogSelect(container, "Model", "gpt-test"); + await changeLogSelect(container, "Provider", "openai"); await act(async () => { container.querySelector(".logs-auto-refresh input")!.click(); }); await flushMicrotasks(); expect(visibleRequestIds(container)).toEqual(["proxy-b"]); await act(async () => { late.resolve(proxyLogEnvelope(PROXY_NOW + 12 * 60 * 60_000, [])); }); await flushMicrotasks(); expect(visibleRequestIds(container)).toEqual(["proxy-b"]); + expect(container.querySelector('select[aria-label="Model"]')!.value).toBe("gpt-test"); + expect(container.querySelector('select[aria-label="Provider"]')!.value).toBe("openai"); monotonic += 30_000; await act(async () => { jest.advanceTimersByTime(30_000); }); await flushMicrotasks(); @@ -1201,3 +1205,70 @@ test("Logs: aborting an in-flight refresh before pausing cannot replace the acce } } }); + +test("Logs: reappearing options do not resurrect selections cleared by a successful rollover", async () => { + const original = { ...sampleLog, requestId: "original", model: "model-a", provider: "openai" }; + const replacement = { ...sampleLog, requestId: "replacement", model: "model-b", provider: "xai" }; + let rows = [original]; + serveLogSnapshot(() => rows); + const { root, container } = await mountLogs(); + try { + await flushMicrotasks(); + await changeLogSelect(container, "Model", "model-a"); + await changeLogSelect(container, "Provider", "openai"); + await changeLogSelect(container, "Status", "success"); + rows = [replacement]; + await advanceSilentRefresh(); + const select = (label: string) => container.querySelector(`select[aria-label="${label}"]`)!; + expect(select("Model").value).toBe(""); + expect(select("Provider").value).toBe(""); + expect(visibleRequestIds(container)).toEqual(["replacement"]); + rows = [original, replacement]; + await advanceSilentRefresh(); + expect(select("Model").value).toBe(""); + expect(select("Provider").value).toBe(""); + expect(select("Status").value).toBe("success"); + expect(visibleRequestIds(container)).toEqual(["replacement", "original"]); + } finally { + await act(async () => { root.unmount(); }); + } +}); + +test("Logs: a pending refresh reconciles the user's latest selection rather than its starting selection", async () => { + const late = delayedLogBody(); + const original = [ + { ...sampleLog, requestId: "a", model: "model-a", provider: "openai", status: 500 }, + { ...sampleLog, requestId: "b", model: "model-b", provider: "xai", status: 500 }, + ]; + let requests = 0; + globalThis.fetch = (async input => { + if (!String(input).includes("/api/logs")) return jsonResponse({ timeZone: "UTC" }); + requests++; + return requests === 1 ? jsonResponse(original) : late.response; + }) as typeof fetch; + const { root, container } = await mountLogs(); + try { + await flushMicrotasks(); + await changeLogSelect(container, "Model", "model-a"); + await changeLogSelect(container, "Provider", "openai"); + await advanceSilentRefresh(); + expect(requests).toBe(2); + await changeLogSelect(container, "Model", "model-b"); + await changeLogSelect(container, "Provider", "xai"); + await changeLogSelect(container, "Status", "errors"); + expect(visibleRequestIds(container)).toEqual(["b"]); + await act(async () => { + late.resolve([ + { ...original[0]!, requestId: "other", model: "model-other" }, + { ...original[1]!, requestId: "current", model: "MODEL-B", provider: "XAI" }, + ]); + }); + await flushMicrotasks(); + expect(container.querySelector('select[aria-label="Model"]')!.value).toBe("MODEL-B"); + expect(container.querySelector('select[aria-label="Provider"]')!.value).toBe("XAI"); + expect(container.querySelector('select[aria-label="Status"]')!.value).toBe("errors"); + expect(visibleRequestIds(container)).toEqual(["current"]); + } finally { + await act(async () => { root.unmount(); }); + } +}); diff --git a/gui/tests/logs-filter-bar.test.ts b/gui/tests/logs-filter-bar.test.ts index 259c5defd4..06ae773e8e 100644 --- a/gui/tests/logs-filter-bar.test.ts +++ b/gui/tests/logs-filter-bar.test.ts @@ -1,6 +1,6 @@ import { expect, jest, test } from "bun:test"; import { Window } from "happy-dom"; -import { act, createElement, useState } from "react"; +import { act, createElement, useEffect, useState } from "react"; import type { Root } from "react-dom/client"; import { LanguageProvider } from "../src/i18n/provider"; import type { TFn } from "../src/i18n/shared"; @@ -57,7 +57,7 @@ async function withFilterBar( document.body.append(container); function Harness() { const [filters, setFilters] = useState(initial); - current = filters; + useEffect(() => { current = filters; }, [filters]); return createElement(LogsFilterBar, { filters, options: { models: ["model-a", "model-a-plus"], providers: ["openai", "xai"] }, hasActiveFilters: hasActiveLogFilters(filters), filteredCount: 1, totalCount: 2,