Skip to content

Commit 74a74bc

Browse files
jensenojsCopilot
andauthored
fix(renderer): guard malformed part render in flush (#347)
* fix(renderer): guard malformed part render in flush * Update lua/opencode/ui/renderer/flush.lua Co-authored-by: Copilot <[email protected]> * Update tests/data/todowrite-malformed-session.json Co-authored-by: Copilot <[email protected]> * Update tests/data/todowrite-malformed-session.json Co-authored-by: Copilot <[email protected]> --------- Co-authored-by: Copilot <[email protected]>
1 parent b656af3 commit 74a74bc

3 files changed

Lines changed: 630 additions & 2 deletions

File tree

lua/opencode/ui/renderer/flush.lua

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,30 @@ local buffer = require('opencode.ui.renderer.buffer')
88
local append = require('opencode.ui.renderer.append')
99

1010
local M = {}
11+
local warned_part_render_error = false
12+
13+
---@param part_id string
14+
---@param message_id string|nil
15+
---@param err any
16+
local function warn_part_render_error_once(part_id, message_id, err)
17+
if warned_part_render_error then
18+
return
19+
end
20+
warned_part_render_error = true
21+
22+
local err_text = tostring(err):gsub('[\r\n]+', ' ')
23+
local msg = string.format(
24+
'Skipped malformed part during render (part=%s message=%s). First error: %s',
25+
tostring(part_id),
26+
tostring(message_id),
27+
err_text
28+
)
29+
30+
vim.schedule(function()
31+
local notify = vim.notify_once or vim.notify
32+
notify('[opencode.nvim] ' .. msg, vim.log.levels.WARN)
33+
end)
34+
end
1135

1236
---@generic T
1337
---@param fn fun(): T
@@ -294,11 +318,15 @@ local function format_part(part_id)
294318
end
295319

296320
local is_last_part = (buffer.get_last_part_for_message(message) == part_id)
297-
local formatted = formatter.format_part(rendered_part.part, message, is_last_part, function(session_id)
321+
local ok, formatted_or_err = pcall(formatter.format_part, rendered_part.part, message, is_last_part, function(session_id)
298322
return ctx.render_state:get_child_session_parts(session_id)
299323
end)
324+
if not ok then
325+
warn_part_render_error_once(part_id, rendered_part.message_id, formatted_or_err)
326+
return nil, rendered_part.message_id
327+
end
300328

301-
return formatted, rendered_part.message_id
329+
return formatted_or_err, rendered_part.message_id
302330
end
303331

304332
---@param message_id string

0 commit comments

Comments
 (0)