diff --git a/web/src/components/DiffView.tsx b/web/src/components/DiffView.tsx index a6c57903..04d57835 100644 --- a/web/src/components/DiffView.tsx +++ b/web/src/components/DiffView.tsx @@ -1,12 +1,83 @@ import { diffLines } from 'diff' +import { useMemo } from 'react' +import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog' import { cn } from '@/lib/utils' export function DiffView(props: { oldString: string newString: string filePath?: string + variant?: 'preview' | 'inline' }) { - const diff = diffLines(props.oldString, props.newString) + const variant = props.variant ?? 'preview' + + const stats = useMemo(() => { + const oldChars = props.oldString.length + const newChars = props.newString.length + const oldLabel = `${oldChars.toLocaleString()} chars` + const newLabel = `${newChars.toLocaleString()} chars` + return { oldChars, newChars, label: `old: ${oldLabel} → new: ${newLabel}` } + }, [props.oldString.length, props.newString.length]) + + const title = props.filePath ? props.filePath : 'Diff' + const subtitle = props.filePath ? stats.label : `Diff • ${stats.label}` + + const DiffInline = ( + + ) + + if (variant === 'inline') { + return DiffInline + } + + return ( + + + + + + + {title} + + {stats.label} + + +
+ {DiffInline} +
+
+
+ ) +} + +function DiffInlineView(props: { + oldString: string + newString: string + filePath?: string +}) { + const diff = useMemo(() => diffLines(props.oldString, props.newString), [props.oldString, props.newString]) return (
diff --git a/web/src/components/ToolCard/knownTools.tsx b/web/src/components/ToolCard/knownTools.tsx index ff085075..1c0f59ad 100644 --- a/web/src/components/ToolCard/knownTools.tsx +++ b/web/src/components/ToolCard/knownTools.tsx @@ -35,22 +35,6 @@ function countLines(text: string): number { return text.split('\n').length } -function isDocumentFilePath(filePath: string): boolean { - const lower = filePath.toLowerCase() - return ( - lower.endsWith('.md') - || lower.endsWith('.mdx') - || lower.endsWith('.markdown') - || lower.endsWith('.txt') - ) -} - -function shouldCollapseDocumentWrite(filePath: string | null): boolean { - if (!filePath) return false - if (!isDocumentFilePath(filePath)) return false - return true -} - function snakeToTitleWithSpaces(value: string): string { return value .split('_') @@ -167,10 +151,7 @@ export const knownTools: Record { - const file = getInputStringAny(opts.input, ['file_path', 'path']) - return isDocumentFilePath(file ?? '') - } + minimal: true }, MultiEdit: { icon: () => , @@ -182,10 +163,7 @@ export const knownTools: Record 1 ? `${path} (${count} edits)` : path }, - minimal: (opts) => { - const file = getInputStringAny(opts.input, ['file_path', 'path']) - return isDocumentFilePath(file ?? '') - } + minimal: true }, Write: { icon: () => , @@ -199,10 +177,7 @@ export const knownTools: Record 1 ? `${lines} lines` : `${content.length} chars` }, - minimal: (opts) => { - const file = getInputStringAny(opts.input, ['file_path', 'path']) - return shouldCollapseDocumentWrite(file) - } + minimal: true }, WebFetch: { icon: () => , diff --git a/web/src/components/ToolCard/views/CodexDiffView.tsx b/web/src/components/ToolCard/views/CodexDiffView.tsx index 659e85e6..017782bc 100644 --- a/web/src/components/ToolCard/views/CodexDiffView.tsx +++ b/web/src/components/ToolCard/views/CodexDiffView.tsx @@ -67,6 +67,7 @@ function renderDiff(block: ToolViewProps['block'], showFileHeader: boolean) { oldString={parsed.oldText} newString={parsed.newText} filePath={showFileHeader ? parsed.fileName : undefined} + variant={showFileHeader ? 'inline' : undefined} /> ) } @@ -78,4 +79,3 @@ export function CodexDiffCompactView(props: ToolViewProps) { export function CodexDiffFullView(props: ToolViewProps) { return renderDiff(props.block, true) } - diff --git a/web/src/components/ToolCard/views/EditView.tsx b/web/src/components/ToolCard/views/EditView.tsx index f63a4879..da84a497 100644 --- a/web/src/components/ToolCard/views/EditView.tsx +++ b/web/src/components/ToolCard/views/EditView.tsx @@ -17,7 +17,7 @@ export function EditView(props: ToolViewProps) { ) } - diff --git a/web/src/components/ToolCard/views/MultiEditView.tsx b/web/src/components/ToolCard/views/MultiEditView.tsx index 4de9f1c0..4464bae5 100644 --- a/web/src/components/ToolCard/views/MultiEditView.tsx +++ b/web/src/components/ToolCard/views/MultiEditView.tsx @@ -53,6 +53,7 @@ export function MultiEditFullView(props: ToolViewProps) { key={idx} oldString={edit.old_string} newString={edit.new_string} + variant="inline" /> ))}
diff --git a/web/src/components/ToolCard/views/WriteView.tsx b/web/src/components/ToolCard/views/WriteView.tsx index 23351c08..f7cd6e54 100644 --- a/web/src/components/ToolCard/views/WriteView.tsx +++ b/web/src/components/ToolCard/views/WriteView.tsx @@ -16,7 +16,7 @@ export function WriteView(props: ToolViewProps) { ) } -