Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 30 additions & 2 deletions lua/opencode/ui/renderer/flush.lua
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,30 @@ local buffer = require('opencode.ui.renderer.buffer')
local append = require('opencode.ui.renderer.append')

local M = {}
local warned_part_render_error = false

---@param part_id string
---@param message_id string|nil
---@param err any
local function warn_part_render_error_once(part_id, message_id, err)
if warned_part_render_error then
return
end
warned_part_render_error = true

local err_text = tostring(err):gsub('[\r\n]+', ' ')
local msg = string.format(
'Skipped malformed part during render (part=%s message=%s). First error: %s',
tostring(part_id),
tostring(message_id),
err_text
)

vim.schedule(function()
local notify = vim.notify_once or vim.notify
notify('[opencode.nvim] ' .. msg, vim.log.levels.WARN)
end)
end

---@generic T
---@param fn fun(): T
Expand Down Expand Up @@ -294,11 +318,15 @@ local function format_part(part_id)
end

local is_last_part = (buffer.get_last_part_for_message(message) == part_id)
local formatted = formatter.format_part(rendered_part.part, message, is_last_part, function(session_id)
local ok, formatted_or_err = pcall(formatter.format_part, rendered_part.part, message, is_last_part, function(session_id)
return ctx.render_state:get_child_session_parts(session_id)
end)
if not ok then
warn_part_render_error_once(part_id, rendered_part.message_id, formatted_or_err)
return nil, rendered_part.message_id
end

return formatted, rendered_part.message_id
return formatted_or_err, rendered_part.message_id
end

---@param message_id string
Expand Down
Loading
Loading