From 6c26d067fdf18658e179e3613ae4b981c8af3952 Mon Sep 17 00:00:00 2001 From: xintaofei Date: Thu, 12 Mar 2026 21:23:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=87=8D=E6=9E=84=E5=90=8E?= =?UTF-8?q?=E6=96=B0=E4=BC=9A=E8=AF=9D=E6=9C=AA=E6=98=BE=E7=A4=BA=E5=BA=95?= =?UTF-8?q?=E9=83=A8token=E7=94=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../conversations/conversation-detail-panel.tsx | 10 +++++++--- src/contexts/conversation-runtime-context.tsx | 6 ++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/components/conversations/conversation-detail-panel.tsx b/src/components/conversations/conversation-detail-panel.tsx index fe6cb4a..61eabcc 100644 --- a/src/components/conversations/conversation-detail-panel.tsx +++ b/src/components/conversations/conversation-detail-panel.tsx @@ -141,6 +141,7 @@ const ConversationTabView = memo(function ConversationTabView({ const { appendOptimisticTurn, completeTurn, + getSession, refetchDetail, syncTurnMetadata, removeConversation, @@ -208,10 +209,13 @@ const ConversationTabView = memo(function ConversationTabView({ error: detailError, } = useConversationDetail(effectiveConversationId) + const runtimeSession = getSession(effectiveConversationId) + const effectiveSessionStats = runtimeSession?.sessionStats ?? null + useEffect(() => { if (!isActive) return - setSessionStats(detail?.session_stats ?? null) - }, [detail?.session_stats, isActive, setSessionStats]) + setSessionStats(effectiveSessionStats) + }, [effectiveSessionStats, isActive, setSessionStats]) const externalId = detail?.summary.external_id ?? undefined const draftStorageKey = useMemo(() => { @@ -621,7 +625,7 @@ const ConversationTabView = memo(function ConversationTabView({ connStatus={connStatus} isActive={isActive} sendSignal={sendSignal} - sessionStats={detail?.session_stats ?? null} + sessionStats={effectiveSessionStats} detailLoading={detailLoading} detailError={detailError} hideEmptyState={!hasPersistedConversation || hasSentMessage} diff --git a/src/contexts/conversation-runtime-context.tsx b/src/contexts/conversation-runtime-context.tsx index 6cbe425..7d90ecc 100644 --- a/src/contexts/conversation-runtime-context.tsx +++ b/src/contexts/conversation-runtime-context.tsx @@ -49,6 +49,9 @@ export interface ConversationRuntimeSession { syncState: ConversationSyncState activeTurnToken: string | null + // Session-level stats (token usage, context window, etc.) + sessionStats: SessionStats | null + // Cleanup pendingCleanup: boolean } @@ -141,6 +144,7 @@ function createEmptySession( liveMessage: null, syncState: "idle", activeTurnToken: null, + sessionStats: null, pendingCleanup: false, } } @@ -279,6 +283,7 @@ function reducer( detailError: null, externalId: nextExternalId ?? current.externalId, localTurns: [], + sessionStats: action.detail.session_stats ?? current.sessionStats, ...(isActivelyInteracting ? {} : { optimisticTurns: [], liveMessage: null }), @@ -483,6 +488,7 @@ function reducer( ...current, localTurns: changed ? patchedTurns : current.localTurns, detail: patchedDetail, + sessionStats: action.sessionStats ?? current.sessionStats, })) }