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 (
+
+ )
+}
+
+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) {
)
}
-