fix(ui): render native read tool output

Use the V2 read tool state's output field for display and copy text instead of the stale metadata preview. Add a focused renderer test that distinguishes the authoritative output from metadata.
This commit is contained in:
Pascal André 2026-08-28 03:59:37 +02:00
parent dd2aef6a32
commit 3f79e1a595
No known key found for this signature in database
2 changed files with 24 additions and 4 deletions

View file

@ -0,0 +1,20 @@
import assert from "node:assert/strict"
import { it } from "node:test"
import type { ToolRendererContext } from "../types"
import { readRenderer } from "./read"
it("renders read output from the V2 tool state", () => {
const context = {
toolState: () => ({
status: "completed",
input: { path: "src/example.ts" },
metadata: { preview: "stale preview" },
output: "const value = 1",
}),
renderMarkdown: ({ content }: { content: string }) => content,
} as unknown as ToolRendererContext
assert.equal(readRenderer.getOutputChrome?.(context)?.copyText, "const value = 1")
assert.match(String(readRenderer.renderBody(context)), /const value = 1/)
})

View file

@ -44,8 +44,8 @@ export const readRenderer: ToolRenderer = {
getOutputChrome({ toolState }) {
const state = toolState()
if (!state || state.status === "pending") return undefined
const { metadata, input } = readToolStatePayload(state)
const preview = typeof metadata.preview === "string" ? metadata.preview : null
const { output, input } = readToolStatePayload(state)
const preview = typeof output === "string" ? output : null
if (!preview) return undefined
const language = inferLanguageFromPath(getReadPath(input)) ?? "text"
return { language, copyText: preview, wrapToggle: true, suppressInnerHeader: true }
@ -53,8 +53,8 @@ export const readRenderer: ToolRenderer = {
renderBody({ toolState, renderMarkdown }) {
const state = toolState()
if (!state || state.status === "pending") return null
const { metadata, input } = readToolStatePayload(state)
const preview = typeof metadata.preview === "string" ? metadata.preview : null
const { output, input } = readToolStatePayload(state)
const preview = typeof output === "string" ? output : null
const language = inferLanguageFromPath(getReadPath(input))
const content = ensureMarkdownContent(preview, language, true)
if (!content) return null