@@ -139,17 +139,31 @@ func (w *WriteToolRenderContext) RenderTool(sty *styles.Styles, width int, opts
139139 return header
140140 }
141141
142− if earlyState, ok := toolEarlyStateContent(sty, opts, cappedWidth); ok {
143− return joinToolParts(header, earlyState)
142+ if !opts.HasResult() {
143+ if earlyState, ok := toolEarlyStateContent(sty, opts, cappedWidth); ok {
144+ return joinToolParts(header, earlyState)
145+ }
146+ return header
144147 }
145148
146− if params.Content == "" {
147− return header
149+ // On error with diff metadata (e.g. denied permission), show error + diff.
150+ if opts.Result.IsError {
151+ var meta tools.WriteResponseMetadata
152+ if err := json.Unmarshal([]byte(opts.Result.Metadata), &meta); err == nil && meta.Diff != "" {
153+ errLine := toolErrorContent(sty, opts.Result, cappedWidth)
154+ diff := toolOutputDiffContentFromUnified(sty, meta.Diff, cappedWidth, opts.ExpandedContent)
155+ return strings.Join([]string{header, "", errLine, "", diff}, "\n")
156+ }
157+ return joinToolParts(header, toolErrorContent(sty, opts.Result, cappedWidth))
148158 }
149159
150160 // Render code content with syntax highlighting.
151− body := toolOutputCodeContent(sty, params.FilePath, params.Content, 0, cappedWidth, opts.ExpandedContent)
152− return joinToolParts(header, body)
161+ if params.Content != "" {
162+ body := toolOutputCodeContent(sty, params.FilePath, params.Content, 0, cappedWidth, opts.ExpandedContent)
163+ return joinToolParts(header, body)
164+ }
165+
166+ return header
153167}
154168
155169// -----------------------------------------------------------------------------
@@ -194,11 +208,10 @@ func (e *EditToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *
194208 return header
195209 }
196210
197− if earlyState, ok := toolEarlyStateContent(sty, opts, width); ok {
198− return joinToolParts(header, earlyState)
199− }
200−
201211 if !opts.HasResult() {
212+ if earlyState, ok := toolEarlyStateContent(sty, opts, width); ok {
213+ return joinToolParts(header, earlyState)
214+ }
202215 return header
203216 }
204217
@@ -210,9 +223,15 @@ func (e *EditToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *
210223 return joinToolParts(header, body)
211224 }
212225
213− // Render diff.
214− body := toolOutputDiffContent(sty, file, meta.OldContent, meta.NewContent, width, opts.ExpandedContent)
215− return joinToolParts(header, body)
226+ diff := toolOutputDiffContent(sty, file, meta.OldContent, meta.NewContent, width, opts.ExpandedContent)
227+
228+ // On error (e.g. denied permission), show error above the diff.
229+ if opts.Result.IsError {
230+ errLine := toolErrorContent(sty, opts.Result, width)
231+ return strings.Join([]string{header, "", errLine, "", diff}, "\n")
232+ }
233+
234+ return joinToolParts(header, diff)
216235}
217236
218237// -----------------------------------------------------------------------------
@@ -262,11 +281,10 @@ func (m *MultiEditToolRenderContext) RenderTool(sty *styles.Styles, width int, o
262281 return header
263282 }
264283
265− if earlyState, ok := toolEarlyStateContent(sty, opts, width); ok {
266− return joinToolParts(header, earlyState)
267− }
268−
269284 if !opts.HasResult() {
285+ if earlyState, ok := toolEarlyStateContent(sty, opts, width); ok {
286+ return joinToolParts(header, earlyState)
287+ }
270288 return header
271289 }
272290
@@ -279,8 +297,15 @@ func (m *MultiEditToolRenderContext) RenderTool(sty *styles.Styles, width int, o
279297 }
280298
281299 // Render diff with optional failed edits note.
282− body := toolOutputMultiEditDiffContent(sty, file, meta, len(params.Edits), width, opts.ExpandedContent)
283− return joinToolParts(header, body)
300+ diff := toolOutputMultiEditDiffContent(sty, file, meta, len(params.Edits), width, opts.ExpandedContent)
301+
302+ // On error (e.g. denied permission), show error above the diff.
303+ if opts.Result.IsError {
304+ errLine := toolErrorContent(sty, opts.Result, width)
305+ return strings.Join([]string{header, "", errLine, "", diff}, "\n")
306+ }
307+
308+ return joinToolParts(header, diff)
284309}
285310
286311// -----------------------------------------------------------------------------