feat: add parent-only disclaimer and report link to session cost

The Visible Context panel's Session Cost only reflects the parent
session. Add "(parent only · view full cost)" label that links to
the Session Report where parent + subagent costs are shown.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Paul Holstein 2026-02-23 12:25:45 -05:00
parent 33b63b46a5
commit db9a676680
4 changed files with 25 additions and 0 deletions

View file

@ -64,6 +64,7 @@ export const ChatHistory = ({ tabId }: ChatHistoryProps): JSX.Element => {
syncSearchMatchesWithRendered, syncSearchMatchesWithRendered,
selectSearchMatch, selectSearchMatch,
setTabVisibleAIGroup, setTabVisibleAIGroup,
openSessionReport,
} = useStore( } = useStore(
useShallow((s) => ({ useShallow((s) => ({
searchQuery: s.searchQuery, searchQuery: s.searchQuery,
@ -76,6 +77,7 @@ export const ChatHistory = ({ tabId }: ChatHistoryProps): JSX.Element => {
syncSearchMatchesWithRendered: s.syncSearchMatchesWithRendered, syncSearchMatchesWithRendered: s.syncSearchMatchesWithRendered,
selectSearchMatch: s.selectSearchMatch, selectSearchMatch: s.selectSearchMatch,
setTabVisibleAIGroup: s.setTabVisibleAIGroup, setTabVisibleAIGroup: s.setTabVisibleAIGroup,
openSessionReport: s.openSessionReport,
})) }))
); );
@ -872,6 +874,7 @@ export const ChatHistory = ({ tabId }: ChatHistoryProps): JSX.Element => {
onNavigateToUserGroup={handleNavigateToUserGroup} onNavigateToUserGroup={handleNavigateToUserGroup}
totalSessionTokens={lastAiGroupTotalTokens} totalSessionTokens={lastAiGroupTotalTokens}
sessionMetrics={sessionDetail?.metrics} sessionMetrics={sessionDetail?.metrics}
onViewReport={effectiveTabId ? () => openSessionReport(effectiveTabId) : undefined}
phaseInfo={sessionPhaseInfo ?? undefined} phaseInfo={sessionPhaseInfo ?? undefined}
selectedPhase={selectedContextPhase} selectedPhase={selectedContextPhase}
onPhaseChange={setSelectedContextPhase} onPhaseChange={setSelectedContextPhase}

View file

@ -29,6 +29,7 @@ interface SessionContextHeaderProps {
totalSessionTokens?: number; totalSessionTokens?: number;
sessionMetrics?: SessionMetrics; sessionMetrics?: SessionMetrics;
onClose?: () => void; onClose?: () => void;
onViewReport?: () => void;
phaseInfo?: ContextPhaseInfo; phaseInfo?: ContextPhaseInfo;
selectedPhase: number | null; selectedPhase: number | null;
onPhaseChange: (phase: number | null) => void; onPhaseChange: (phase: number | null) => void;
@ -42,6 +43,7 @@ export const SessionContextHeader = ({
totalSessionTokens, totalSessionTokens,
sessionMetrics, sessionMetrics,
onClose, onClose,
onViewReport,
phaseInfo, phaseInfo,
selectedPhase, selectedPhase,
onPhaseChange, onPhaseChange,
@ -132,6 +134,22 @@ export const SessionContextHeader = ({
<span className="font-medium tabular-nums" style={{ color: COLOR_TEXT_SECONDARY }}> <span className="font-medium tabular-nums" style={{ color: COLOR_TEXT_SECONDARY }}>
{formatCostUsd(sessionMetrics.costUsd)} {formatCostUsd(sessionMetrics.costUsd)}
</span> </span>
<span style={{ color: COLOR_TEXT_MUTED }}> (parent only</span>
{onViewReport ? (
<span>
<span style={{ color: COLOR_TEXT_MUTED }}> · </span>
<button
onClick={onViewReport}
className="underline"
style={{ color: COLOR_TEXT_SECONDARY }}
>
view full cost
</button>
<span style={{ color: COLOR_TEXT_MUTED }}>)</span>
</span>
) : (
<span style={{ color: COLOR_TEXT_MUTED }}>)</span>
)}
</div> </div>
)} )}
</div> </div>

View file

@ -49,6 +49,7 @@ export const SessionContextPanel = ({
onNavigateToUserGroup, onNavigateToUserGroup,
totalSessionTokens, totalSessionTokens,
sessionMetrics, sessionMetrics,
onViewReport,
phaseInfo, phaseInfo,
selectedPhase, selectedPhase,
onPhaseChange, onPhaseChange,
@ -193,6 +194,7 @@ export const SessionContextPanel = ({
totalSessionTokens={totalSessionTokens} totalSessionTokens={totalSessionTokens}
sessionMetrics={sessionMetrics} sessionMetrics={sessionMetrics}
onClose={onClose} onClose={onClose}
onViewReport={onViewReport}
phaseInfo={phaseInfo} phaseInfo={phaseInfo}
selectedPhase={selectedPhase} selectedPhase={selectedPhase}
onPhaseChange={onPhaseChange} onPhaseChange={onPhaseChange}

View file

@ -27,6 +27,8 @@ export interface SessionContextPanelProps {
totalSessionTokens?: number; totalSessionTokens?: number;
/** Full session metrics (input, output, cache tokens, cost) */ /** Full session metrics (input, output, cache tokens, cost) */
sessionMetrics?: SessionMetrics; sessionMetrics?: SessionMetrics;
/** Open the Session Report to see full cost breakdown */
onViewReport?: () => void;
/** Phase information for phase selector */ /** Phase information for phase selector */
phaseInfo?: ContextPhaseInfo; phaseInfo?: ContextPhaseInfo;
/** Currently selected phase (null = current/latest) */ /** Currently selected phase (null = current/latest) */