import type { StructuredPatchHunk } from 'diff' import * as React from 'react' import { useTerminalSize } from '../hooks/useTerminalSize.js' import { Box, Text } from '@anthropic/ink' import { count } from '../utils/array.js' import { MessageResponse } from './MessageResponse.js' import { StructuredDiffList } from './StructuredDiffList.js' type Props = { filePath: string structuredPatch: StructuredPatchHunk[] firstLine: string | null fileContent?: string style?: 'condensed' verbose: boolean previewHint?: string } export function FileEditToolUpdatedMessage({ filePath, structuredPatch, firstLine, fileContent, style, verbose, previewHint, }: Props): React.ReactNode { const { columns } = useTerminalSize() const numAdditions = structuredPatch.reduce( (acc, hunk) => acc + count(hunk.lines, _ => _.startsWith('+')), 0, ) const numRemovals = structuredPatch.reduce( (acc, hunk) => acc + count(hunk.lines, _ => _.startsWith('-')), 0, ) const text = ( {numAdditions > 0 ? ( <> Added {numAdditions}{' '} {numAdditions > 1 ? 'lines' : 'line'} ) : null} {numAdditions > 0 && numRemovals > 0 ? ', ' : null} {numRemovals > 0 ? ( <> {numAdditions === 0 ? 'R' : 'r'}emoved {numRemovals}{' '} {numRemovals > 1 ? 'lines' : 'line'} ) : null} ) // Plan files: invert condensed behavior // - Regular mode: just show the hint (user can type /plan to see full content) // - Condensed mode (subagent view): show the diff if (previewHint) { if (style !== 'condensed' && !verbose) { return ( {previewHint} ) } } else if (style === 'condensed' && !verbose) { return text } return ( {text} ) }