feat: 省略旧消息的代码 diff 展示,仅保留最新消息的完整 diff

This commit is contained in:
claude-code-best
2026-04-27 10:37:49 +08:00
parent bcbb8a6e93
commit c6338917e5
5 changed files with 27 additions and 1 deletions

View File

@@ -77,6 +77,8 @@ export type Props = {
lastThinkingBlockId?: string | null lastThinkingBlockId?: string | null
/** UUID of the latest user bash output message (for auto-expanding) */ /** UUID of the latest user bash output message (for auto-expanding) */
latestBashOutputUUID?: string | null latestBashOutputUUID?: string | null
/** Whether to collapse diff display for this message */
shouldCollapseDiffs?: boolean
} }
function MessageImpl({ function MessageImpl({
@@ -99,6 +101,7 @@ function MessageImpl({
isUserContinuation = false, isUserContinuation = false,
lastThinkingBlockId, lastThinkingBlockId,
latestBashOutputUUID, latestBashOutputUUID,
shouldCollapseDiffs,
}: Props): React.ReactNode { }: Props): React.ReactNode {
switch (message.type) { switch (message.type) {
case 'attachment': case 'attachment':
@@ -181,6 +184,7 @@ function MessageImpl({
isUserContinuation={isUserContinuation} isUserContinuation={isUserContinuation}
lookups={lookups} lookups={lookups}
isTranscriptMode={isTranscriptMode} isTranscriptMode={isTranscriptMode}
shouldCollapseDiffs={shouldCollapseDiffs}
/> />
))} ))}
</Box> </Box>
@@ -293,6 +297,7 @@ function UserMessage({
isUserContinuation, isUserContinuation,
lookups, lookups,
isTranscriptMode, isTranscriptMode,
shouldCollapseDiffs,
}: { }: {
message: NormalizedUserMessage message: NormalizedUserMessage
addMargin: boolean addMargin: boolean
@@ -309,6 +314,7 @@ function UserMessage({
isUserContinuation: boolean isUserContinuation: boolean
lookups: ReturnType<typeof buildMessageLookups> lookups: ReturnType<typeof buildMessageLookups>
isTranscriptMode: boolean isTranscriptMode: boolean
shouldCollapseDiffs?: boolean
}): React.ReactNode { }): React.ReactNode {
const { columns } = useTerminalSize() const { columns } = useTerminalSize()
switch (param.type) { switch (param.type) {
@@ -344,6 +350,7 @@ function UserMessage({
verbose={verbose} verbose={verbose}
width={columns - 5} width={columns - 5}
isTranscriptMode={isTranscriptMode} isTranscriptMode={isTranscriptMode}
shouldCollapseDiffs={shouldCollapseDiffs}
/> />
) )
default: default:

View File

@@ -55,6 +55,7 @@ export type Props = {
columns: number columns: number
isLoading: boolean isLoading: boolean
lookups: ReturnType<typeof buildMessageLookups> lookups: ReturnType<typeof buildMessageLookups>
shouldCollapseDiffs?: boolean
} }
/** /**
@@ -141,6 +142,7 @@ function MessageRowImpl({
columns, columns,
isLoading, isLoading,
lookups, lookups,
shouldCollapseDiffs,
}: Props): React.ReactNode { }: Props): React.ReactNode {
const isTranscriptMode = screen === 'transcript' const isTranscriptMode = screen === 'transcript'
const isGrouped = msg.type === 'grouped_tool_use' const isGrouped = msg.type === 'grouped_tool_use'
@@ -221,6 +223,7 @@ function MessageRowImpl({
isUserContinuation={isUserContinuation} isUserContinuation={isUserContinuation}
lastThinkingBlockId={lastThinkingBlockId} lastThinkingBlockId={lastThinkingBlockId}
latestBashOutputUUID={latestBashOutputUUID} latestBashOutputUUID={latestBashOutputUUID}
shouldCollapseDiffs={shouldCollapseDiffs}
/> />
) )
// OffscreenFreeze: the outer React.memo already bails for static messages, // OffscreenFreeze: the outer React.memo already bails for static messages,

View File

@@ -814,6 +814,12 @@ const MessagesImpl = ({
streamingToolUseIDs, streamingToolUseIDs,
)) ))
// Collapse diffs for messages beyond the latest N messages.
// verbose (ctrl+o) overrides and always shows full diffs.
const DIFF_COLLAPSE_DISTANCE = 0
const shouldCollapseDiffs =
renderableMessages.length - 1 - index > DIFF_COLLAPSE_DISTANCE
const k = messageKey(msg) const k = messageKey(msg)
const row = ( const row = (
<MessageRow <MessageRow
@@ -838,6 +844,7 @@ const MessagesImpl = ({
columns={columns} columns={columns}
isLoading={isLoading} isLoading={isLoading}
lookups={lookups} lookups={lookups}
shouldCollapseDiffs={shouldCollapseDiffs}
/> />
) )

View File

@@ -27,6 +27,7 @@ type Props = {
verbose: boolean verbose: boolean
width: number | string width: number | string
isTranscriptMode?: boolean isTranscriptMode?: boolean
shouldCollapseDiffs?: boolean
} }
export function UserToolResultMessage({ export function UserToolResultMessage({
@@ -39,6 +40,7 @@ export function UserToolResultMessage({
verbose, verbose,
width, width,
isTranscriptMode, isTranscriptMode,
shouldCollapseDiffs,
}: Props): React.ReactNode { }: Props): React.ReactNode {
const toolUse = useGetToolFromMessages(param.tool_use_id, tools, lookups) const toolUse = useGetToolFromMessages(param.tool_use_id, tools, lookups)
if (!toolUse) { if (!toolUse) {
@@ -96,6 +98,7 @@ export function UserToolResultMessage({
verbose={verbose} verbose={verbose}
width={width} width={width}
isTranscriptMode={isTranscriptMode} isTranscriptMode={isTranscriptMode}
shouldCollapseDiffs={shouldCollapseDiffs}
/> />
) )
} }

View File

@@ -33,6 +33,7 @@ type Props = {
verbose: boolean verbose: boolean
width: number | string width: number | string
isTranscriptMode?: boolean isTranscriptMode?: boolean
shouldCollapseDiffs?: boolean
} }
export function UserToolSuccessMessage({ export function UserToolSuccessMessage({
@@ -46,6 +47,7 @@ export function UserToolSuccessMessage({
verbose, verbose,
width, width,
isTranscriptMode, isTranscriptMode,
shouldCollapseDiffs,
}: Props): React.ReactNode { }: Props): React.ReactNode {
const [theme] = useTheme() const [theme] = useTheme()
// Hook stays inside feature() ternary so external builds don't pay a // Hook stays inside feature() ternary so external builds don't pay a
@@ -83,12 +85,16 @@ export function UserToolSuccessMessage({
} }
const toolResult = parsedOutput?.data ?? message.toolUseResult const toolResult = parsedOutput?.data ?? message.toolUseResult
// Collapse diff display for old messages (verbose/ctrl+o overrides)
const effectiveStyle =
shouldCollapseDiffs && !verbose ? 'condensed' : style
const renderedMessage = const renderedMessage =
tool.renderToolResultMessage?.( tool.renderToolResultMessage?.(
toolResult as never, toolResult as never,
filterToolProgressMessages(progressMessagesForMessage), filterToolProgressMessages(progressMessagesForMessage),
{ {
style, style: effectiveStyle,
theme, theme,
tools, tools,
verbose, verbose,