diff --git a/lua/opencode/context.lua b/lua/opencode/context.lua index 4098abcb..214ab0cb 100644 --- a/lua/opencode/context.lua +++ b/lua/opencode/context.lua @@ -269,14 +269,14 @@ end ---@param selection OpencodeContextSelection local function format_selection_part(selection) - local lang = selection.file and selection.file.extension or '' + local lang = util.get_markdown_filetype(selection.file and selection.file.name or '') or '' return { type = 'text', text = vim.json.encode({ context_type = 'selection', file = selection.file, - content = string.format('```%s\n%s\n```', lang, selection.content), + content = string.format('`````%s\n%s\n`````', lang, selection.content), lines = selection.lines, }), synthetic = true, diff --git a/lua/opencode/ui/formatter.lua b/lua/opencode/ui/formatter.lua index dcc74bf9..efbefead 100644 --- a/lua/opencode/ui/formatter.lua +++ b/lua/opencode/ui/formatter.lua @@ -428,7 +428,7 @@ end ---@param metadata FileToolMetadata Metadata for the tool use function M._format_file_tool(output, tool_type, input, metadata) local file_name = input and vim.fn.fnamemodify(input.filePath, ':t') or '' - local file_type = input and vim.fn.fnamemodify(input.filePath, ':e') or '' + local file_type = input and util.get_markdown_filetype(input.filePath) or '' local tool_action_icons = { read = icons.get('read'), edit = icons.get('edit'), write = icons.get('write') } M._format_action(output, tool_action_icons[tool_type] .. ' ' .. tool_type, file_name) @@ -627,9 +627,10 @@ end ---@param language string function M._format_code(output, lines, language) output:add_empty_line() - output:add_line('```' .. (language or '')) - output:add_lines(util.strip_ansi_lines(lines)) - output:add_line('```') + --- NOTE: use longer code fence because lines could contain ``` + output:add_line('`````' .. (language or '')) + output:add_lines(util.sanitize_lines(lines)) + output:add_line('`````') end ---@param output Output Output object to write to @@ -637,7 +638,9 @@ end ---@param file_type string function M._format_diff(output, code, file_type) output:add_empty_line() - output:add_line('```' .. file_type) + + --- NOTE: use longer code fence because code could contain ``` + output:add_line('`````' .. file_type) local lines = vim.split(code, '\n') if #lines > 5 then lines = vim.list_slice(lines, 6) @@ -668,7 +671,7 @@ function M._format_diff(output, code, file_type) output:add_line(line) end end - output:add_line('```') + output:add_line('`````') end ---@param output Output Output object to write to diff --git a/lua/opencode/ui/render_state.lua b/lua/opencode/ui/render_state.lua index 1fd3fae3..61c550b6 100644 --- a/lua/opencode/ui/render_state.lua +++ b/lua/opencode/ui/render_state.lua @@ -243,16 +243,18 @@ end ---Update part data reference ---@param part_ref OpencodeMessagePart New part reference (must include id) +---@return RenderedPart? part The rendered part function RenderState:update_part_data(part_ref) if not part_ref or not part_ref.id then return end - local part_data = self._parts[part_ref.id] - if not part_data then + local rendered_part = self._parts[part_ref.id] + if not rendered_part then return end - part_data.part = part_ref + rendered_part.part = part_ref + return rendered_part end ---Helper to update action line numbers diff --git a/lua/opencode/ui/renderer.lua b/lua/opencode/ui/renderer.lua index d7852dbd..36da4103 100644 --- a/lua/opencode/ui/renderer.lua +++ b/lua/opencode/ui/renderer.lua @@ -280,6 +280,7 @@ end function M._replace_part_in_buffer(part_id, formatted_data) local cached = M._render_state:get_part(part_id) if not cached or not cached.line_start or not cached.line_end then + -- return M._insert_part_to_buffer(part_id, formatted_data) return false end @@ -536,7 +537,13 @@ function M.on_part_updated(properties, revert_index) if is_new_part then M._render_state:set_part(part) else - M._render_state:update_part_data(part) + local rendered_part = M._render_state:update_part_data(part) + -- NOTE: This isn't the first time we've seen the part but we haven't rendered it previously + -- so try and render it this time by setting is_new_part = true (otherwise we'd call + -- _replace_message_in_buffer and it wouldn't do anything because the part hasn't been rendered) + if not rendered_part or (not rendered_part.line_start and not rendered_part.line_end) then + is_new_part = true + end end local formatted = formatter.format_part(part, message, is_last_part) @@ -555,8 +562,6 @@ function M.on_part_updated(properties, revert_index) --- previous last part so it doesn't also display the message. If there was no previous --- part, then we need to rerender the header so it doesn't display the error - vim.notify('new part and error: ' .. part.id) - if not prev_last_part_id then -- no previous part, we're the first part, re-render the message header -- so it doesn't also display the error diff --git a/lua/opencode/util.lua b/lua/opencode/util.lua index 6d894889..41e018fe 100644 --- a/lua/opencode/util.lua +++ b/lua/opencode/util.lua @@ -143,7 +143,7 @@ end ---Strip ANSI escape sequences from all lines ---@param lines table ---@return table stripped_lines -function M.strip_ansi_lines(lines) +function M.sanitize_lines(lines) local stripped_lines = {} for _, line in pairs(lines) do table.insert(stripped_lines, M.strip_ansi(line)) @@ -360,6 +360,31 @@ function M.parse_dot_args(args_str) return result end +--- Get the markdown type to use based on the filename. First gets the neovim type +--- for the file. Then apply any specific overrides. Falls back to using the file +--- extension if nothing else matches +--- @param filename string filename, possibly including path +--- @return string markdown_filetype +function M.get_markdown_filetype(filename) + local file_type_overrides = { + javascriptreact = 'jsx', + typescriptreact = 'tsx', + sh = 'bash', + yaml = 'yml', + text = 'txt', -- nvim 0.12-nightly returns text as the type which breaks our unit tests + } + + local file_type = vim.filetype.match({ filename = filename }) or '' + + if file_type_overrides[file_type] then + return file_type_overrides[file_type] + end + + if file_type and file_type ~= '' then + return file_type + end + + return vim.fn.fnamemodify(filename, ':e') --- Check if prompt is allowed via guard callback --- @param guard_callback? function --- @param mentioned_files? string[] List of mentioned files in the context diff --git a/tests/data/ansi-codes.expected.json b/tests/data/ansi-codes.expected.json index 910c3a57..a2d93a3e 100644 --- a/tests/data/ansi-codes.expected.json +++ b/tests/data/ansi-codes.expected.json @@ -1 +1 @@ -{"timestamp":1761265215,"actions":[],"extmarks":[[1,2,0,{"priority":10,"right_gravity":true,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-23 21:00:24)","OpencodeHint"],[" [msg_a12df6fcc002lSmBoztX2X6eCp]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-3}],[2,4,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[3,5,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[4,6,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[5,7,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[6,8,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[7,9,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[8,10,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[9,11,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[10,12,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[11,13,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[12,14,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[13,15,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[14,16,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[15,17,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[16,18,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[17,19,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[18,20,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[19,21,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[20,22,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[21,23,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[22,24,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[23,25,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[24,26,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[25,27,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[26,28,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[27,29,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[28,30,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[29,31,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[30,32,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[31,33,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[32,34,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[33,35,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[34,36,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[35,37,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[36,38,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[37,39,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[38,40,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[39,41,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[40,42,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[41,43,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[42,44,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[43,45,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[44,46,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[45,47,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[46,48,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[47,49,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[48,50,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[49,51,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[50,52,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[51,53,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[52,54,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[53,55,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[54,56,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[55,57,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[56,58,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[57,59,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[58,60,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[59,61,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[60,62,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[61,63,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[62,64,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[63,65,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[64,66,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[65,67,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[66,68,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[67,69,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[68,70,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[69,71,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[70,72,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[71,73,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[72,74,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[73,75,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[74,76,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[75,77,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[76,78,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[77,79,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[78,80,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[79,81,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[80,82,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[81,83,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[82,84,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[83,85,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[84,86,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[85,87,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[86,88,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[87,89,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[88,90,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[89,91,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[90,92,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[91,93,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[92,94,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[93,95,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[94,96,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[95,97,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[96,98,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[97,99,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[98,100,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[99,101,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[100,102,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[101,103,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[102,104,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[103,105,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[104,106,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[105,107,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[106,108,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[107,109,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[108,110,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[109,111,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[110,112,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[111,113,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[112,114,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[113,115,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[114,116,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[115,117,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[116,118,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[117,119,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[118,120,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[119,121,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[120,122,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[121,123,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[122,124,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[123,125,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[124,126,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[125,127,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[126,128,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[127,129,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[128,130,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[129,131,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[130,132,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[131,133,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[132,134,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[133,135,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[134,136,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[135,137,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[136,138,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[137,139,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[138,140,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[139,141,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[140,142,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[141,143,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[142,144,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[143,145,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[144,146,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[145,147,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[146,148,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[147,149,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[148,150,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[149,151,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[150,152,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[151,153,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[152,154,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[153,155,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[154,156,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[155,157,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[156,158,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[157,159,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[158,160,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[159,161,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[160,162,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[161,163,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[162,164,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[163,165,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[164,166,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[165,167,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[166,168,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[167,169,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[168,170,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[169,171,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[170,172,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[171,173,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[172,174,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[173,175,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[174,176,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[175,177,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[176,178,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[177,179,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[178,180,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[179,181,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[180,182,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[181,183,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[182,184,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[183,185,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[184,186,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[185,187,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[186,188,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[187,189,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[188,190,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[189,191,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[190,192,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[191,193,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[192,194,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[193,195,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[194,196,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[195,197,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[196,198,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[197,199,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[198,200,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[199,201,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[200,202,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[201,203,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[202,204,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[203,205,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[204,206,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[205,207,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[206,208,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[207,209,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[208,210,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[209,211,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[210,212,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[211,213,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[212,214,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[213,215,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[214,216,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[215,217,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[216,218,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[217,219,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[218,220,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[219,221,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[220,222,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[221,223,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[222,224,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[223,225,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[224,226,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[225,227,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[226,228,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[227,229,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[228,230,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[229,231,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[230,232,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[231,233,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[232,234,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[233,235,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[234,236,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[235,237,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[236,238,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[237,239,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[238,240,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[239,241,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[240,242,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[241,243,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[242,244,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[243,245,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[244,246,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[245,247,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[246,248,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[247,249,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[248,250,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[249,251,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[250,252,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[251,253,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[252,254,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[253,255,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[254,256,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[255,257,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[256,258,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[257,259,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[258,260,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[259,261,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[260,262,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[261,263,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[262,264,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[263,265,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[264,266,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[265,267,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[266,268,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[267,269,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[268,270,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[269,271,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[270,272,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[271,273,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[272,274,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[273,275,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[274,276,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[275,277,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[276,278,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[277,279,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[278,280,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[279,281,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[280,282,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[281,283,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[282,284,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[283,285,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[284,286,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[285,287,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[286,288,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[287,289,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[288,290,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[289,291,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[290,292,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[291,293,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[292,294,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[293,295,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[294,296,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[295,297,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[296,298,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[297,299,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[298,300,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[299,301,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[300,302,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[301,303,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[302,304,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[303,305,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[304,306,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[305,307,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[306,308,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[307,309,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[308,310,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[309,311,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[310,312,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[311,313,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[312,314,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[313,315,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[314,316,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[315,317,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[316,318,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[317,319,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[318,320,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[319,321,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[320,322,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[321,323,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[322,324,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[323,325,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[324,326,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[325,327,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[326,328,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[327,329,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[328,330,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[329,331,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[330,332,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[331,333,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[332,334,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[333,335,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[334,336,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[335,337,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[336,338,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[337,339,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[338,340,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[339,341,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[340,342,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[341,343,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[342,344,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[343,345,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[344,346,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[345,347,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[346,348,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[347,349,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[348,350,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[349,351,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[350,352,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[351,353,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[352,354,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[353,355,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[354,356,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[355,357,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[356,358,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[357,359,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[358,360,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[359,361,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[360,362,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[361,363,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[362,364,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[363,365,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[364,366,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[365,367,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[366,368,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[367,369,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[368,370,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[369,371,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[370,372,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[371,373,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[372,374,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[373,375,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[374,376,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[375,377,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[376,378,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[377,379,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[378,380,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[379,381,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[380,382,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[381,383,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[382,384,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[383,385,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[384,386,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[385,387,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[386,388,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[387,389,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[388,390,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[389,391,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[390,392,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[391,393,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[392,394,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[393,395,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[394,396,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[395,397,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[396,398,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[397,399,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[398,400,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[399,401,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[400,402,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[401,403,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[402,404,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[403,405,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[404,406,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[405,407,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}],[406,408,0,{"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-1}]],"unrendered_messages":[],"lines":["","----","","","** run** `Run all tests to verify refactoring`","","```bash","> cd /Users/cam/Dev/neovim-dev/opencode.nvim && ./run_tests.sh","","Running tests for opencode.nvim","------------------------------------------------","Starting...Scheduling: ./tests/minimal/plugin_spec.lua","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/minimal/plugin_spec.lua\t","Success\t||\topencode.nvim plugin loads the plugin without errors\t","Success\t||\topencode.nvim plugin can be set up with custom config\t","\t","Success: \t2\t","Failed : \t0\t","========================================\t","✓ Minimal tests passed","------------------------------------------------","Starting...Scheduling: ./tests/unit/timer_spec.lua","Scheduling: ./tests/unit/server_job_spec.lua","Scheduling: ./tests/unit/config_spec.lua","Scheduling: ./tests/unit/api_spec.lua","Scheduling: ./tests/unit/event_manager_spec.lua","Scheduling: ./tests/unit/init_spec.lua","Scheduling: ./tests/unit/state_spec.lua","Scheduling: ./tests/unit/id_spec.lua","Scheduling: ./tests/unit/api_client_spec.lua","Scheduling: ./tests/unit/context_spec.lua","Scheduling: ./tests/unit/session_spec.lua","Scheduling: ./tests/unit/config_file_spec.lua","Scheduling: ./tests/unit/renderer_spec.lua","Scheduling: ./tests/unit/opencode_server_spec.lua","Scheduling: ./tests/unit/core_spec.lua","Scheduling: ./tests/unit/render_state_spec.lua","Scheduling: ./tests/unit/snapshot_spec.lua","Scheduling: ./tests/unit/keymap_spec.lua","Scheduling: ./tests/unit/util_spec.lua","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/server_job_spec.lua\t","Success\t||\tserver_job exposes expected public functions\t","Success\t||\tserver_job call_api resolves with decoded json and toggles is_job_running\t","Success\t||\tserver_job call_api rejects on non 2xx\t","Success\t||\tserver_job stream_api forwards chunks\t","Success\t||\tserver_job ensure_server spawns a new opencode server only once\t","\t","Success: \t5\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/util_spec.lua\t","Success\t||\tutil.parse_dot_args parses flat booleans\t","Success\t||\tutil.parse_dot_args parses nested dot notation\t","Success\t||\tutil.parse_dot_args parses mixed nesting and booleans\t","Success\t||\tutil.parse_dot_args parses numbers\t","Success\t||\tutil.parse_dot_args handles empty string\t","\t","Success: \t5\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/api_client_spec.lua\t","Success\t||\tapi_client should create a new client instance\t","Success\t||\tapi_client should remove trailing slash from base_url\t","Success\t||\tapi_client should create client using create factory function\t","Success\t||\tapi_client should have all expected API methods\t","Success\t||\tapi_client should construct URLs correctly with query parameters\t","\t","Success: \t5\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/session_spec.lua\t","Success\t||\topencode.session get_last_workspace_session returns the most recent session for current workspace\t","Success\t||\topencode.session get_last_workspace_session returns nil when no sessions match the workspace\t","Success\t||\topencode.session get_last_workspace_session handles JSON parsing errors\t","Success\t||\topencode.session get_last_workspace_session handles empty session list\t","Success\t||\topencode.session get_by_name returns the session with matching ID\t","Success\t||\topencode.session get_by_name returns nil when no session matches the ID\t","Success\t||\topencode.session read_json_dir returns nil for non-existent directory\t","Success\t||\topencode.session read_json_dir returns nil when directory exists but has no JSON files\t","Success\t||\topencode.session read_json_dir returns decoded JSON content from directory\t","Success\t||\topencode.session read_json_dir skips invalid JSON files\t","Success\t||\topencode.session get_messages returns nil when session is nil\t","Success\t||\topencode.session get_messages returns nil when messages directory does not exist\t","Success\t||\topencode.session get_messages returns messages with their parts\t","\t","Success: \t13\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/config_file_spec.lua\t","Success\t||\tconfig_file.setup lazily loads config when accessed\t","Success\t||\tconfig_file.setup get_opencode_agents returns primary + defaults\t","Success\t||\tconfig_file.setup get_opencode_project returns project\t","\t","Success: \t3\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/api_spec.lua\t","Success\t||\topencode.api commands table contains the expected commands with proper structure\t","Success\t||\topencode.api setup registers all commands\t","Success\t||\topencode.api setup sets up command functions that call the correct core functions\t","Success\t||\topencode.api Lua API provides callable functions that match commands\t","\t","Success: \t4\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/id_spec.lua\t","Success\t||\tID module should generate ascending session IDs\t","Success\t||\tID module should generate descending message IDs\t","Success\t||\tID module should validate given IDs correctly\t","Success\t||\tID module should throw error for invalid given IDs\t","Success\t||\tID module should validate schemas correctly\t","Success\t||\tID module should return available prefixes\t","Success\t||\tID module should generate IDs with correct length structure\t","\t","Success: \t7\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/render_state_spec.lua\t","Success\t||\tRenderState new and reset creates a new instance\t","Success\t||\tRenderState new and reset resets to empty state\t","Success\t||\tRenderState set_message sets a new message\t","Success\t||\tRenderState set_message updates line index for message\t","Success\t||\tRenderState set_message updates existing message\t","Success\t||\tRenderState set_part sets a new part\t","Success\t||\tRenderState set_part updates line index for part\t","Success\t||\tRenderState set_part initializes actions array\t","Success\t||\tRenderState get_part_at_line returns part at line\t","Success\t||\tRenderState get_part_at_line returns nil for line without part\t","Success\t||\tRenderState get_message_at_line returns message at line\t","Success\t||\tRenderState get_message_at_line returns nil for line without message\t","Success\t||\tRenderState get_part_by_call_id finds part by call ID\t","Success\t||\tRenderState get_part_by_call_id returns nil when call ID not found\t","Success\t||\tRenderState actions adds actions to part\t","Success\t||\tRenderState actions adds actions with offset\t","Success\t||\tRenderState actions clears actions for part\t","Success\t||\tRenderState actions gets actions at line\t","Success\t||\tRenderState actions gets all actions from all parts\t","Success\t||\tRenderState update_part_lines updates part line positions\t","Success\t||\tRenderState update_part_lines shifts subsequent content when expanding\t","Success\t||\tRenderState update_part_lines shifts subsequent content when shrinking\t","Success\t||\tRenderState update_part_lines returns false for non-existent part\t","Success\t||\tRenderState remove_part removes part and shifts subsequent content\t","Success\t||\tRenderState remove_part clears line index for removed part\t","Success\t||\tRenderState remove_part returns false for non-existent part\t","Success\t||\tRenderState remove_message removes message and shifts subsequent content\t","Success\t||\tRenderState remove_message clears line index for removed message\t","Success\t||\tRenderState remove_message returns false for non-existent message\t","Success\t||\tRenderState remove_message removes unrendered message without shifting\t","Success\t||\tRenderState shift_all does nothing when delta is 0\t","Success\t||\tRenderState shift_all shifts content at or after from_line\t","Success\t||\tRenderState shift_all shifts actions with parts\t","Success\t||\tRenderState shift_all does not rebuild index when nothing shifted\t","Success\t||\tRenderState shift_all invalidates index when content shifted\t","Success\t||\tRenderState shift_all exits early when content found before from_line\t","Success\t||\tRenderState update_part_data updates part reference\t","Success\t||\tRenderState update_part_data does nothing for non-existent part\t","Success\t||\tRenderState get_unrendered_message_ids returns empty list when no unrendered messages\t","Success\t||\tRenderState get_unrendered_message_ids returns list of unrendered message IDs\t","Success\t||\tRenderState get_unrendered_message_ids returns sorted list of message IDs\t","\t","Success: \t41\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/init_spec.lua\t","Success\t||\topencode has setup function in the public API\t","Success\t||\topencode main module can be required without errors\t","\t","Success: \t2\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/snapshot_spec.lua\t","Success\t||\tsnapshot.restore runs read-tree and checkout-index and notifies on success\t","Success\t||\tsnapshot.restore notifies error if no active session\t","Success\t||\tsnapshot.restore notifies error if read-tree fails\t","Success\t||\tsnapshot.restore notifies error if checkout-index fails\t","\t","Success: \t4\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/event_manager_spec.lua\t","Success\t||\tEventManager should create a new instance\t","Success\t||\tEventManager should subscribe and emit events\t","Success\t||\tEventManager should handle multiple subscribers\t","Success\t||\tEventManager should unsubscribe correctly\t","Success\t||\tEventManager should track subscriber count\t","Success\t||\tEventManager should list event names\t","Success\t||\tEventManager should handle starting and stopping\t","Success\t||\tEventManager should not start multiple times\t","\t","Success: \t8\t","Failed : \t0\t","========================================\t","Error detected while processing command line:","opencode command not found - please install and configure opencode before using this plugin","Unsupported opencode CLI version: opencode 0.4.1. Requires >= 0.4.2","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/core_spec.lua\t","Success\t||\topencode.core open creates windows if they don't exist\t","Success\t||\topencode.core open handles new session properly\t","Success\t||\topencode.core open focuses the appropriate window\t","Success\t||\topencode.core select_session filters sessions by description and parentID\t","Success\t||\topencode.core send_message sends a message via api_client\t","Success\t||\topencode.core send_message creates new session when none active\t","Success\t||\topencode.core opencode_ok (version checks) returns false when opencode executable is missing\t","Success\t||\topencode.core opencode_ok (version checks) returns false when version is below required\t","Success\t||\topencode.core opencode_ok (version checks) returns true when version equals required\t","Success\t||\topencode.core opencode_ok (version checks) returns true when version is above required\t","\t","Success: \t10\t","Failed : \t0\t","========================================\t","File not added to context. Could not read.","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/context_spec.lua\t","Success\t||\textract_from_opencode_message extracts prompt, selected_text, and current_file from tags in parts\t","Success\t||\textract_from_opencode_message returns nils if message or parts missing\t","Success\t||\textract_from_message_legacy extracts legacy tags from text\t","Success\t||\textract_legacy_tag extracts content between tags\t","Success\t||\textract_legacy_tag returns nil if tag not found\t","Success\t||\tformat_message returns a parts array with prompt as first part\t","Success\t||\tformat_message includes mentioned_files and subagents\t","Success\t||\tdelta_context removes current_file if unchanged\t","Success\t||\tdelta_context removes mentioned_subagents if unchanged\t","Success\t||\tadd_file/add_selection/add_subagent adds a file if filereadable\t","Success\t||\tadd_file/add_selection/add_subagent does not add file if not filereadable\t","Success\t||\tadd_file/add_selection/add_subagent adds a selection\t","Success\t||\tadd_file/add_selection/add_subagent adds a subagent\t","\t","Success: \t13\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/opencode_server_spec.lua\t","Success\t||\topencode.opencode_server creates a new server object\t","Success\t||\topencode.opencode_server spawn promise resolves when stdout emits server URL\t","Success\t||\topencode.opencode_server shutdown resolves shutdown_promise and clears fields\t","Success\t||\topencode.opencode_server calls on_error when stderr is triggered\t","Success\t||\topencode.opencode_server calls on_exit and clears fields when process exits\t","\t","Success: \t5\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/config_spec.lua\t","Success\t||\topencode.config uses default values when no options are provided\t","Success\t||\topencode.config merges user options with defaults\t","\t","Success: \t2\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/keymap_spec.lua\t","Success\t||\topencode.keymap setup sets up keymap with new format configured keys\t","Success\t||\topencode.keymap setup sets up keymap with old format configured keys (normalized)\t","Success\t||\topencode.keymap setup sets up callbacks that execute the correct commands (new format)\t","Success\t||\topencode.keymap setup sets up callbacks that execute the correct commands (old format normalized)\t","Success\t||\topencode.keymap normalize_keymap normalizes old format keymap to new format correctly\t","Success\t||\topencode.keymap normalize_keymap shows error message for unknown API functions\t","Success\t||\topencode.keymap normalize_keymap uses custom description from config_entry\t","Success\t||\topencode.keymap normalize_keymap falls back to API description when no custom desc provided\t","Success\t||\topencode.keymap setup_window_keymaps handles unknown API functions with error message\t","Success\t||\topencode.keymap setup_window_keymaps uses custom description for window keymaps\t","Success\t||\topencode.keymap setup_permisson_keymap sets up permission keymaps when there is a current permission\t","Success\t||\topencode.keymap setup_permisson_keymap should delete existing permission keymaps if no current permission exists after being set\t","Success\t||\topencode.keymap setup_permisson_keymap does not set permission keymaps when there is no current permission\t","\t","Success: \t13\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/state_spec.lua\t","Success\t||\topencode.state (observable) notifies listeners on key change\t","Success\t||\topencode.state (observable) notifies wildcard listeners on any key change\t","Success\t||\topencode.state (observable) can unregister listeners\t","Success\t||\topencode.state (observable) does not notify if value is unchanged\t","\t","Success: \t4\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/timer_spec.lua\t","Success\t||\tTimer Timer.new creates a new timer with required options\t","Success\t||\tTimer Timer.new sets repeat_timer to false when explicitly disabled\t","Success\t||\tTimer Timer.new stores optional parameters\t","Success\t||\tTimer Timer:start starts a repeating timer\t","Success\t||\tTimer Timer:start starts a one-shot timer\t","Success\t||\tTimer Timer:start passes arguments to on_tick function\t","Success\t||\tTimer Timer:start stops timer when on_tick returns false\t","Success\t||\tTimer Timer:start stops timer when on_tick throws an error\t","Success\t||\tTimer Timer:start stops previous timer before starting new one\t","Success\t||\tTimer Timer:start throws error when timer creation fails\t","Success\t||\tTimer Timer:stop stops a running timer\t","Success\t||\tTimer Timer:stop calls on_stop callback when provided\t","Success\t||\tTimer Timer:stop does nothing when timer is not running\t","Success\t||\tTimer Timer:stop handles errors in on_stop callback gracefully\t","Success\t||\tTimer Timer:is_running returns false when timer is not started\t","Success\t||\tTimer Timer:is_running returns true when timer is running\t","Success\t||\tTimer Timer:is_running returns false after timer is stopped\t","Success\t||\tTimer Timer:is_running returns false after one-shot timer completes\t","Success\t||\tTimer Integration tests can restart a stopped timer\t","Success\t||\tTimer Integration tests handles rapid start/stop cycles\t","\t","Success: \t20\t","Failed : \t0\t","========================================\t","Two pending permissions? existing: per_9efb5b2f3001aqJAFBMiGjFjVZ new: per_9efb5bc2a001j9Bd6bFjLB7hrc","Two pending permissions? existing: per_9efb5bc2a001j9Bd6bFjLB7hrc new: per_9efb5d6d1001uwVXQ9dhlBlgfO","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/renderer_spec.lua\t","Success\t||\trenderer replays api-error correctly (event-by-event)\t","Success\t||\trenderer replays api-error correctly (session)\t","Success\t||\trenderer replays diff correctly (event-by-event)\t","Success\t||\trenderer replays diff correctly (session)\t","Success\t||\trenderer replays mentions-with-ranges correctly (event-by-event)\t","Success\t||\trenderer replays mentions-with-ranges correctly (session)\t","Success\t||\trenderer replays message-removal correctly (event-by-event)\t","Success\t||\trenderer replays permission-denied correctly (event-by-event)\t","Success\t||\trenderer replays permission-denied correctly (session)\t","Success\t||\trenderer replays permission-prompt correctly (event-by-event)\t","Success\t||\trenderer replays permission correctly (event-by-event)\t","Success\t||\trenderer replays permission correctly (session)\t","Success\t||\trenderer replays planning correctly (event-by-event)\t","Success\t||\trenderer replays planning correctly (session)\t","Success\t||\trenderer replays redo-all correctly (event-by-event)\t","Success\t||\trenderer replays redo-all correctly (session)\t","Success\t||\trenderer replays redo-once correctly (event-by-event)\t","Success\t||\trenderer replays redo-once correctly (session)\t","Success\t||\trenderer replays revert correctly (event-by-event)\t","Success\t||\trenderer replays revert correctly (session)\t","Success\t||\trenderer replays selection correctly (event-by-event)\t","Success\t||\trenderer replays selection correctly (session)\t","Success\t||\trenderer replays shifting-and-multiple-perms correctly (event-by-event)\t","Success\t||\trenderer replays simple-session correctly (event-by-event)\t","Success\t||\trenderer replays simple-session correctly (session)\t","Success\t||\trenderer replays tool-invalid correctly (event-by-event)\t","Success\t||\trenderer replays tool-invalid correctly (session)\t","Success\t||\trenderer replays updating-text correctly (event-by-event)\t","Success\t||\trenderer replays updating-text correctly (session)\t","Success\t||\trenderer unrendered messages is_message_unrendered returns true for unrendered message\t","Success\t||\trenderer unrendered messages is_message_unrendered returns false for rendered message\t","Success\t||\trenderer unrendered messages is_message_unrendered returns false for nil\t","Fail\t||\trenderer unrendered messages _remove_message_from_buffer skips unrendered message\t"," ...ev/neovim-dev/opencode.nvim/tests/unit/renderer_spec.lua:207: Expected objects to not be the same."," Passed in:"," (nil)"," Did not expect:"," type nil"," "," stack traceback:"," \t...ev/neovim-dev/opencode.nvim/tests/unit/renderer_spec.lua:207: in function <...ev/neovim-dev/opencode.nvim/tests/unit/renderer_spec.lua:201>"," \t","Success\t||\trenderer unrendered messages _replace_message_in_buffer returns false for unrendered message\t","Fail\t||\trenderer unrendered messages _rerender_part skips if parent message is unrendered\t"," ...ev/neovim-dev/opencode.nvim/tests/unit/renderer_spec.lua:232: Expected objects to be equal."," Passed in:"," (number) 9"," Expected:"," (number) 15"," "," stack traceback:"," \t...ev/neovim-dev/opencode.nvim/tests/unit/renderer_spec.lua:232: in function <...ev/neovim-dev/opencode.nvim/tests/unit/renderer_spec.lua:222>"," \t","\t","Success: \t33\t","Failed : \t2\t","========================================\t","Tests Failed. Exit: 1\t","✗ Unit tests failed","------------------------------------------------","","======== TEST FAILURES SUMMARY ========","Found 2 failing test(s):","","FAILED TEST: \trenderer unrendered messages _remove_message_from_buffer skips unrendered message\t","FAILED TEST: \trenderer unrendered messages _rerender_part skips if parent message is unrendered\t","","```",""]} \ No newline at end of file +{"extmarks":[[1,2,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"right_gravity":true,"priority":10,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-23 21:00:24)","OpencodeHint"],[" [msg_a12df6fcc002lSmBoztX2X6eCp]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_win_col":-3}],[2,4,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[3,5,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[4,6,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[5,7,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[6,8,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[7,9,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[8,10,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[9,11,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[10,12,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[11,13,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[12,14,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[13,15,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[14,16,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[15,17,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[16,18,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[17,19,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[18,20,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[19,21,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[20,22,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[21,23,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[22,24,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[23,25,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[24,26,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[25,27,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[26,28,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[27,29,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[28,30,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[29,31,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[30,32,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[31,33,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[32,34,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[33,35,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[34,36,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[35,37,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[36,38,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[37,39,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[38,40,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[39,41,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[40,42,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[41,43,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[42,44,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[43,45,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[44,46,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[45,47,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[46,48,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[47,49,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[48,50,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[49,51,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[50,52,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[51,53,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[52,54,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[53,55,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[54,56,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[55,57,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[56,58,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[57,59,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[58,60,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[59,61,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[60,62,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[61,63,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[62,64,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[63,65,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[64,66,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[65,67,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[66,68,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[67,69,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[68,70,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[69,71,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[70,72,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[71,73,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[72,74,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[73,75,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[74,76,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[75,77,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[76,78,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[77,79,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[78,80,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[79,81,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[80,82,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[81,83,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[82,84,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[83,85,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[84,86,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[85,87,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[86,88,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[87,89,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[88,90,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[89,91,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[90,92,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[91,93,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[92,94,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[93,95,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[94,96,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[95,97,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[96,98,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[97,99,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[98,100,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[99,101,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[100,102,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[101,103,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[102,104,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[103,105,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[104,106,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[105,107,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[106,108,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[107,109,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[108,110,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[109,111,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[110,112,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[111,113,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[112,114,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[113,115,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[114,116,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[115,117,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[116,118,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[117,119,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[118,120,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[119,121,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[120,122,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[121,123,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[122,124,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[123,125,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[124,126,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[125,127,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[126,128,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[127,129,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[128,130,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[129,131,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[130,132,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[131,133,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[132,134,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[133,135,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[134,136,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[135,137,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[136,138,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[137,139,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[138,140,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[139,141,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[140,142,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[141,143,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[142,144,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[143,145,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[144,146,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[145,147,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[146,148,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[147,149,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[148,150,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[149,151,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[150,152,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[151,153,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[152,154,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[153,155,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[154,156,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[155,157,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[156,158,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[157,159,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[158,160,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[159,161,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[160,162,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[161,163,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[162,164,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[163,165,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[164,166,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[165,167,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[166,168,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[167,169,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[168,170,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[169,171,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[170,172,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[171,173,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[172,174,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[173,175,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[174,176,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[175,177,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[176,178,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[177,179,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[178,180,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[179,181,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[180,182,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[181,183,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[182,184,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[183,185,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[184,186,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[185,187,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[186,188,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[187,189,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[188,190,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[189,191,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[190,192,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[191,193,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[192,194,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[193,195,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[194,196,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[195,197,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[196,198,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[197,199,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[198,200,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[199,201,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[200,202,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[201,203,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[202,204,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[203,205,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[204,206,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[205,207,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[206,208,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[207,209,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[208,210,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[209,211,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[210,212,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[211,213,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[212,214,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[213,215,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[214,216,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[215,217,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[216,218,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[217,219,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[218,220,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[219,221,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[220,222,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[221,223,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[222,224,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[223,225,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[224,226,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[225,227,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[226,228,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[227,229,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[228,230,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[229,231,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[230,232,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[231,233,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[232,234,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[233,235,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[234,236,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[235,237,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[236,238,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[237,239,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[238,240,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[239,241,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[240,242,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[241,243,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[242,244,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[243,245,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[244,246,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[245,247,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[246,248,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[247,249,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[248,250,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[249,251,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[250,252,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[251,253,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[252,254,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[253,255,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[254,256,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[255,257,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[256,258,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[257,259,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[258,260,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[259,261,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[260,262,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[261,263,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[262,264,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[263,265,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[264,266,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[265,267,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[266,268,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[267,269,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[268,270,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[269,271,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[270,272,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[271,273,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[272,274,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[273,275,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[274,276,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[275,277,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[276,278,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[277,279,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[278,280,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[279,281,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[280,282,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[281,283,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[282,284,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[283,285,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[284,286,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[285,287,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[286,288,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[287,289,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[288,290,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[289,291,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[290,292,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[291,293,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[292,294,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[293,295,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[294,296,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[295,297,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[296,298,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[297,299,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[298,300,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[299,301,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[300,302,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[301,303,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[302,304,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[303,305,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[304,306,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[305,307,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[306,308,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[307,309,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[308,310,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[309,311,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[310,312,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[311,313,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[312,314,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[313,315,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[314,316,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[315,317,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[316,318,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[317,319,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[318,320,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[319,321,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[320,322,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[321,323,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[322,324,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[323,325,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[324,326,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[325,327,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[326,328,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[327,329,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[328,330,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[329,331,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[330,332,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[331,333,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[332,334,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[333,335,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[334,336,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[335,337,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[336,338,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[337,339,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[338,340,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[339,341,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[340,342,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[341,343,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[342,344,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[343,345,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[344,346,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[345,347,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[346,348,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[347,349,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[348,350,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[349,351,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[350,352,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[351,353,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[352,354,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[353,355,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[354,356,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[355,357,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[356,358,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[357,359,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[358,360,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[359,361,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[360,362,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[361,363,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[362,364,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[363,365,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[364,366,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[365,367,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[366,368,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[367,369,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[368,370,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[369,371,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[370,372,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[371,373,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[372,374,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[373,375,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[374,376,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[375,377,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[376,378,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[377,379,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[378,380,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[379,381,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[380,382,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[381,383,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[382,384,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[383,385,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[384,386,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[385,387,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[386,388,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[387,389,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[388,390,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[389,391,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[390,392,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[391,393,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[392,394,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[393,395,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[394,396,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[395,397,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[396,398,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[397,399,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[398,400,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[399,401,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[400,402,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[401,403,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[402,404,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[403,405,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[404,406,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[405,407,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}],[406,408,0,{"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1}]],"timestamp":1761708189,"lines":["","----","","","** run** `Run all tests to verify refactoring`","","`````bash","> cd /Users/cam/Dev/neovim-dev/opencode.nvim && ./run_tests.sh","","Running tests for opencode.nvim","------------------------------------------------","Starting...Scheduling: ./tests/minimal/plugin_spec.lua","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/minimal/plugin_spec.lua\t","Success\t||\topencode.nvim plugin loads the plugin without errors\t","Success\t||\topencode.nvim plugin can be set up with custom config\t","\t","Success: \t2\t","Failed : \t0\t","========================================\t","✓ Minimal tests passed","------------------------------------------------","Starting...Scheduling: ./tests/unit/timer_spec.lua","Scheduling: ./tests/unit/server_job_spec.lua","Scheduling: ./tests/unit/config_spec.lua","Scheduling: ./tests/unit/api_spec.lua","Scheduling: ./tests/unit/event_manager_spec.lua","Scheduling: ./tests/unit/init_spec.lua","Scheduling: ./tests/unit/state_spec.lua","Scheduling: ./tests/unit/id_spec.lua","Scheduling: ./tests/unit/api_client_spec.lua","Scheduling: ./tests/unit/context_spec.lua","Scheduling: ./tests/unit/session_spec.lua","Scheduling: ./tests/unit/config_file_spec.lua","Scheduling: ./tests/unit/renderer_spec.lua","Scheduling: ./tests/unit/opencode_server_spec.lua","Scheduling: ./tests/unit/core_spec.lua","Scheduling: ./tests/unit/render_state_spec.lua","Scheduling: ./tests/unit/snapshot_spec.lua","Scheduling: ./tests/unit/keymap_spec.lua","Scheduling: ./tests/unit/util_spec.lua","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/server_job_spec.lua\t","Success\t||\tserver_job exposes expected public functions\t","Success\t||\tserver_job call_api resolves with decoded json and toggles is_job_running\t","Success\t||\tserver_job call_api rejects on non 2xx\t","Success\t||\tserver_job stream_api forwards chunks\t","Success\t||\tserver_job ensure_server spawns a new opencode server only once\t","\t","Success: \t5\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/util_spec.lua\t","Success\t||\tutil.parse_dot_args parses flat booleans\t","Success\t||\tutil.parse_dot_args parses nested dot notation\t","Success\t||\tutil.parse_dot_args parses mixed nesting and booleans\t","Success\t||\tutil.parse_dot_args parses numbers\t","Success\t||\tutil.parse_dot_args handles empty string\t","\t","Success: \t5\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/api_client_spec.lua\t","Success\t||\tapi_client should create a new client instance\t","Success\t||\tapi_client should remove trailing slash from base_url\t","Success\t||\tapi_client should create client using create factory function\t","Success\t||\tapi_client should have all expected API methods\t","Success\t||\tapi_client should construct URLs correctly with query parameters\t","\t","Success: \t5\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/session_spec.lua\t","Success\t||\topencode.session get_last_workspace_session returns the most recent session for current workspace\t","Success\t||\topencode.session get_last_workspace_session returns nil when no sessions match the workspace\t","Success\t||\topencode.session get_last_workspace_session handles JSON parsing errors\t","Success\t||\topencode.session get_last_workspace_session handles empty session list\t","Success\t||\topencode.session get_by_name returns the session with matching ID\t","Success\t||\topencode.session get_by_name returns nil when no session matches the ID\t","Success\t||\topencode.session read_json_dir returns nil for non-existent directory\t","Success\t||\topencode.session read_json_dir returns nil when directory exists but has no JSON files\t","Success\t||\topencode.session read_json_dir returns decoded JSON content from directory\t","Success\t||\topencode.session read_json_dir skips invalid JSON files\t","Success\t||\topencode.session get_messages returns nil when session is nil\t","Success\t||\topencode.session get_messages returns nil when messages directory does not exist\t","Success\t||\topencode.session get_messages returns messages with their parts\t","\t","Success: \t13\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/config_file_spec.lua\t","Success\t||\tconfig_file.setup lazily loads config when accessed\t","Success\t||\tconfig_file.setup get_opencode_agents returns primary + defaults\t","Success\t||\tconfig_file.setup get_opencode_project returns project\t","\t","Success: \t3\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/api_spec.lua\t","Success\t||\topencode.api commands table contains the expected commands with proper structure\t","Success\t||\topencode.api setup registers all commands\t","Success\t||\topencode.api setup sets up command functions that call the correct core functions\t","Success\t||\topencode.api Lua API provides callable functions that match commands\t","\t","Success: \t4\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/id_spec.lua\t","Success\t||\tID module should generate ascending session IDs\t","Success\t||\tID module should generate descending message IDs\t","Success\t||\tID module should validate given IDs correctly\t","Success\t||\tID module should throw error for invalid given IDs\t","Success\t||\tID module should validate schemas correctly\t","Success\t||\tID module should return available prefixes\t","Success\t||\tID module should generate IDs with correct length structure\t","\t","Success: \t7\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/render_state_spec.lua\t","Success\t||\tRenderState new and reset creates a new instance\t","Success\t||\tRenderState new and reset resets to empty state\t","Success\t||\tRenderState set_message sets a new message\t","Success\t||\tRenderState set_message updates line index for message\t","Success\t||\tRenderState set_message updates existing message\t","Success\t||\tRenderState set_part sets a new part\t","Success\t||\tRenderState set_part updates line index for part\t","Success\t||\tRenderState set_part initializes actions array\t","Success\t||\tRenderState get_part_at_line returns part at line\t","Success\t||\tRenderState get_part_at_line returns nil for line without part\t","Success\t||\tRenderState get_message_at_line returns message at line\t","Success\t||\tRenderState get_message_at_line returns nil for line without message\t","Success\t||\tRenderState get_part_by_call_id finds part by call ID\t","Success\t||\tRenderState get_part_by_call_id returns nil when call ID not found\t","Success\t||\tRenderState actions adds actions to part\t","Success\t||\tRenderState actions adds actions with offset\t","Success\t||\tRenderState actions clears actions for part\t","Success\t||\tRenderState actions gets actions at line\t","Success\t||\tRenderState actions gets all actions from all parts\t","Success\t||\tRenderState update_part_lines updates part line positions\t","Success\t||\tRenderState update_part_lines shifts subsequent content when expanding\t","Success\t||\tRenderState update_part_lines shifts subsequent content when shrinking\t","Success\t||\tRenderState update_part_lines returns false for non-existent part\t","Success\t||\tRenderState remove_part removes part and shifts subsequent content\t","Success\t||\tRenderState remove_part clears line index for removed part\t","Success\t||\tRenderState remove_part returns false for non-existent part\t","Success\t||\tRenderState remove_message removes message and shifts subsequent content\t","Success\t||\tRenderState remove_message clears line index for removed message\t","Success\t||\tRenderState remove_message returns false for non-existent message\t","Success\t||\tRenderState remove_message removes unrendered message without shifting\t","Success\t||\tRenderState shift_all does nothing when delta is 0\t","Success\t||\tRenderState shift_all shifts content at or after from_line\t","Success\t||\tRenderState shift_all shifts actions with parts\t","Success\t||\tRenderState shift_all does not rebuild index when nothing shifted\t","Success\t||\tRenderState shift_all invalidates index when content shifted\t","Success\t||\tRenderState shift_all exits early when content found before from_line\t","Success\t||\tRenderState update_part_data updates part reference\t","Success\t||\tRenderState update_part_data does nothing for non-existent part\t","Success\t||\tRenderState get_unrendered_message_ids returns empty list when no unrendered messages\t","Success\t||\tRenderState get_unrendered_message_ids returns list of unrendered message IDs\t","Success\t||\tRenderState get_unrendered_message_ids returns sorted list of message IDs\t","\t","Success: \t41\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/init_spec.lua\t","Success\t||\topencode has setup function in the public API\t","Success\t||\topencode main module can be required without errors\t","\t","Success: \t2\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/snapshot_spec.lua\t","Success\t||\tsnapshot.restore runs read-tree and checkout-index and notifies on success\t","Success\t||\tsnapshot.restore notifies error if no active session\t","Success\t||\tsnapshot.restore notifies error if read-tree fails\t","Success\t||\tsnapshot.restore notifies error if checkout-index fails\t","\t","Success: \t4\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/event_manager_spec.lua\t","Success\t||\tEventManager should create a new instance\t","Success\t||\tEventManager should subscribe and emit events\t","Success\t||\tEventManager should handle multiple subscribers\t","Success\t||\tEventManager should unsubscribe correctly\t","Success\t||\tEventManager should track subscriber count\t","Success\t||\tEventManager should list event names\t","Success\t||\tEventManager should handle starting and stopping\t","Success\t||\tEventManager should not start multiple times\t","\t","Success: \t8\t","Failed : \t0\t","========================================\t","Error detected while processing command line:","opencode command not found - please install and configure opencode before using this plugin","Unsupported opencode CLI version: opencode 0.4.1. Requires >= 0.4.2","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/core_spec.lua\t","Success\t||\topencode.core open creates windows if they don't exist\t","Success\t||\topencode.core open handles new session properly\t","Success\t||\topencode.core open focuses the appropriate window\t","Success\t||\topencode.core select_session filters sessions by description and parentID\t","Success\t||\topencode.core send_message sends a message via api_client\t","Success\t||\topencode.core send_message creates new session when none active\t","Success\t||\topencode.core opencode_ok (version checks) returns false when opencode executable is missing\t","Success\t||\topencode.core opencode_ok (version checks) returns false when version is below required\t","Success\t||\topencode.core opencode_ok (version checks) returns true when version equals required\t","Success\t||\topencode.core opencode_ok (version checks) returns true when version is above required\t","\t","Success: \t10\t","Failed : \t0\t","========================================\t","File not added to context. Could not read.","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/context_spec.lua\t","Success\t||\textract_from_opencode_message extracts prompt, selected_text, and current_file from tags in parts\t","Success\t||\textract_from_opencode_message returns nils if message or parts missing\t","Success\t||\textract_from_message_legacy extracts legacy tags from text\t","Success\t||\textract_legacy_tag extracts content between tags\t","Success\t||\textract_legacy_tag returns nil if tag not found\t","Success\t||\tformat_message returns a parts array with prompt as first part\t","Success\t||\tformat_message includes mentioned_files and subagents\t","Success\t||\tdelta_context removes current_file if unchanged\t","Success\t||\tdelta_context removes mentioned_subagents if unchanged\t","Success\t||\tadd_file/add_selection/add_subagent adds a file if filereadable\t","Success\t||\tadd_file/add_selection/add_subagent does not add file if not filereadable\t","Success\t||\tadd_file/add_selection/add_subagent adds a selection\t","Success\t||\tadd_file/add_selection/add_subagent adds a subagent\t","\t","Success: \t13\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/opencode_server_spec.lua\t","Success\t||\topencode.opencode_server creates a new server object\t","Success\t||\topencode.opencode_server spawn promise resolves when stdout emits server URL\t","Success\t||\topencode.opencode_server shutdown resolves shutdown_promise and clears fields\t","Success\t||\topencode.opencode_server calls on_error when stderr is triggered\t","Success\t||\topencode.opencode_server calls on_exit and clears fields when process exits\t","\t","Success: \t5\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/config_spec.lua\t","Success\t||\topencode.config uses default values when no options are provided\t","Success\t||\topencode.config merges user options with defaults\t","\t","Success: \t2\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/keymap_spec.lua\t","Success\t||\topencode.keymap setup sets up keymap with new format configured keys\t","Success\t||\topencode.keymap setup sets up keymap with old format configured keys (normalized)\t","Success\t||\topencode.keymap setup sets up callbacks that execute the correct commands (new format)\t","Success\t||\topencode.keymap setup sets up callbacks that execute the correct commands (old format normalized)\t","Success\t||\topencode.keymap normalize_keymap normalizes old format keymap to new format correctly\t","Success\t||\topencode.keymap normalize_keymap shows error message for unknown API functions\t","Success\t||\topencode.keymap normalize_keymap uses custom description from config_entry\t","Success\t||\topencode.keymap normalize_keymap falls back to API description when no custom desc provided\t","Success\t||\topencode.keymap setup_window_keymaps handles unknown API functions with error message\t","Success\t||\topencode.keymap setup_window_keymaps uses custom description for window keymaps\t","Success\t||\topencode.keymap setup_permisson_keymap sets up permission keymaps when there is a current permission\t","Success\t||\topencode.keymap setup_permisson_keymap should delete existing permission keymaps if no current permission exists after being set\t","Success\t||\topencode.keymap setup_permisson_keymap does not set permission keymaps when there is no current permission\t","\t","Success: \t13\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/state_spec.lua\t","Success\t||\topencode.state (observable) notifies listeners on key change\t","Success\t||\topencode.state (observable) notifies wildcard listeners on any key change\t","Success\t||\topencode.state (observable) can unregister listeners\t","Success\t||\topencode.state (observable) does not notify if value is unchanged\t","\t","Success: \t4\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/timer_spec.lua\t","Success\t||\tTimer Timer.new creates a new timer with required options\t","Success\t||\tTimer Timer.new sets repeat_timer to false when explicitly disabled\t","Success\t||\tTimer Timer.new stores optional parameters\t","Success\t||\tTimer Timer:start starts a repeating timer\t","Success\t||\tTimer Timer:start starts a one-shot timer\t","Success\t||\tTimer Timer:start passes arguments to on_tick function\t","Success\t||\tTimer Timer:start stops timer when on_tick returns false\t","Success\t||\tTimer Timer:start stops timer when on_tick throws an error\t","Success\t||\tTimer Timer:start stops previous timer before starting new one\t","Success\t||\tTimer Timer:start throws error when timer creation fails\t","Success\t||\tTimer Timer:stop stops a running timer\t","Success\t||\tTimer Timer:stop calls on_stop callback when provided\t","Success\t||\tTimer Timer:stop does nothing when timer is not running\t","Success\t||\tTimer Timer:stop handles errors in on_stop callback gracefully\t","Success\t||\tTimer Timer:is_running returns false when timer is not started\t","Success\t||\tTimer Timer:is_running returns true when timer is running\t","Success\t||\tTimer Timer:is_running returns false after timer is stopped\t","Success\t||\tTimer Timer:is_running returns false after one-shot timer completes\t","Success\t||\tTimer Integration tests can restart a stopped timer\t","Success\t||\tTimer Integration tests handles rapid start/stop cycles\t","\t","Success: \t20\t","Failed : \t0\t","========================================\t","Two pending permissions? existing: per_9efb5b2f3001aqJAFBMiGjFjVZ new: per_9efb5bc2a001j9Bd6bFjLB7hrc","Two pending permissions? existing: per_9efb5bc2a001j9Bd6bFjLB7hrc new: per_9efb5d6d1001uwVXQ9dhlBlgfO","","========================================\t","Testing: \t/Users/cam/Dev/neovim-dev/opencode.nvim/tests/unit/renderer_spec.lua\t","Success\t||\trenderer replays api-error correctly (event-by-event)\t","Success\t||\trenderer replays api-error correctly (session)\t","Success\t||\trenderer replays diff correctly (event-by-event)\t","Success\t||\trenderer replays diff correctly (session)\t","Success\t||\trenderer replays mentions-with-ranges correctly (event-by-event)\t","Success\t||\trenderer replays mentions-with-ranges correctly (session)\t","Success\t||\trenderer replays message-removal correctly (event-by-event)\t","Success\t||\trenderer replays permission-denied correctly (event-by-event)\t","Success\t||\trenderer replays permission-denied correctly (session)\t","Success\t||\trenderer replays permission-prompt correctly (event-by-event)\t","Success\t||\trenderer replays permission correctly (event-by-event)\t","Success\t||\trenderer replays permission correctly (session)\t","Success\t||\trenderer replays planning correctly (event-by-event)\t","Success\t||\trenderer replays planning correctly (session)\t","Success\t||\trenderer replays redo-all correctly (event-by-event)\t","Success\t||\trenderer replays redo-all correctly (session)\t","Success\t||\trenderer replays redo-once correctly (event-by-event)\t","Success\t||\trenderer replays redo-once correctly (session)\t","Success\t||\trenderer replays revert correctly (event-by-event)\t","Success\t||\trenderer replays revert correctly (session)\t","Success\t||\trenderer replays selection correctly (event-by-event)\t","Success\t||\trenderer replays selection correctly (session)\t","Success\t||\trenderer replays shifting-and-multiple-perms correctly (event-by-event)\t","Success\t||\trenderer replays simple-session correctly (event-by-event)\t","Success\t||\trenderer replays simple-session correctly (session)\t","Success\t||\trenderer replays tool-invalid correctly (event-by-event)\t","Success\t||\trenderer replays tool-invalid correctly (session)\t","Success\t||\trenderer replays updating-text correctly (event-by-event)\t","Success\t||\trenderer replays updating-text correctly (session)\t","Success\t||\trenderer unrendered messages is_message_unrendered returns true for unrendered message\t","Success\t||\trenderer unrendered messages is_message_unrendered returns false for rendered message\t","Success\t||\trenderer unrendered messages is_message_unrendered returns false for nil\t","Fail\t||\trenderer unrendered messages _remove_message_from_buffer skips unrendered message\t"," ...ev/neovim-dev/opencode.nvim/tests/unit/renderer_spec.lua:207: Expected objects to not be the same."," Passed in:"," (nil)"," Did not expect:"," type nil"," "," stack traceback:"," \t...ev/neovim-dev/opencode.nvim/tests/unit/renderer_spec.lua:207: in function <...ev/neovim-dev/opencode.nvim/tests/unit/renderer_spec.lua:201>"," \t","Success\t||\trenderer unrendered messages _replace_message_in_buffer returns false for unrendered message\t","Fail\t||\trenderer unrendered messages _rerender_part skips if parent message is unrendered\t"," ...ev/neovim-dev/opencode.nvim/tests/unit/renderer_spec.lua:232: Expected objects to be equal."," Passed in:"," (number) 9"," Expected:"," (number) 15"," "," stack traceback:"," \t...ev/neovim-dev/opencode.nvim/tests/unit/renderer_spec.lua:232: in function <...ev/neovim-dev/opencode.nvim/tests/unit/renderer_spec.lua:222>"," \t","\t","Success: \t33\t","Failed : \t2\t","========================================\t","Tests Failed. Exit: 1\t","✗ Unit tests failed","------------------------------------------------","","======== TEST FAILURES SUMMARY ========","Found 2 failing test(s):","","FAILED TEST: \trenderer unrendered messages _remove_message_from_buffer skips unrendered message\t","FAILED TEST: \trenderer unrendered messages _rerender_part skips if parent message is unrendered\t","","`````",""],"actions":[]} \ No newline at end of file diff --git a/tests/data/api-abort.expected.json b/tests/data/api-abort.expected.json index 60c402bf..849bdb5e 100644 --- a/tests/data/api-abort.expected.json +++ b/tests/data/api-abort.expected.json @@ -1 +1 @@ -{"timestamp":1761606463,"extmarks":[[1,2,0,{"virt_text_win_col":-3,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true,"priority":10,"ns_id":3,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-27 22:44:29)","OpencodeHint"],[" [msg_a27d8299d001nchmBunYlZcPyL]","OpencodeHint"]],"virt_text_pos":"win_col"}],[2,3,0,{"virt_text_win_col":-3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[3,4,0,{"virt_text_win_col":-3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[4,5,0,{"virt_text_win_col":-3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[5,6,0,{"virt_text_win_col":-3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[6,9,0,{"virt_text_win_col":-3,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true,"priority":10,"ns_id":3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" (2025-10-27 22:44:29)","OpencodeHint"],[" [msg_a27d829f9002sfUFPslHq5P2b4]","OpencodeHint"]],"virt_text_pos":"win_col"}]],"lines":["","----","","","can generate 10 numbers?","","[a-empty.txt](a-empty.txt)","","----","","","You asked if I can generate 10 numbers, and you referenced reading an empty file (`a-empty.txt`). However, I'm currently in \"plan mode,\" which means I cannot write or modify any files—I'm only allowed to read, observe,","","> [!ERROR] The operation was aborted.",""],"actions":[]} \ No newline at end of file +{"extmarks":[[1,2,0,{"priority":10,"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-27 22:44:29)","OpencodeHint"],[" [msg_a27d8299d001nchmBunYlZcPyL]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_win_col":-3}],[2,3,0,{"priority":4096,"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3}],[3,4,0,{"priority":4096,"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3}],[4,5,0,{"priority":4096,"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3}],[5,6,0,{"priority":4096,"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3}],[6,9,0,{"priority":10,"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" (2025-10-27 22:44:29)","OpencodeHint"],[" [msg_a27d829f9002sfUFPslHq5P2b4]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_win_col":-3}]],"timestamp":1761708190,"actions":[],"lines":["","----","","","can generate 10 numbers?","","[a-empty.txt](a-empty.txt)","","----","","","You asked if I can generate 10 numbers, and you referenced reading an empty file (`a-empty.txt`). However, I'm currently in \"plan mode,\" which means I cannot write or modify any files—I'm only allowed to read, observe,","","> [!ERROR] The operation was aborted.",""]} \ No newline at end of file diff --git a/tests/data/api-error.expected.json b/tests/data/api-error.expected.json index 885d7426..b260947c 100644 --- a/tests/data/api-error.expected.json +++ b/tests/data/api-error.expected.json @@ -1 +1 @@ -{"extmarks":[[1,2,0,{"virt_text_pos":"win_col","virt_text_hide":false,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-20 04:44:37)","OpencodeHint"],[" [msg_9ffef0129001CoCrBKemk7DqcU]","OpencodeHint"]],"right_gravity":true,"virt_text_win_col":-3,"priority":10,"ns_id":3,"virt_text_repeat_linebreak":false}],[2,3,0,{"virt_text_pos":"win_col","virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3,"virt_text_repeat_linebreak":true}],[3,4,0,{"virt_text_pos":"win_col","virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3,"virt_text_repeat_linebreak":true}],[4,5,0,{"virt_text_pos":"win_col","virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3,"virt_text_repeat_linebreak":true}],[5,6,0,{"virt_text_pos":"win_col","virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3,"virt_text_repeat_linebreak":true}],[6,9,0,{"virt_text_pos":"win_col","virt_text_hide":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4-5-20250929","OpencodeHint"],[" (2025-10-20 04:44:37)","OpencodeHint"],[" [msg_9ffef0160001eArLyAssT]","OpencodeHint"]],"right_gravity":true,"virt_text_win_col":-3,"priority":10,"ns_id":3,"virt_text_repeat_linebreak":false}],[7,16,0,{"virt_text_pos":"win_col","virt_text_hide":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4-5-20250929","OpencodeHint"],[" (2025-10-20 04:44:37)","OpencodeHint"],[" [msg_9ffef0170001s2OM00h2cDa94A]","OpencodeHint"]],"right_gravity":true,"virt_text_win_col":-3,"priority":10,"ns_id":3,"virt_text_repeat_linebreak":false}]],"timestamp":1761608289,"lines":["","----","","","test 3","","[diff-test.txt](diff-test.txt)","","----","","","This is some sample text","","> [!ERROR] Simulated: tool/file read failed for earlier assistant message","","----","","","> [!ERROR] AI_APICallError: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.",""],"actions":[]} \ No newline at end of file +{"timestamp":1761708190,"extmarks":[[1,2,0,{"virt_text_win_col":-3,"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":false,"ns_id":3,"priority":10,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-20 04:44:37)","OpencodeHint"],[" [msg_9ffef0129001CoCrBKemk7DqcU]","OpencodeHint"]],"virt_text_pos":"win_col"}],[2,3,0,{"virt_text_win_col":-3,"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[3,4,0,{"virt_text_win_col":-3,"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[4,5,0,{"virt_text_win_col":-3,"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[5,6,0,{"virt_text_win_col":-3,"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[6,9,0,{"virt_text_win_col":-3,"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":false,"ns_id":3,"priority":10,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4-5-20250929","OpencodeHint"],[" (2025-10-20 04:44:37)","OpencodeHint"],[" [msg_9ffef0160001eArLyAssT]","OpencodeHint"]],"virt_text_pos":"win_col"}],[7,16,0,{"virt_text_win_col":-3,"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":false,"ns_id":3,"priority":10,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4-5-20250929","OpencodeHint"],[" (2025-10-20 04:44:37)","OpencodeHint"],[" [msg_9ffef0170001s2OM00h2cDa94A]","OpencodeHint"]],"virt_text_pos":"win_col"}]],"lines":["","----","","","test 3","","[diff-test.txt](diff-test.txt)","","----","","","This is some sample text","","> [!ERROR] Simulated: tool/file read failed for earlier assistant message","","----","","","> [!ERROR] AI_APICallError: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits.",""],"actions":[]} \ No newline at end of file diff --git a/tests/data/diff.expected.json b/tests/data/diff.expected.json index da8be9e0..3ec48440 100644 --- a/tests/data/diff.expected.json +++ b/tests/data/diff.expected.json @@ -1 +1 @@ -{"lines":["","----","","","can you add \"great\" before \"string\" in @diff-test.txt?","","[diff-test.txt](diff-test.txt)","","----","","","** edit** `diff-test.txt`","","```txt"," this is a string"," this is a great string","","```","","**󰻛 Created Snapshot** `1f593f7e`","","----","",""],"timestamp":1761108013,"actions":[{"type":"diff_revert_selected_file","key":"R","text":"[R]evert file","args":["1f593f7ed419c95d3995f8ef4b98d4e571c3a492"],"range":{"from":20,"to":20},"display_line":20},{"type":"diff_revert_all","key":"A","text":"Revert [A]ll","args":["1f593f7ed419c95d3995f8ef4b98d4e571c3a492"],"range":{"from":20,"to":20},"display_line":20},{"type":"diff_open","key":"D","text":"[D]iff","args":["1f593f7ed419c95d3995f8ef4b98d4e571c3a492"],"range":{"from":20,"to":20},"display_line":20}],"extmarks":[[1,2,0,{"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_repeat_linebreak":false,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-12 06:42:56)","OpencodeHint"],[" [msg_9d7287269001C5gRusYfX7A1w1]","OpencodeHint"]],"priority":10,"right_gravity":true,"ns_id":3,"virt_text_win_col":-3}],[2,3,0,{"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"priority":4096,"right_gravity":true,"ns_id":3,"virt_text_win_col":-3}],[3,4,0,{"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"priority":4096,"right_gravity":true,"ns_id":3,"virt_text_win_col":-3}],[4,4,39,{"end_row":4,"ns_id":3,"hl_group":"OpencodeMention","end_col":53,"priority":1000,"hl_eol":false,"right_gravity":true,"end_right_gravity":false}],[5,5,0,{"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"priority":4096,"right_gravity":true,"ns_id":3,"virt_text_win_col":-3}],[6,6,0,{"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"priority":4096,"right_gravity":true,"ns_id":3,"virt_text_win_col":-3}],[7,9,0,{"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_repeat_linebreak":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 06:42:56)","OpencodeHint"],[" [msg_9d7287287001HVwpPaH7WkRVdN]","OpencodeHint"]],"priority":10,"right_gravity":true,"ns_id":3,"virt_text_win_col":-3}],[8,11,0,{"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"right_gravity":true,"ns_id":3,"virt_text_win_col":-1}],[9,12,0,{"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"right_gravity":true,"ns_id":3,"virt_text_win_col":-1}],[10,13,0,{"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"right_gravity":true,"ns_id":3,"virt_text_win_col":-1}],[11,14,0,{"end_col":0,"end_row":15,"hl_group":"OpencodeDiffDelete","right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text_pos":"overlay","virt_text_repeat_linebreak":false,"virt_text":[["-","OpencodeDiffDelete"]],"priority":5000,"ns_id":3,"hl_eol":true}],[12,14,0,{"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"right_gravity":true,"ns_id":3,"virt_text_win_col":-1}],[13,15,0,{"end_col":0,"end_row":16,"hl_group":"OpencodeDiffAdd","right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text_pos":"overlay","virt_text_repeat_linebreak":false,"virt_text":[["+","OpencodeDiffAdd"]],"priority":5000,"ns_id":3,"hl_eol":true}],[14,15,0,{"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"right_gravity":true,"ns_id":3,"virt_text_win_col":-1}],[15,16,0,{"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"right_gravity":true,"ns_id":3,"virt_text_win_col":-1}],[16,17,0,{"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"right_gravity":true,"ns_id":3,"virt_text_win_col":-1}],[17,22,0,{"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_repeat_linebreak":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 06:43:03)","OpencodeHint"],[" [msg_9d7288f2f001hW6NqqhtBc72UU]","OpencodeHint"]],"priority":10,"right_gravity":true,"ns_id":3,"virt_text_win_col":-3}]]} \ No newline at end of file +{"extmarks":[[1,2,0,{"priority":10,"virt_text_repeat_linebreak":false,"ns_id":3,"right_gravity":true,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-12 06:42:56)","OpencodeHint"],[" [msg_9d7287269001C5gRusYfX7A1w1]","OpencodeHint"]],"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_win_col":-3}],[2,3,0,{"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_win_col":-3}],[3,4,0,{"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_win_col":-3}],[4,4,39,{"end_col":53,"end_row":4,"ns_id":3,"right_gravity":true,"end_right_gravity":false,"hl_group":"OpencodeMention","hl_eol":false,"priority":1000}],[5,5,0,{"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_win_col":-3}],[6,6,0,{"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_win_col":-3}],[7,9,0,{"priority":10,"virt_text_repeat_linebreak":false,"ns_id":3,"right_gravity":true,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 06:42:56)","OpencodeHint"],[" [msg_9d7287287001HVwpPaH7WkRVdN]","OpencodeHint"]],"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_win_col":-3}],[8,11,0,{"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_win_col":-1}],[9,12,0,{"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_win_col":-1}],[10,13,0,{"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_win_col":-1}],[11,14,0,{"end_col":0,"end_row":15,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text":[["-","OpencodeDiffDelete"]],"virt_text_pos":"overlay","virt_text_repeat_linebreak":false,"priority":5000,"ns_id":3,"hl_group":"OpencodeDiffDelete","virt_text_hide":false}],[12,14,0,{"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_win_col":-1}],[13,15,0,{"end_col":0,"end_row":16,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","virt_text_repeat_linebreak":false,"priority":5000,"ns_id":3,"hl_group":"OpencodeDiffAdd","virt_text_hide":false}],[14,15,0,{"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_win_col":-1}],[15,16,0,{"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_win_col":-1}],[16,17,0,{"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_win_col":-1}],[17,22,0,{"priority":10,"virt_text_repeat_linebreak":false,"ns_id":3,"right_gravity":true,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 06:43:03)","OpencodeHint"],[" [msg_9d7288f2f001hW6NqqhtBc72UU]","OpencodeHint"]],"virt_text_hide":false,"virt_text_pos":"win_col","virt_text_win_col":-3}]],"timestamp":1761708190,"actions":[{"text":"[R]evert file","range":{"from":20,"to":20},"key":"R","display_line":20,"args":["1f593f7ed419c95d3995f8ef4b98d4e571c3a492"],"type":"diff_revert_selected_file"},{"text":"Revert [A]ll","range":{"from":20,"to":20},"key":"A","display_line":20,"args":["1f593f7ed419c95d3995f8ef4b98d4e571c3a492"],"type":"diff_revert_all"},{"text":"[D]iff","range":{"from":20,"to":20},"key":"D","display_line":20,"args":["1f593f7ed419c95d3995f8ef4b98d4e571c3a492"],"type":"diff_open"}],"lines":["","----","","","can you add \"great\" before \"string\" in @diff-test.txt?","","[diff-test.txt](diff-test.txt)","","----","","","** edit** `diff-test.txt`","","`````txt"," this is a string"," this is a great string","","`````","","**󰻛 Created Snapshot** `1f593f7e`","","----","",""]} \ No newline at end of file diff --git a/tests/data/markdown-codefence.expected.json b/tests/data/markdown-codefence.expected.json new file mode 100644 index 00000000..26e39ff1 --- /dev/null +++ b/tests/data/markdown-codefence.expected.json @@ -0,0 +1 @@ +{"extmarks":[[1,2,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-28 21:53:58)","OpencodeHint"],[" [msg_a2cd04588001P9plKmrFnsNH3M]","OpencodeHint"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"ns_id":3,"priority":10}],[2,6,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[3,7,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[4,8,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[5,9,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[6,10,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[7,11,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[8,12,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[9,13,0,{"virt_text_pos":"overlay","virt_text_hide":false,"right_gravity":true,"end_right_gravity":false,"end_row":14,"virt_text":[["-","OpencodeDiffDelete"]],"virt_text_repeat_linebreak":false,"hl_eol":true,"hl_group":"OpencodeDiffDelete","end_col":0,"ns_id":3,"priority":5000}],[10,13,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[11,14,0,{"virt_text_pos":"overlay","virt_text_hide":false,"right_gravity":true,"end_right_gravity":false,"end_row":15,"virt_text":[["-","OpencodeDiffDelete"]],"virt_text_repeat_linebreak":false,"hl_eol":true,"hl_group":"OpencodeDiffDelete","end_col":0,"ns_id":3,"priority":5000}],[12,14,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[13,15,0,{"virt_text_pos":"overlay","virt_text_hide":false,"right_gravity":true,"end_right_gravity":false,"end_row":16,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_repeat_linebreak":false,"hl_eol":true,"hl_group":"OpencodeDiffAdd","end_col":0,"ns_id":3,"priority":5000}],[14,15,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[15,16,0,{"virt_text_pos":"overlay","virt_text_hide":false,"right_gravity":true,"end_right_gravity":false,"end_row":17,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_repeat_linebreak":false,"hl_eol":true,"hl_group":"OpencodeDiffAdd","end_col":0,"ns_id":3,"priority":5000}],[16,16,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[17,17,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[18,18,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[19,19,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[20,20,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[21,21,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[22,22,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[23,27,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-28 21:54:05)","OpencodeHint"],[" [msg_a2cd062fb001UA0ZzR6JxgLxDQ]","OpencodeHint"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"ns_id":3,"priority":10}],[24,32,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-28 22:34:58)","OpencodeHint"],[" [msg_a2cf5ce65001YLvVsYxIboFcP4]","OpencodeHint"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"ns_id":3,"priority":10}],[25,33,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[26,34,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[27,35,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[28,36,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[29,39,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" (2025-10-28 22:34:58)","OpencodeHint"],[" [msg_a2cf5cf0f002oBAjmnGIMGXjez]","OpencodeHint"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"ns_id":3,"priority":10}]],"actions":[{"type":"diff_revert_selected_file","display_line":25,"args":["c64ddee834f1b802020a8f880eafa689f0b99406"],"range":{"from":25,"to":25},"key":"R","text":"[R]evert file"},{"type":"diff_revert_all","display_line":25,"args":["c64ddee834f1b802020a8f880eafa689f0b99406"],"range":{"from":25,"to":25},"key":"A","text":"Revert [A]ll"},{"type":"diff_open","display_line":25,"args":["c64ddee834f1b802020a8f880eafa689f0b99406"],"range":{"from":25,"to":25},"key":"D","text":"[D]iff"}],"timestamp":1761710930,"lines":["","----","","","Now let me also update the Run opts examples to use the new command syntax:","","** edit** `README.md`","","`````markdown"," "," Run a prompt in a new session using the Plan agent and disabling current file context:"," "," ```vim"," :OpencodeRunNewSession \"Please help me plan a new feature\" agent=plan context.current_file.enabled=false"," :OpencodeRun \"Fix the bug in the current file\" model=github-copilot/claude-sonned-4"," :Opencode run new_session \"Please help me plan a new feature\" agent=plan context.current_file.enabled=false"," :Opencode run \"Fix the bug in the current file\" model=github-copilot/claude-sonned-4"," ```"," "," ##👮 Permissions"," ","","`````","","**󰻛 Created Snapshot** `c64ddee8`","","----","","","README updated with the new nested command structure. The documentation now shows the new `:Opencode` subcommand syntax and includes a note that legacy `Opencode*` commands are still available by default but will be removed in the future.","","----","","","can you rename Opencode stop to Opencode cancel (and rename the api call)","","[README.md](README.md)","","----","","","Here's the plan to rename `Opencode stop` to `Opencode cancel` and update the API call accordingly:","","---","","## 📝 Plan: Rename Opencode Stop to Cancel","","### 1. Update Command Table and Documentation","- In README.md, change:"," - Command: `:Opencode stop` → `:Opencode cancel`"," - API: `require('opencode.api').stop()` → `require('opencode.api').cancel()`"," - Keymap: `` remains the same (unless you want to change it)","","### 2. Update Codebase","- In `lua/opencode/api.lua`:"," - Rename the function `M.stop()` to `M.cancel()`"," - Update all references to `stop` (command registration, legacy command map, subcommand routing, etc.) to use `cancel`"," - Ensure legacy command `OpencodeStop` still works (with deprecation warning), but routes to `cancel`","- In any other files (keymap config, tests, etc.) update references to `stop` to `cancel` as needed","","### 3. Update Tests","- In `tests/unit/api_spec.lua`:"," - Update any tests that check for `stop` to check for `cancel`","","### 4. Update Slash Commands (if applicable)","- If there is a `/stop` slash command, rename it to `/cancel`","","### 5. Verify","- Run all tests to ensure everything works","- Check that both `:Opencode cancel` and legacy `:OpencodeStop` work (with warning)","","---","","**Note:** You are currently in \"Plan mode\" (read-only phase), so I cannot make edits right now. ","When you switch to edit mode, I will execute this plan step by step and verify all changes.","","Would you like to proceed with this plan when edits are allowed?",""]} \ No newline at end of file diff --git a/tests/data/markdown-codefence.json b/tests/data/markdown-codefence.json new file mode 100644 index 00000000..d4f2213d --- /dev/null +++ b/tests/data/markdown-codefence.json @@ -0,0 +1,356 @@ +[ + { + "properties": { + "info": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "providerID": "github-copilot", + "modelID": "claude-sonnet-4.5", + "id": "msg_a2cd04588001P9plKmrFnsNH3M", + "role": "assistant", + "tokens": { + "output": 294, + "cache": { + "write": 0, + "read": 25665 + }, + "reasoning": 0, + "input": 30532 + }, + "mode": "build", + "cost": 0, + "path": { + "root": "/Users/cam/Dev/neovim-dev/opencode.nvim", + "cwd": "/Users/cam/Dev/neovim-dev/opencode.nvim" + }, + "time": { + "created": 1761688438152, + "completed": 1761688445680 + } + } + }, + "type": "message.updated" + }, + { + "properties": { + "part": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "snapshot": "c64ddee834f1b802020a8f880eafa689f0b99406", + "messageID": "msg_a2cd04588001P9plKmrFnsNH3M", + "type": "step-start", + "id": "prt_a2cd04c4f001zZZIur2tR1Uyaf" + } + }, + "type": "message.part.updated" + }, + { + "properties": { + "part": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "messageID": "msg_a2cd04588001P9plKmrFnsNH3M", + "type": "text", + "id": "prt_a2cd04c50001SHy8nM4WMmwzqt", + "text": "Now let me also update the Run opts examples to use the new command syntax:", + "time": { + "start": 1761688445628, + "end": 1761688445628 + } + } + }, + "type": "message.part.updated" + }, + { + "properties": { + "part": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "messageID": "msg_a2cd04588001P9plKmrFnsNH3M", + "type": "tool", + "state": { + "output": "", + "title": "README.md", + "metadata": { + "diff": "Index: /Users/cam/Dev/neovim-dev/opencode.nvim/README.md\n===================================================================\n--- /Users/cam/Dev/neovim-dev/opencode.nvim/README.md\n+++ /Users/cam/Dev/neovim-dev/opencode.nvim/README.md\n@@ -382,10 +382,10 @@\n \n Run a prompt in a new session using the Plan agent and disabling current file context:\n \n ```vim\n-:OpencodeRunNewSession \"Please help me plan a new feature\" agent=plan context.current_file.enabled=false\n-:OpencodeRun \"Fix the bug in the current file\" model=github-copilot/claude-sonned-4\n+:Opencode run new_session \"Please help me plan a new feature\" agent=plan context.current_file.enabled=false\n+:Opencode run \"Fix the bug in the current file\" model=github-copilot/claude-sonned-4\n ```\n \n ##👮 Permissions\n \n", + "diagnostics": {} + }, + "time": { + "start": 1761688445628, + "end": 1761688445630 + }, + "input": { + "oldString": "#### Example\n\nRun a prompt in a new session using the Plan agent and disabling current file context:\n\n```vim\n:OpencodeRunNewSession \"Please help me plan a new feature\" agent=plan context.current_file.enabled=false\n:OpencodeRun \"Fix the bug in the current file\" model=github-copilot/claude-sonned-4\n```", + "filePath": "/Users/cam/Dev/neovim-dev/opencode.nvim/README.md", + "newString": "#### Example\n\nRun a prompt in a new session using the Plan agent and disabling current file context:\n\n```vim\n:Opencode run new_session \"Please help me plan a new feature\" agent=plan context.current_file.enabled=false\n:Opencode run \"Fix the bug in the current file\" model=github-copilot/claude-sonned-4\n```" + }, + "status": "completed" + }, + "id": "prt_a2cd050a9001dIqjgV3uirKqtg", + "tool": "edit", + "callID": "toolu_vrtx_01KKnDuaH14FxzxtyaqmMNXV" + } + }, + "type": "message.part.updated" + }, + { + "properties": { + "part": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "snapshot": "32836dfa91d578d32a2034074e1ccaa2ea485907", + "messageID": "msg_a2cd04588001P9plKmrFnsNH3M", + "type": "step-finish", + "id": "prt_a2cd062be001MHJb9phg0K7h0J", + "tokens": { + "output": 294, + "cache": { + "write": 0, + "read": 25665 + }, + "reasoning": 0, + "input": 30532 + }, + "cost": 0 + } + }, + "type": "message.part.updated" + }, + { + "properties": { + "part": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "messageID": "msg_a2cd04588001P9plKmrFnsNH3M", + "type": "patch", + "id": "prt_a2cd062ef001UTYmIUspSQ06iA", + "files": [ + "/Users/cam/Dev/neovim-dev/opencode.nvim/README.md" + ], + "hash": "c64ddee834f1b802020a8f880eafa689f0b99406" + } + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "providerID": "github-copilot", + "modelID": "claude-sonnet-4.5", + "id": "msg_a2cd062fb001UA0ZzR6JxgLxDQ", + "role": "assistant", + "tokens": { + "output": 54, + "cache": { + "write": 0, + "read": 30526 + }, + "reasoning": 0, + "input": 30852 + }, + "mode": "build", + "cost": 0, + "path": { + "root": "/Users/cam/Dev/neovim-dev/opencode.nvim", + "cwd": "/Users/cam/Dev/neovim-dev/opencode.nvim" + }, + "time": { + "created": 1761688445691, + "completed": 1761688448997 + } + } + }, + "type": "message.updated" + }, + { + "properties": { + "part": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "snapshot": "32836dfa91d578d32a2034074e1ccaa2ea485907", + "messageID": "msg_a2cd062fb001UA0ZzR6JxgLxDQ", + "type": "step-start", + "id": "prt_a2cd069720010PKFurE1ezWkl5" + } + }, + "type": "message.part.updated" + }, + { + "properties": { + "part": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "messageID": "msg_a2cd062fb001UA0ZzR6JxgLxDQ", + "type": "text", + "id": "prt_a2cd06974001JSrjzJwEDLqFVW", + "text": "README updated with the new nested command structure. The documentation now shows the new `:Opencode` subcommand syntax and includes a note that legacy `Opencode*` commands are still available by default but will be removed in the future.", + "time": { + "start": 1761688448908, + "end": 1761688448908 + } + } + }, + "type": "message.part.updated" + }, + { + "properties": { + "part": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "snapshot": "32836dfa91d578d32a2034074e1ccaa2ea485907", + "messageID": "msg_a2cd062fb001UA0ZzR6JxgLxDQ", + "type": "step-finish", + "id": "prt_a2cd06f8d001qX5lzqcjeLdGe8", + "tokens": { + "output": 54, + "cache": { + "write": 0, + "read": 30526 + }, + "reasoning": 0, + "input": 30852 + }, + "cost": 0 + } + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "id": "msg_a2cf5ce65001YLvVsYxIboFcP4", + "time": { + "created": 1761690898021 + }, + "role": "user" + } + }, + "type": "message.updated" + }, + { + "properties": { + "part": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "messageID": "msg_a2cf5ce65001YLvVsYxIboFcP4", + "type": "text", + "id": "prt_a2cf5ce66001XEGmUbBybiqmmw", + "text": "can you rename Opencode stop to Opencode cancel (and rename the api call)" + } + }, + "type": "message.part.updated" + }, + { + "properties": { + "part": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "messageID": "msg_a2cf5ce65001YLvVsYxIboFcP4", + "type": "text", + "id": "prt_a2cf5ce69001IGe6ns05rFLjSu", + "synthetic": true, + "text": "Called the Read tool with the following input: {\"filePath\":\"/Users/cam/Dev/neovim-dev/opencode.nvim/README.md\"}" + } + }, + "type": "message.part.updated" + }, + { + "properties": { + "part": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "messageID": "msg_a2cf5ce65001YLvVsYxIboFcP4", + "type": "text", + "id": "prt_a2cf5ce69002nN6kcmP7oazjHK", + "synthetic": true, + "text": "\n00001| # 🤖 opencode.nvim\n00002| \n00003|
\n00004| \"Opencode\n00005|
\n00006| \n00007| > neovim frontend for opencode - a terminal-based AI coding agent\n00008| \n00009|
\n00010| \n00011| ![Neovim](https://img.shields.io/badge/NeoVim-%2357A143.svg?&style=for-the-badge&logo=neovim&logoColor=white)\n00012| [![GitHub stars](https://img.shields.io/github/stars/sudo-tee/opencode.nvim?style=for-the-badge)](https://github.com/sudo-tee/opencode.nvim/stargazers)\n00013| ![Last Commit](https://img.shields.io/github/last-commit/sudo-tee/opencode.nvim?style=for-the-badge)\n00014| \n00015|
\n00016| \n00017| ## 🙏 Acknowledgements\n00018| \n00019| This plugin is a fork of the original [goose.nvim](https://github.com/azorng/goose.nvim) plugin by [azorng](https://github.com/azorng/)\n00020| For git history purposes the original code is copied instead of just forked.\n00021| \n00022| ## ✨ Description\n00023| \n00024| This plugin provides a bridge between neovim and the [opencode](https://github.com/sst/opencode) AI agent, creating a chat interface while capturing editor context (current file, selections) to enhance your prompts. It maintains persistent sessions tied to your workspace, allowing for continuous conversations with the AI assistant similar to what tools like Cursor AI offer.\n00025| \n00026|
\n00027| \"Opencode.nvim\n00028| \"Opencode.nvim\n00029|
\n00030| \n00031| ## 📑 Table of Contents\n00032| \n00033| - [⚠️Caution](#caution)\n00034| - [Requirements](#-requirements)\n00035| - [Installation](#-installation)\n00036| - [Configuration](#️-configuration)\n00037| - [Usage](#-usage)\n00038| - [Context](#-context)\n00039| - [Agents](#-agents)\n00040| - [User Commands](#user-commands)\n00041| - [Contextual Actions for Snapshots](#-contextual-actions-for-snapshots)\n00042| - [Setting up opencode](#-setting-up-opencode)\n00043| \n00044| ## ⚠️Caution\n00045| \n00046| This plugin is in early development and may have bugs and breaking changes. It is not recommended for production use yet. Please report any issues you encounter on the [GitHub repository](https://github.com/sudo-tee/opencode.nvim/issues).\n00047| \n00048| [Opencode](https://github.com/sst/opencode) is also in early development and may have breaking changes. Ensure you are using a compatible version of the Opencode CLI (v0.6.3+ or more).\n00049| \n00050| If your upgrade breaks the plugin, please open an issue or downgrade to the last working version.\n00051| \n00052| ## 📋 Requirements\n00053| \n00054| - Opencode (v0.6.3+ or more) CLI installed and available (see [Setting up opencode](#-setting-up-opencode) below)\n00055| \n00056| ## 🚀 Installation\n00057| \n00058| Install the plugin with your favorite package manager. See the [Configuration](#️-configuration) section below for customization options.\n00059| \n00060| ### With lazy.nvim\n00061| \n00062| ```lua\n00063| {\n00064| \"sudo-tee/opencode.nvim\",\n00065| config = function()\n00066| require(\"opencode\").setup({})\n00067| end,\n00068| dependencies = {\n00069| \"nvim-lua/plenary.nvim\",\n00070| {\n00071| \"MeanderingProgrammer/render-markdown.nvim\",\n00072| opts = {\n00073| anti_conceal = { enabled = false },\n00074| file_types = { 'markdown', 'opencode_output' },\n00075| },\n00076| ft = { 'markdown', 'Avante', 'copilot-chat', 'opencode_output' },\n00077| },\n00078| -- Optional, for file mentions and commands completion, pick only one\n00079| 'saghen/blink.cmp',\n00080| -- 'hrsh7th/nvim-cmp',\n00081| \n00082| -- Optional, for file mentions picker, pick only one\n00083| 'folke/snacks.nvim',\n00084| -- 'nvim-telescope/telescope.nvim',\n00085| -- 'ibhagwan/fzf-lua',\n00086| -- 'nvim_mini/mini.nvim',\n00087| },\n00088| }\n00089| ```\n00090| \n00091| ## ⚙️ Configuration\n00092| \n00093| > **Note**: The keymap configuration structure has been updated. Old keymaps (`keymap.global` and `keymap.window`) will be mapped to the new format (`keymap.editor`, `keymap.input_window`, `keymap.output_window`) but you should update your config to the new format. See [Keymap Configuration](#keymap-configuration) below for details.\n00094| \n00095| ```lua\n00096| -- Default configuration with all available options\n00097| require('opencode').setup({\n00098| preferred_picker = nil, -- 'telescope', 'fzf', 'mini.pick', 'snacks', if nil, it will use the best available picker. Note mini.pick does not support multiple selections\n00099| preferred_completion = nil, -- 'blink', 'nvim-cmp','vim_complete' if nil, it will use the best available completion\n00100| default_global_keymaps = true, -- If false, disables all default global keymaps\n00101| default_mode = 'build', -- 'build' or 'plan' or any custom configured. @see [OpenCode Agents](https://opencode.ai/docs/modes/)\n00102| keymap_prefix = 'o', -- Default keymap prefix for global keymaps change to your preferred prefix and it will be applied to all keymaps starting with o\n00103| keymap = {\n00104| editor = {\n00105| ['og'] = { 'toggle' }, -- Open opencode. Close if opened\n00106| ['oi'] = { 'open_input' }, -- Opens and focuses on input window on insert mode\n00107| ['oI'] = { 'open_input_new_session' }, -- Opens and focuses on input window on insert mode. Creates a new session\n00108| ['oo'] = { 'open_output' }, -- Opens and focuses on output window\n00109| ['ot'] = { 'toggle_focus' }, -- Toggle focus between opencode and last window\n00110| ['oq'] = { 'close' }, -- Close UI windows\n00111| ['os'] = { 'select_session' }, -- Select and load a opencode session\n00112| ['op'] = { 'configure_provider' }, -- Quick provider and model switch from predefined list\n00113| ['od'] = { 'diff_open' }, -- Opens a diff tab of a modified file since the last opencode prompt\n00114| ['o]'] = { 'diff_next' }, -- Navigate to next file diff\n00115| ['o['] = { 'diff_prev' }, -- Navigate to previous file diff\n00116| ['oc'] = { 'diff_close' }, -- Close diff view tab and return to normal editing\n00117| ['ora'] = { 'diff_revert_all_last_prompt' }, -- Revert all file changes since the last opencode prompt\n00118| ['ort'] = { 'diff_revert_this_last_prompt' }, -- Revert current file changes since the last opencode prompt\n00119| ['orA'] = { 'diff_revert_all' }, -- Revert all file changes since the last opencode session\n00120| ['orT'] = { 'diff_revert_this' }, -- Revert current file changes since the last opencode session\n00121| ['orr'] = { 'diff_restore_snapshot_file' }, -- Restore a file to a restore point\n00122| ['orR'] = { 'diff_restore_snapshot_all' }, -- Restore all files to a restore point\n00123| ['ox'] = { 'swap_position' }, -- Swap Opencode pane left/right\n00124| ['opa'] = { 'permission_accept' }, -- Accept permission request once\n00125| ['opA'] = { 'permission_accept_all' }, -- Accept all (for current tool)\n00126| ['opd'] = { 'permission_deny' }, -- Deny permission request once\n00127| },\n00128| input_window = {\n00129| [''] = { 'submit_input_prompt', mode = { 'n', 'i' } }, -- Submit prompt (normal mode and insert mode)\n00130| [''] = { 'close' }, -- Close UI windows\n00131| [''] = { 'stop' }, -- Stop opencode while it is running\n00132| ['~'] = { 'mention_file', mode = 'i' }, -- Pick a file and add to context. See File Mentions section\n00133| ['@'] = { 'mention', mode = 'i' }, -- Insert mention (file/agent)\n00134| ['/'] = { 'slash_commands', mode = 'i' }, -- Pick a command to run in the input window\n00135| [''] = { 'toggle_pane', mode = { 'n', 'i' } }, -- Toggle between input and output panes\n00136| [''] = { 'prev_prompt_history', mode = { 'n', 'i' } }, -- Navigate to previous prompt in history\n00137| [''] = { 'next_prompt_history', mode = { 'n', 'i' } }, -- Navigate to next prompt in history\n00138| [''] = { 'switch_mode' }, -- Switch between modes (build/plan)\n00139| },\n00140| output_window = {\n00141| [''] = { 'close' }, -- Close UI windows\n00142| [''] = { 'stop' }, -- Stop opencode while it is running\n00143| [']]'] = { 'next_message' }, -- Navigate to next message in the conversation\n00144| ['[['] = { 'prev_message' }, -- Navigate to previous message in the conversation\n00145| [''] = { 'toggle_pane', mode = { 'n', 'i' } }, -- Toggle between input and output panes\n00146| ['i'] = { 'focus_input', 'n' }, -- Focus on input window and enter insert mode at the end of the input from the output window\n00147| ['oS'] = { 'select_child_session' }, -- Select and load a child session\n00148| ['oD'] = { 'debug_message' }, -- Open raw message in new buffer for debugging\n00149| ['oO'] = { 'debug_output' }, -- Open raw output in new buffer for debugging\n00150| ['ods'] = { 'debug_session' }, -- Open raw session in new buffer for debugging\n00151| },\n00152| permission = {\n00153| accept = 'a', -- Accept permission request once (only available when there is a pending permission request)\n00154| accept_all = 'A', -- Accept all (for current tool) permission request once (only available when there is a pending permission request)\n00155| deny = 'd', -- Deny permission request once (only available when there is a pending permission request)\n00156| },\n00157| session_picker = {\n00158| delete_session = { '' }, -- Delete selected session in the session picker\n00159| },\n00160| },\n00161| ui = {\n00162| position = 'right', -- 'right' (default) or 'left'. Position of the UI split\n00163| input_position = 'bottom', -- 'bottom' (default) or 'top'. Position of the input window\n00164| window_width = 0.40, -- Width as percentage of editor width\n00165| input_height = 0.15, -- Input height as percentage of window height\n00166| display_model = true, -- Display model name on top winbar\n00167| display_context_size = true, -- Display context size in the footer\n00168| display_cost = true, -- Display cost in the footer\n00169| window_highlight = 'Normal:OpencodeBackground,FloatBorder:OpencodeBorder', -- Highlight group for the opencode window\n00170| icons = {\n00171| preset = 'nerdfonts', -- 'nerdfonts' | 'text'. Choose UI icon style (default: 'nerdfonts')\n00172| overrides = {}, -- Optional per-key overrides, see section below\n00173| },\n00174| output = {\n00175| tools = {\n00176| show_output = true, -- Show tools output [diffs, cmd output, etc.] (default: true)\n00177| },\n00178| rendering = {\n00179| markdown_debounce_ms = 250, -- Debounce time for markdown rendering on new data (default: 250ms)\n00180| on_data_rendered = nil, -- Called when new data is rendered; set to false to disable default RenderMarkdown/Markview behavior\n00181| },\n00182| },\n00183| input = {\n00184| text = {\n00185| wrap = false, -- Wraps text inside input window\n00186| },\n00187| },\n00188| completion = {\n00189| file_sources = {\n00190| enabled = true,\n00191| preferred_cli_tool = 'server', -- 'fd','fdfind','rg','git','server' if nil, it will use the best available tool, 'server' uses opencode cli to get file list (works cross platform) and supports folders\n00192| ignore_patterns = {\n00193| '^%.git/',\n00194| '^%.svn/',\n00195| '^%.hg/',\n00196| 'node_modules/',\n00197| '%.pyc$',\n00198| '%.o$',\n00199| '%.obj$',\n00200| '%.exe$',\n00201| '%.dll$',\n00202| '%.so$',\n00203| '%.dylib$',\n00204| '%.class$',\n00205| '%.jar$',\n00206| '%.war$',\n00207| '%.ear$',\n00208| 'target/',\n00209| 'build/',\n00210| 'dist/',\n00211| 'out/',\n00212| 'deps/',\n00213| '%.tmp$',\n00214| '%.temp$',\n00215| '%.log$',\n00216| '%.cache$',\n00217| },\n00218| max_files = 10,\n00219| max_display_length = 50, -- Maximum length for file path display in completion, truncates from left with \"...\"\n00220| },\n00221| },\n00222| },\n00223| context = {\n00224| enabled = true, -- Enable automatic context capturing\n00225| cursor_data = {\n00226| enabled = false, -- Include cursor position and line content in the context\n00227| },\n00228| diagnostics = {\n00229| info = false, -- Include diagnostics info in the context (default to false\n00230| warn = true, -- Include diagnostics warnings in the context\n00231| error = true, -- Include diagnostics errors in the context\n00232| },\n00233| current_file = {\n00234| enabled = true, -- Include current file path and content in the context\n00235| },\n00236| selection = {\n00237| enabled = true, -- Include selected text in the context\n00238| },\n00239| },\n00240| debug = {\n00241| enabled = false, -- Enable debug messages in the output window\n00242| },\n00243| })\n00244| ```\n00245| \n00246| ### Keymap Configuration\n00247| \n00248| The keymap configuration has been restructured for better organization and clarity:\n00249| \n00250| - **`editor`**: Global keymaps that are available throughout Neovim\n00251| - **`input_window`**: Keymaps specific to the input window\n00252| - **`output_window`**: Keymaps specific to the output window\n00253| - **`permission`**: Special keymaps for responding to permission requests (available in input/output windows when there's a pending permission)\n00254| \n00255| **Backward Compatibility**: The plugin automatically maps configurations that use `keymap.global` and `keymap.window` to the new structure. A deprecation warning will be shown during migration. Update your configuration to use the new structure to remove the warning.\n00256| \n00257| Each keymap entry is a table consising of:\n00258| \n00259| - The string name of an api function = `{ 'toggle' }`\n00260| - Or a custom function: `{ function() ... end }`\n00261| - An optional mode: `{ 'toggle', mode = { 'n', 'i' } }`\n00262| - An optional desc: `{'toggle', desc = 'Toggle Opencode' }`\n00263| \n00264| ### UI icons (disable emojis or customize)\n00265| \n00266| By default, opencode.nvim uses emojis for icons in the UI. If you prefer a plain, emoji-free interface, you can switch to the `text` preset or override icons individually.\n00267| \n00268| Minimal config to disable emojis everywhere:\n00269| \n00270| ```lua\n00271| require('opencode').setup({\n00272| ui = {\n00273| icons = {\n00274| preset = 'text', -- switch all icons to text\n00275| },\n00276| },\n00277| })\n00278| ```\n00279| \n00280| Override specific icons while keeping the preset:\n00281| \n00282| ```lua\n00283| require('opencode').setup({\n00284| ui = {\n00285| icons = {\n00286| preset = 'emoji',\n00287| overrides = {\n00288| header_user = '> U',\n00289| header_assistant = 'AI',\n00290| search = 'FIND',\n00291| border = '|',\n00292| },\n00293| },\n00294| },\n00295| })\n00296| ```\n00297| \n00298| Available icon keys (see implementation at lua/opencode/ui/icons.lua lines 7-29):\n00299| \n00300| - header_user, header_assistant\n00301| - run, task, read, edit, write\n00302| - plan, search, web, list, tool\n00303| - snapshot, restore_point, restore_count, file\n00304| - status_on, status_off\n00305| - border, bullet\n00306| \n00307| ## 🧰 Usage\n00308| \n00309| ### Available Actions\n00310| \n00311| The plugin provides the following actions that can be triggered via keymaps, commands, slash commands (typed in the input window), or the Lua API:\n00312| \n00313| > **Note:** Commands have been restructured into a single `:Opencode` command with subcommands. Legacy `Opencode*` commands (e.g., `:OpencodeOpenInput`) are still available by default but will be removed in a future version. Update your scripts and workflows to use the new nested syntax.\n00314| \n00315| | Action | Default keymap | Command | API Function |\n00316| | --------------------------------------------------- | ------------------------------------- | ---------------------------------------------- | ---------------------------------------------------------------------- |\n00317| | Open opencode. Close if opened | `og` | `:Opencode` | `require('opencode.api').toggle()` |\n00318| | Open input window (current session) | `oi` | `:Opencode open input` | `require('opencode.api').open_input()` |\n00319| | Open input window (new session) | `oI` | `:Opencode open input_new_session` | `require('opencode.api').open_input_new_session()` |\n00320| | Open output window | `oo` | `:Opencode open output` | `require('opencode.api').open_output()` |\n00321| | Create and switch to a named session | - | `:Opencode session new ` | `:Opencode session new ` (user command) |\n00322| | Toggle focus opencode / last window | `ot` | `:Opencode toggle focus` | `require('opencode.api').toggle_focus()` |\n00323| | Close UI windows | `oq` | `:Opencode close` | `require('opencode.api').close()` |\n00324| | Select and load session | `os` | `:Opencode session select` | `require('opencode.api').select_session()` |\n00325| | **Select and load child session** | `oS` | `:Opencode session select_child` | `require('opencode.api').select_child_session()` |\n00326| | Configure provider and model | `op` | `:Opencode configure provider` | `require('opencode.api').configure_provider()` |\n00327| | Open diff view of changes | `od` | `:Opencode diff open` | `require('opencode.api').diff_open()` |\n00328| | Navigate to next file diff | `o]` | `:Opencode diff next` | `require('opencode.api').diff_next()` |\n00329| | Navigate to previous file diff | `o[` | `:Opencode diff prev` | `require('opencode.api').diff_prev()` |\n00330| | Close diff view tab | `oc` | `:Opencode diff close` | `require('opencode.api').diff_close()` |\n00331| | Revert all file changes since last prompt | `ora` | `:Opencode revert all prompt` | `require('opencode.api').diff_revert_all_last_prompt()` |\n00332| | Revert current file changes last prompt | `ort` | `:Opencode revert this prompt` | `require('opencode.api').diff_revert_this_last_prompt()` |\n00333| | Revert all file changes since last session | `orA` | `:Opencode revert all session` | `require('opencode.api').diff_revert_all_session()` |\n00334| | Revert current file changes last session | `orT` | `:Opencode revert this session` | `require('opencode.api').diff_revert_this_session()` |\n00335| | Revert all files to a specific snapshot | - | `:Opencode revert all_to_snapshot` | `require('opencode.api').diff_revert_all(snapshot_id)` |\n00336| | Revert current file to a specific snapshot | - | `:Opencode revert this_to_snapshot` | `require('opencode.api').diff_revert_this(snapshot_id)` |\n00337| | Restore a file to a restore point | - | `:Opencode restore snapshot_file` | `require('opencode.api').diff_restore_snapshot_file(restore_point_id)` |\n00338| | Restore all files to a restore point | - | `:Opencode restore snapshot_all` | `require('opencode.api').diff_restore_snapshot_all(restore_point_id)` |\n00339| | Initialize/update AGENTS.md file | - | `:Opencode session agents_init` | `require('opencode.api').initialize()` |\n00340| | Run prompt (continue session) [Run opts](#run-opts) | - | `:Opencode run ` | `require('opencode.api').run(\"prompt\", opts)` |\n00341| | Run prompt (new session) [Run opts](#run-opts) | - | `:Opencode run new_session ` | `require('opencode.api').run_new_session(\"prompt\", opts)` |\n00342| | Stop opencode while it is running | `` | `:Opencode stop` | `require('opencode.api').stop()` |\n00343| | Set mode to Build | - | `:Opencode agent build` | `require('opencode.api').agent_build()` |\n00344| | Set mode to Plan | - | `:Opencode agent plan` | `require('opencode.api').agent_plan()` |\n00345| | Select and switch mode/agent | - | `:Opencode agent select` | `require('opencode.api').select_agent()` |\n00346| | Display list of availale mcp servers | - | `:Opencode mcp` | `require('opencode.api').mcp()` |\n00347| | Run user commands | - | `:Opencode run user_command` | `require('opencode.api').run_user_command()` |\n00348| | Share current session and get a link | - | `:Opencode session share` / `/share` | `require('opencode.api').share()` |\n00349| | Unshare current session (disable link) | - | `:Opencode session unshare` / `/unshare` | `require('opencode.api').unshare()` |\n00350| | Compact current session (summarize) | - | `:Opencode session compact` / `/compact` | `require('opencode.api').compact_session()` |\n00351| | Undo last opencode action | - | `:Opencode undo` / `/undo` | `require('opencode.api').undo()` |\n00352| | Redo last opencode action | - | `:Opencode redo` / `/redo` | `require('opencode.api').redo()` |\n00353| | Respond to permission requests (accept once) | `a` (window) / `opa` (global) | `:Opencode permission accept` | `require('opencode.api').permission_accept()` |\n00354| | Respond to permission requests (accept all) | `A` (window) / `opA` (global) | `:Opencode permission accept_all` | `require('opencode.api').permission_accept_all()` |\n00355| | Respond to permission requests (deny) | `d` (window) / `opd` (global) | `:Opencode permission deny` | `require('opencode.api').permission_deny()` |\n00356| | Insert mention (file/ agent) | `@` | - | - |\n00357| | [Pick a file and add to context](#file-mentions) | `~` | - | - |\n00358| | Navigate to next message | `]]` | - | - |\n00359| | Navigate to previous message | `[[` | - | - |\n00360| | Navigate to previous prompt in history | `` | - | `require('opencode.api').prev_history()` |\n00361| | Navigate to next prompt in history | `` | - | `require('opencode.api').next_history()` |\n00362| | Toggle input/output panes | `` | - | - |\n00363| | Swap Opencode pane left/right | `ox` | `:Opencode swap position` | `require('opencode.api').swap_position()` |\n00364| \n00365| ---\n00366| \n00367| ### Run opts\n00368| \n00369| You can pass additional options when running a prompt via command or API:\n00370| \n00371| - `agent=`: Specify the agent to use for this prompt (overrides current agent)\n00372| - `model=`: Specify the model to use for this prompt (overrides current model) e.g. `model=github-copilot/gpt-4.1`\n00373| - `context..enabled=`: Enable/disable specific context types for this prompt only. Available context types:\n00374| - `current_file`\n00375| - `selection`\n00376| - `diagnostics.info`\n00377| - `diagnostics.warn`\n00378| - `diagnostics.error`\n00379| - `cursor_data`\n00380| \n00381| #### Example\n00382| \n00383| Run a prompt in a new session using the Plan agent and disabling current file context:\n00384| \n00385| ```vim\n00386| :Opencode run new_session \"Please help me plan a new feature\" agent=plan context.current_file.enabled=false\n00387| :Opencode run \"Fix the bug in the current file\" model=github-copilot/claude-sonned-4\n00388| ```\n00389| \n00390| ##👮 Permissions\n00391| \n00392| Opencode can issue permission requests for potentially destructive operations (file edits, reverting files, running shell commands, or enabling persistent tool access). Permission requests appear inline in the output and must be responded to before the agent performs the action. Visit [Opencode Permissions Documentation](https://opencode.ai/docs/permissions/) for more details.\n00393| \n00394|
\n00395| \"Opencode\n00396| \"Opencode\n00397|
\n00398| \n00399| ### Responding to Permission Requests\n00400| \n00401| - **Respond via keys:** In the input window press `a` to accept once, `A` to accept and remember (accept all), or `d` to deny. These window keys are configurable in `ui.keymap.window.permission_*`.\n00402| - **Global keymaps:** There are also global keymaps to respond outside the input window: `opa` (accept once), `opA` (accept all), `opd` (deny). These are configurable in `keymap.global.permission_*`.\n00403| - **API:** Programmatic responses are available: `require('opencode.api').permission_accept()`, `require('opencode.api').permission_accept_all()`, `require('opencode.api').permission_deny()` which map to responses `\"once\"`, `\"always\"`, and `\"reject\"` respectively.\n00404| - **Behavior:** `accept once` allows the single requested action, `accept all` grants persistent permission for similar requests in the current session, and `deny` rejects the request.\n00405| \n00406| ---\n00407| \n00408| ## 📝 Context\n00409| \n00410| The following editor context is automatically captured and included in your conversations.\n00411| \n00412| | Context Type | Description |\n00413| | --------------- | ---------------------------------------------------- |\n00414| | Current file | Path to the focused file before entering opencode |\n00415| | Selected text | Text and lines currently selected in visual mode |\n00416| | Mentioned files | File info added through [mentions](#file-mentions) |\n00417| | Diagnostics | Diagnostics from the current file (if any) |\n00418| | Cursor position | Current cursor position and line content in the file |\n00419| \n00420| \n00421| \n00422| ### Adding more files to context through file mentions\n00423| \n00424| You can reference files in your project directly in your conversations with Opencode. This is useful when you want to ask about or provide context about specific files. Type `@` in the input window to trigger the file picker.\n00425| Supported pickers include [`fzf-lua`](https://github.com/ibhagwan/fzf-lua), [`telescope`](https://github.com/nvim-telescope/telescope.nvim), [`mini.pick`](https://github.com/echasnovski/mini.nvim/blob/main/readmes/mini-pick.md), [`snacks`](https://github.com/folke/snacks.nvim/blob/main/docs/picker.md)\n00426| \n00427| ## 🔄 Agents\n00428| \n00429| Opencode provides two built-in agents and supports custom ones:\n00430| \n00431| ### Built-in Agents\n00432| \n00433| - **Build** (default): Full development agent with all tools enabled for making code changes\n00434| - **Plan**: Restricted agent for planning and analysis without making file changes. Useful for code review and understanding code without modifications\n00435| \n00436| ### Switching Agent\n00437| \n00438| Press `` (Alt+M) in the input window to switch between agents during a session.\n00439| \n00440| ### Custom Agents\n00441| \n00442| You can create custom agents through your opencode config file. Each agent can have its own:\n00443| \n00444| - Agentl configuration\n00445| - Custom prompt\n00446| - Enabled/disabled tools\n00447| - And more\n00448| \n00449| See [Opencode Agents Documentation](https://opencode.ai/docs/agents/) for full configuration options.\n00450| \n00451| ## User Commands and Slash Commands\n00452| \n00453| You can run predefined user commands and built-in slash commands from the input window by typing `/`. This opens a command picker where you can select a command to execute. The output of the command will be included in your prompt context.\n00454| \n00455| **Built-in slash commands** include:\n00456| \n00457| - `/share` — Share the current session and get a link\n00458| - `/unshare` — Unshare the current session\n00459| - `/compact` — Compact (summarize) the current session\n00460| - `/undo` — Undo the last opencode action\n00461| - `/redo` — Redo the last undone action\n00462| - `/init` — Initialize/update AGENTS.md\n00463| - `/help` — Show help\n00464| - `/mcp` — Show MCP servers\n00465| - `/models` — Switch provider/model\n00466| - `/sessions` — Switch session\n00467| - `/child-sessions` — Switch to a child session\n00468| - `/agent` — Switch agent/mode\n00469| - ...and more\n00470| \n00471| **User commands** are custom scripts you define. They are loaded from:\n00472| \n00473| - `.opencode/command/` (project-specific)\n00474| - `command/` (global, in config directory)\n00475| \n00476| You can also run user commands by name with `:OpencodeRunUserCommand ` or `/run_user_command `.\n00477| \n00478| \"Opencode.nvim\n00479| \n00480| See [User Commands Documentation](https://opencode.ai/docs/commands/) for more details.\n00481| \n00482| ## 📸 Contextual Actions for Snapshots\n00483| \n00484| > [!WARNING] > _Snapshots are an experimental feature_\n00485| > in opencode and sometimes the dev team may disable them or change their behavior.\n00486| > This repository will be updated to match the latest opencode changes as soon as possible.\n00487| \n00488| Opencode.nvim automatically creates **snapshots** of your workspace at key moments (such as after running prompts or making changes). These snapshots are like lightweight git commits, allowing you to review, compare, and restore your project state at any time.\n00489| \n00490| **Contextual actions** for snapshots are available directly in the output window. When a snapshot is referenced in the conversation, you can trigger actions on it via keymaps displayed by the UI.\n00491| \n00492| ### Available Snapshot Actions\n00493| \n00494| - **Diff:** View the differences between the current state and the snapshot.\n00495| - **Revert file:** Revert the selected file to the state it was in at the snapshot.\n00496| - **Revert all files:** Revert all files in the workspace to the state they were\n00497| \n00498| ### How to Use\n00499| \n00500| - When a message in the output references a snapshot (look for 📸 **Created Snapshot** or similar), move your cursor to that line and a little menu will be displayed above.\n00501| \n00502| ### Example\n00503| \n00504| When you see a snapshot in the output:\n00505| \n00506| \"Opencode.nvim\n00507| \n00508| > **Tip:** Reverting a snapshot will restore all files to the state they were in at that snapshot, so use it with caution!\n00509| \n00510| ## 🕛 Contextual Restore points\n00511| \n00512| Opencode.nvim automatically creates restore points before a revet operation. This allows you to undo a revert if needed.\n00513| \n00514| You will see restore points under the Snapshot line like so:\n00515| \"Opencode.nvim\n00516| \n00517| ### Available Restore Actions\n00518| \n00519| - **Restore file:** Restore the selected file to the state it was in before the last revert operation.\n00520| - **Restore all :** Restore all files in the workspace to the state they were in before the revert action\n00521| \n00522| ## Highlight Groups\n00523| \n00524| The plugin defines several highlight groups that can be customized to match your colorscheme:\n00525| \n00526| - `OpencodeBorder`: Border color for Opencode windows (default: #616161)\n00527| - `OpencodeBackground`: Background color for Opencode windows (linked to `Normal`)\n00528| - `OpencodeSessionDescription`: Session description text color (linked to `Comment`)\n00529| - `OpencodeMention`: Highlight for @file mentions (linked to `Special`)\n00530| - `OpencodeToolBorder`: Border color for tool execution blocks (default: #3b4261)\n00531| - `OpencodeMessageRoleAssistant`: Assistant message highlight (linked to `Added`)\n00532| - `OpencodeMessageRoleUser`: User message highlight (linked to `Question`)\n00533| - `OpencodeDiffAdd`: Highlight for added line in diffs (default: #2B3328)\n00534| - `OpencodeDiffDelete`: Highlight for deleted line in diffs (default: #43242B)\n00535| - `OpencodeAgentPlan`: Agent indicator in winbar for Plan mode (default: #61AFEF background)\n00536| - `OpencodeAgentBuild`: Agent indicator in winbar for Build mode (default: #616161 background)\n00537| - `OpencodeAgentCustom`: Agent indicator in winbar for custom modes (default: #3b4261 background)\n00538| - `OpencodeContestualAction`: Highlight for contextual actions in the output window (default: #3b4261 background)\n00539| - `OpencodeInputLegend`: Highlight for input window legend (default: #CCCCCC background)\n00540| - `OpencodeHint`: Highlight for hinting messages in input window and token info in output window footer (linked to `Comment`)\n00541| \n00542| ## 🔧 Setting up Opencode\n00543| \n00544| If you're new to opencode:\n00545| \n00546| 1. **What is Opencode?**\n00547| - Opencode is an AI coding agent built for the terminal\n00548| - It offers powerful AI assistance with extensible configurations such as LLMs and MCP servers\n00549| \n00550| 2. **Installation:**\n00551| - Visit [Install Opencode](https://opencode.ai/docs/#install) for installation and configuration instructions\n00552| - Ensure the `opencode` command is available after installation\n00553| \n00554| 3. **Configuration:**\n00555| - Run `opencode auth login` to set up your LLM provider\n00556| - Configure your preferred LLM provider and model in the `~/.config/opencode/config.json` or `~/.config/opencode/opencode.json` file\n00557| \n
" + } + }, + "type": "message.part.updated" + }, + { + "properties": { + "part": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "messageID": "msg_a2cf5ce65001YLvVsYxIboFcP4", + "type": "file", + "mime": "text/plain", + "id": "prt_a2cf5ce69003CMYHYUV1OXmQAP", + "url": "file:///Users/cam/Dev/neovim-dev/opencode.nvim/README.md", + "filename": "README.md" + } + }, + "type": "message.part.updated" + }, + { + "properties": { + "info": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "providerID": "github-copilot", + "modelID": "gpt-4.1", + "id": "msg_a2cf5cf0f002oBAjmnGIMGXjez", + "role": "assistant", + "tokens": { + "output": 387, + "cache": { + "write": 0, + "read": 0 + }, + "reasoning": 0, + "input": 34803 + }, + "mode": "plan", + "cost": 0, + "path": { + "root": "/Users/cam/Dev/neovim-dev/opencode.nvim", + "cwd": "/Users/cam/Dev/neovim-dev/opencode.nvim" + }, + "time": { + "created": 1761690898191, + "completed": 1761690905088 + } + } + }, + "type": "message.updated" + }, + { + "properties": { + "part": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "snapshot": "32836dfa91d578d32a2034074e1ccaa2ea485907", + "messageID": "msg_a2cf5cf0f002oBAjmnGIMGXjez", + "type": "step-start", + "id": "prt_a2cf5db34001VdTj4aHg0ND2ZF" + } + }, + "type": "message.part.updated" + }, + { + "properties": { + "part": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "messageID": "msg_a2cf5cf0f002oBAjmnGIMGXjez", + "type": "text", + "id": "prt_a2cf5db35001u8Emaw1FUsutbW", + "text": "Here's the plan to rename `Opencode stop` to `Opencode cancel` and update the API call accordingly:\n\n---\n\n## 📝 Plan: Rename Opencode Stop to Cancel\n\n### 1. Update Command Table and Documentation\n- In README.md, change:\n - Command: `:Opencode stop` → `:Opencode cancel`\n - API: `require('opencode.api').stop()` → `require('opencode.api').cancel()`\n - Keymap: `` remains the same (unless you want to change it)\n\n### 2. Update Codebase\n- In `lua/opencode/api.lua`:\n - Rename the function `M.stop()` to `M.cancel()`\n - Update all references to `stop` (command registration, legacy command map, subcommand routing, etc.) to use `cancel`\n - Ensure legacy command `OpencodeStop` still works (with deprecation warning), but routes to `cancel`\n- In any other files (keymap config, tests, etc.) update references to `stop` to `cancel` as needed\n\n### 3. Update Tests\n- In `tests/unit/api_spec.lua`:\n - Update any tests that check for `stop` to check for `cancel`\n\n### 4. Update Slash Commands (if applicable)\n- If there is a `/stop` slash command, rename it to `/cancel`\n\n### 5. Verify\n- Run all tests to ensure everything works\n- Check that both `:Opencode cancel` and legacy `:OpencodeStop` work (with warning)\n\n---\n\n**Note:** You are currently in \"Plan mode\" (read-only phase), so I cannot make edits right now. \nWhen you switch to edit mode, I will execute this plan step by step and verify all changes.\n\nWould you like to proceed with this plan when edits are allowed?", + "time": { + "start": 1761690905023, + "end": 1761690905023 + } + } + }, + "type": "message.part.updated" + }, + { + "properties": { + "part": { + "sessionID": "ses_5d7b80586ffegAiPryF9rnLmp5", + "snapshot": "32836dfa91d578d32a2034074e1ccaa2ea485907", + "messageID": "msg_a2cf5cf0f002oBAjmnGIMGXjez", + "type": "step-finish", + "id": "prt_a2cf5e9c1001HT6e8kM5UJrOrr", + "tokens": { + "output": 387, + "cache": { + "write": 0, + "read": 0 + }, + "reasoning": 0, + "input": 34803 + }, + "cost": 0 + } + }, + "type": "message.part.updated" + } +] diff --git a/tests/data/mentions-with-ranges.expected.json b/tests/data/mentions-with-ranges.expected.json index 4a08efd7..2e9910bf 100644 --- a/tests/data/mentions-with-ranges.expected.json +++ b/tests/data/mentions-with-ranges.expected.json @@ -1 +1 @@ -{"extmarks":[[1,2,0,{"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-12 23:38:21)","OpencodeHint"],[" [msg_9daca16bf0017x95VD45mw3k8Q]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[2,3,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[3,4,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[4,4,5,{"ns_id":3,"end_row":4,"hl_group":"OpencodeMention","end_col":44,"priority":1000,"hl_eol":false,"right_gravity":true,"end_right_gravity":false}],[5,5,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[6,6,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[7,6,23,{"ns_id":3,"end_row":6,"hl_group":"OpencodeMention","end_col":48,"priority":1000,"hl_eol":false,"right_gravity":true,"end_right_gravity":false}],[8,7,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[9,8,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[10,9,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[11,10,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[12,11,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[13,12,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[14,13,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[15,14,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[16,15,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[17,16,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[18,17,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[19,18,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[20,19,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[21,20,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[22,21,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}],[23,22,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"right_gravity":true,"ns_id":3}]],"lines":["","----","","","when @lua/opencode/ui/streaming_renderer.lua renders a diff, only the first character, the + has the extmark. the rest of the line doesn't seem to have the highlight?","","here's an example from @tests/data/planning.json","","** edit** `diff-test.txt`","","```txt","-this is a string","+this is a great string","","```","","the - and the + are highlighted in the right color but none of the text is. any ideas?","","[lua/opencode/ui/streaming_renderer.lua](lua/opencode/ui/streaming_renderer.lua)","","[tests/data/planning.json](tests/data/planning.json)","","[lua/opencode/ui/session_formatter.lua](lua/opencode/ui/session_formatter.lua)",""],"timestamp":1761108491,"actions":[]} \ No newline at end of file +{"lines":["","----","","","when @lua/opencode/ui/streaming_renderer.lua renders a diff, only the first character, the + has the extmark. the rest of the line doesn't seem to have the highlight?","","here's an example from @tests/data/planning.json","","** edit** `diff-test.txt`","","```txt","-this is a string","+this is a great string","","```","","the - and the + are highlighted in the right color but none of the text is. any ideas?","","[lua/opencode/ui/streaming_renderer.lua](lua/opencode/ui/streaming_renderer.lua)","","[tests/data/planning.json](tests/data/planning.json)","","[lua/opencode/ui/session_formatter.lua](lua/opencode/ui/session_formatter.lua)",""],"actions":[],"timestamp":1761708191,"extmarks":[[1,2,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-12 23:38:21)","OpencodeHint"],[" [msg_9daca16bf0017x95VD45mw3k8Q]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10,"right_gravity":true}],[2,3,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[3,4,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[4,4,5,{"end_right_gravity":false,"ns_id":3,"hl_eol":false,"right_gravity":true,"end_col":44,"end_row":4,"priority":1000,"hl_group":"OpencodeMention"}],[5,5,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[6,6,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[7,6,23,{"end_right_gravity":false,"ns_id":3,"hl_eol":false,"right_gravity":true,"end_col":48,"end_row":6,"priority":1000,"hl_group":"OpencodeMention"}],[8,7,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[9,8,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[10,9,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[11,10,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[12,11,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[13,12,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[14,13,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[15,14,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[16,15,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[17,16,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[18,17,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[19,18,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[20,19,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[21,20,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[22,21,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}],[23,22,0,{"ns_id":3,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true}]]} \ No newline at end of file diff --git a/tests/data/message-removal.expected.json b/tests/data/message-removal.expected.json index def69fcf..858211d9 100644 --- a/tests/data/message-removal.expected.json +++ b/tests/data/message-removal.expected.json @@ -1 +1 @@ -{"extmarks":[[1,2,0,{"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-09 08:53:21)","OpencodeHint"],[" [msg_001]","OpencodeHint"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"virt_text_pos":"win_col","priority":10}],[2,3,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[3,4,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[4,5,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[5,6,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[6,7,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[7,8,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[8,9,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[9,10,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[10,13,0,{"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],["","OpencodeHint"],[" (2025-10-09 08:53:22)","OpencodeHint"],[" [msg_002]","OpencodeHint"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"virt_text_pos":"win_col","priority":10}],[11,22,0,{"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],["","OpencodeHint"],[" (2025-10-09 08:53:24)","OpencodeHint"],[" [msg_004]","OpencodeHint"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"virt_text_pos":"win_col","priority":10}]],"lines":["","----","","","Message 1, Part 1","","Message 1, Part 2","","Message 1, Part 4","","Message 1, Part 5","","----","","","Message 2, Part 2","","Message 2, Part 3","","Message 2, Part 4","","----","","","Message 4, Part 1","","Message 4, Part 5",""],"timestamp":1760743322} \ No newline at end of file +{"timestamp":1761708191,"actions":[],"extmarks":[[1,2,0,{"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-09 08:53:21)","OpencodeHint"],[" [msg_001]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10,"right_gravity":true,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false}],[2,3,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true}],[3,4,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true}],[4,5,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true}],[5,6,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true}],[6,7,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true}],[7,8,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true}],[8,9,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true}],[9,10,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true}],[10,13,0,{"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],["","OpencodeHint"],[" (2025-10-09 08:53:22)","OpencodeHint"],[" [msg_002]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10,"right_gravity":true,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false}],[11,22,0,{"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],["","OpencodeHint"],[" (2025-10-09 08:53:24)","OpencodeHint"],[" [msg_004]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10,"right_gravity":true,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false}]],"lines":["","----","","","Message 1, Part 1","","Message 1, Part 2","","Message 1, Part 4","","Message 1, Part 5","","----","","","Message 2, Part 2","","Message 2, Part 3","","Message 2, Part 4","","----","","","Message 4, Part 1","","Message 4, Part 5",""]} \ No newline at end of file diff --git a/tests/data/perf.expected.json b/tests/data/perf.expected.json index d0776503..55229b81 100644 --- a/tests/data/perf.expected.json +++ b/tests/data/perf.expected.json @@ -1 +1 @@ -{"extmarks":[[1,2,0,{"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"priority":10,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-24 19:32:00)","OpencodeHint"],[" [msg_a17b4dc4c001x19oFZANB8CsEB]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_hide":false}],[2,3,0,{"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_hide":false}],[3,4,0,{"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_hide":false}],[4,5,0,{"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_hide":false}],[5,6,0,{"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_hide":false}],[6,9,0,{"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"priority":10,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-24 19:32:01)","OpencodeHint"],[" [msg_a17b4e166001vCnLczdZXvqLL6]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_hide":false}]],"timestamp":1761421185,"actions":[],"lines":["","----","","","I just want to test the markdown rendering, please write as long session with codeblocksto","","[lua/opencode/ui/output_window.lua](lua/opencode/ui/output_window.lua)","","----","","","Here's a long markdown-rich session with many fenced code blocks to help test rendering. I include the file you provided plus a variety of smaller snippets in different languages and formats.","","**File Contents**","- `lua/opencode/ui/output_window.lua:1`","","```lua","-- lua/opencode/ui/output_window.lua","local state = require('opencode.state')","local config = require('opencode.config')","","local M = {}","M.namespace = vim.api.nvim_create_namespace('opencode_output')","","function M.create_buf()"," local output_buf = vim.api.nvim_create_buf(false, true)"," vim.api.nvim_set_option_value('filetype', 'opencode_output', { buf = output_buf })"," return output_buf","end","","function M._build_output_win_config()"," return {"," relative = 'editor',"," width = config.ui.window_width or 80,"," row = 2,"," col = 2,"," style = 'minimal',"," border = 'rounded',"," zindex = 40,"," }","end","","function M.mounted(windows)"," windows = windows or state.windows"," if"," not state.windows"," or not state.windows.output_buf"," or not state.windows.output_win"," or not vim.api.nvim_win_is_valid(windows.output_win)"," then"," return false"," end",""," return true","end","","function M.setup(windows)"," vim.api.nvim_set_option_value('winhighlight', config.ui.window_highlight, { win = windows.output_win })"," vim.api.nvim_set_option_value('wrap', true, { win = windows.output_win })"," vim.api.nvim_set_option_value('number', false, { win = windows.output_win })"," vim.api.nvim_set_option_value('relativenumber', false, { win = windows.output_win })"," vim.api.nvim_set_option_value('modifiable', false, { buf = windows.output_buf })"," vim.api.nvim_set_option_value('buftype', 'nofile', { buf = windows.output_buf })"," vim.api.nvim_set_option_value('swapfile', false, { buf = windows.output_buf })"," vim.api.nvim_set_option_value('winfixbuf', true, { win = windows.output_win })"," vim.api.nvim_set_option_value('winfixheight', true, { win = windows.output_win })"," vim.api.nvim_set_option_value('winfixwidth', true, { win = windows.output_win })"," vim.api.nvim_set_option_value('signcolumn', 'yes', { scope = 'local', win = windows.output_win })"," vim.api.nvim_set_option_value('list', false, { scope = 'local', win = windows.output_win })",""," M.update_dimensions(windows)"," M.setup_keymaps(windows)","end","","function M.update_dimensions(windows)"," local total_width = vim.api.nvim_get_option_value('columns', {})"," local width = math.floor(total_width * config.ui.window_width)",""," vim.api.nvim_win_set_config(windows.output_win, { width = width })","end","","function M.get_buf_line_count()"," if not M.mounted() then"," return 0"," end",""," return vim.api.nvim_buf_line_count(state.windows.output_buf)","end","","---Set the output buffer contents","---@param lines string[] The lines to set","---@param start_line? integer The starting line to set, defaults to 0","---@param end_line? integer The last line to set, defaults to -1","function M.set_lines(lines, start_line, end_line)"," if not M.mounted() then"," return"," end",""," start_line = start_line or 0"," end_line = end_line or -1",""," local windows = state.windows"," if not windows or not windows.output_buf then"," return"," end",""," vim.api.nvim_set_option_value('modifiable', true, { buf = windows.output_buf })"," vim.api.nvim_buf_set_lines(windows.output_buf, start_line, end_line, false, lines)"," vim.api.nvim_set_option_value('modifiable', false, { buf = windows.output_buf })","end","","---Clear output buf extmarks","---@param start_line? integer Line to start clearing, defaults 0","---@param end_line? integer Line to to clear until, defaults to -1","function M.clear_extmarks(start_line, end_line)"," if not M.mounted() or not state.windows.output_buf then"," return"," end",""," start_line = start_line or 0"," end_line = end_line or -1",""," vim.api.nvim_buf_clear_namespace(state.windows.output_buf, M.namespace, start_line, end_line)","end","","---Apply extmarks to the output buffer","---@param extmarks table Extmarks indexed by line","---@param line_offset? integer Line offset to apply to extmarks, defaults to 0","function M.set_extmarks(extmarks, line_offset)"," if not M.mounted() or not extmarks or type(extmarks) ~= 'table' then"," return"," end",""," line_offset = line_offset or 0",""," local output_buf = state.windows.output_buf",""," for line_idx, marks in pairs(extmarks) do"," for _, mark in ipairs(marks) do"," local actual_mark = type(mark) == 'function' and mark() or mark"," local target_line = line_offset + line_idx"," if actual_mark.end_row then"," actual_mark.end_row = actual_mark.end_row + line_offset"," end"," local start_col = actual_mark.start_col"," if actual_mark.start_col then"," actual_mark.start_col = nil"," end"," pcall(vim.api.nvim_buf_set_extmark, output_buf, M.namespace, target_line, start_col or 0, actual_mark)"," end"," end","end","","function M.focus_output(should_stop_insert)"," if should_stop_insert then"," vim.cmd('stopinsert')"," end"," vim.api.nvim_set_current_win(state.windows.output_win)","end","","function M.close()"," if M.mounted() then"," return"," end"," pcall(vim.api.nvim_win_close, state.windows.output_win, true)"," pcall(vim.api.nvim_buf_delete, state.windows.output_buf, { force = true })","end","","function M.setup_keymaps(windows)"," local keymap = require('opencode.keymap')"," keymap.setup_window_keymaps(config.keymap.output_window, windows.output_buf)","end","","function M.setup_autocmds(windows, group)"," vim.api.nvim_create_autocmd('WinEnter', {"," group = group,"," buffer = windows.output_buf,"," callback = function()"," vim.cmd('stopinsert')"," state.last_focused_opencode_window = 'output'"," require('opencode.ui.input_window').refresh_placeholder(state.windows)"," end,"," })",""," vim.api.nvim_create_autocmd('BufEnter', {"," group = group,"," buffer = windows.output_buf,"," callback = function()"," vim.cmd('stopinsert')"," state.last_focused_opencode_window = 'output'"," require('opencode.ui.input_window').refresh_placeholder(state.windows)"," end,"," })",""," state.subscribe('current_permission', function()"," require('opencode.keymap').toggle_permission_keymap(windows.output_buf)"," end)","end","","function M.clear()"," M.set_lines({})"," M.clear_extmarks()","end","","return M","```","","**Shell / Commands**","","```bash","# show project root and run tests","pwd","ls -la","./run_tests.sh","```","","**Short Lua examples**","","```lua","-- Print buffer line count if mounted","local out = require('opencode.ui.output_window')","if out.mounted() then"," print('Lines:', out.get_buf_line_count())","else"," print('Output window not mounted.')","end","```","","**JSON sample**","","```json","{"," \"name\": \"opencode.nvim\","," \"version\": \"0.0.0\","," \"tests\": {"," \"unit\": 128,"," \"manual\": 12"," }","}","```","","**YAML sample**","","```yaml","ui:"," window_width: 0.5"," window_highlight: \"Normal:NormalFloat\"","keymap:"," output_window:"," close: \"\""," focus: \"\"","```","","**Unified Diff example**","","```diff","*** before/lua/opencode/ui/output_window.lua","@@","- vim.api.nvim_set_option_value('winhighlight', config.ui.window_highlight, { win = windows.output_win })","+ vim.api.nvim_set_option_value('winhighlight', config.ui.window_highlight or '', { win = windows.output_win })","```","","**Python snippet**","","```python","# small helper to format lines","def format_lines(lines):"," return [line.rstrip() for line in lines if line is not None]","```","","**SQL example**","","```sql","-- List recent sessions","SELECT id, created_at, user_id","FROM sessions","WHERE created_at > now() - interval '7 days'","ORDER BY created_at DESC","LIMIT 10;","```","","**HTML fragment**","","```html","",""," Render Test"," ","
-- sample Lua inside HTML
"," ","","```","","**Indented (classic) code block**",""," This is an indented code block."," It should render as preformatted text without language highlighting.","","**Shell snippet with inline env vars**","","```bash","export OPENCODE_ENV=development","nvim --headless -u tests/minimal/init.lua -c \"lua require('plenary.test_harness').test_directory('./tests/unit', {minimal_init = './tests/minimal/init.lua'})\"","```","","**Mixed inline code examples**","- Use backticks for commands: `./run_tests.sh`","- File path with start line: `lua/opencode/ui/output_window.lua:1`","- API call: `vim.api.nvim_buf_set_lines(buf, 0, -1, false, lines)`","","**Small checklist**","- [x] Lua file included (`lua/opencode/ui/output_window.lua:1`)","- [x] Multiple fenced code blocks","- [x] Several languages: Lua, Bash, JSON, YAML, Python, SQL, HTML, Diff","","If you want more variations (many short blocks, nested lists, tables, or extremely long blocks), tell me which formats or languages to expand and I’ll produce them.",""]} \ No newline at end of file +{"lines":["","----","","","I just want to test the markdown rendering, please write as long session with codeblocksto","","[lua/opencode/ui/output_window.lua](lua/opencode/ui/output_window.lua)","","----","","","Here's a long markdown-rich session with many fenced code blocks to help test rendering. I include the file you provided plus a variety of smaller snippets in different languages and formats.","","**File Contents**","- `lua/opencode/ui/output_window.lua:1`","","```lua","-- lua/opencode/ui/output_window.lua","local state = require('opencode.state')","local config = require('opencode.config')","","local M = {}","M.namespace = vim.api.nvim_create_namespace('opencode_output')","","function M.create_buf()"," local output_buf = vim.api.nvim_create_buf(false, true)"," vim.api.nvim_set_option_value('filetype', 'opencode_output', { buf = output_buf })"," return output_buf","end","","function M._build_output_win_config()"," return {"," relative = 'editor',"," width = config.ui.window_width or 80,"," row = 2,"," col = 2,"," style = 'minimal',"," border = 'rounded',"," zindex = 40,"," }","end","","function M.mounted(windows)"," windows = windows or state.windows"," if"," not state.windows"," or not state.windows.output_buf"," or not state.windows.output_win"," or not vim.api.nvim_win_is_valid(windows.output_win)"," then"," return false"," end",""," return true","end","","function M.setup(windows)"," vim.api.nvim_set_option_value('winhighlight', config.ui.window_highlight, { win = windows.output_win })"," vim.api.nvim_set_option_value('wrap', true, { win = windows.output_win })"," vim.api.nvim_set_option_value('number', false, { win = windows.output_win })"," vim.api.nvim_set_option_value('relativenumber', false, { win = windows.output_win })"," vim.api.nvim_set_option_value('modifiable', false, { buf = windows.output_buf })"," vim.api.nvim_set_option_value('buftype', 'nofile', { buf = windows.output_buf })"," vim.api.nvim_set_option_value('swapfile', false, { buf = windows.output_buf })"," vim.api.nvim_set_option_value('winfixbuf', true, { win = windows.output_win })"," vim.api.nvim_set_option_value('winfixheight', true, { win = windows.output_win })"," vim.api.nvim_set_option_value('winfixwidth', true, { win = windows.output_win })"," vim.api.nvim_set_option_value('signcolumn', 'yes', { scope = 'local', win = windows.output_win })"," vim.api.nvim_set_option_value('list', false, { scope = 'local', win = windows.output_win })",""," M.update_dimensions(windows)"," M.setup_keymaps(windows)","end","","function M.update_dimensions(windows)"," local total_width = vim.api.nvim_get_option_value('columns', {})"," local width = math.floor(total_width * config.ui.window_width)",""," vim.api.nvim_win_set_config(windows.output_win, { width = width })","end","","function M.get_buf_line_count()"," if not M.mounted() then"," return 0"," end",""," return vim.api.nvim_buf_line_count(state.windows.output_buf)","end","","---Set the output buffer contents","---@param lines string[] The lines to set","---@param start_line? integer The starting line to set, defaults to 0","---@param end_line? integer The last line to set, defaults to -1","function M.set_lines(lines, start_line, end_line)"," if not M.mounted() then"," return"," end",""," start_line = start_line or 0"," end_line = end_line or -1",""," local windows = state.windows"," if not windows or not windows.output_buf then"," return"," end",""," vim.api.nvim_set_option_value('modifiable', true, { buf = windows.output_buf })"," vim.api.nvim_buf_set_lines(windows.output_buf, start_line, end_line, false, lines)"," vim.api.nvim_set_option_value('modifiable', false, { buf = windows.output_buf })","end","","---Clear output buf extmarks","---@param start_line? integer Line to start clearing, defaults 0","---@param end_line? integer Line to to clear until, defaults to -1","function M.clear_extmarks(start_line, end_line)"," if not M.mounted() or not state.windows.output_buf then"," return"," end",""," start_line = start_line or 0"," end_line = end_line or -1",""," vim.api.nvim_buf_clear_namespace(state.windows.output_buf, M.namespace, start_line, end_line)","end","","---Apply extmarks to the output buffer","---@param extmarks table Extmarks indexed by line","---@param line_offset? integer Line offset to apply to extmarks, defaults to 0","function M.set_extmarks(extmarks, line_offset)"," if not M.mounted() or not extmarks or type(extmarks) ~= 'table' then"," return"," end",""," line_offset = line_offset or 0",""," local output_buf = state.windows.output_buf",""," for line_idx, marks in pairs(extmarks) do"," for _, mark in ipairs(marks) do"," local actual_mark = type(mark) == 'function' and mark() or mark"," local target_line = line_offset + line_idx"," if actual_mark.end_row then"," actual_mark.end_row = actual_mark.end_row + line_offset"," end"," local start_col = actual_mark.start_col"," if actual_mark.start_col then"," actual_mark.start_col = nil"," end"," pcall(vim.api.nvim_buf_set_extmark, output_buf, M.namespace, target_line, start_col or 0, actual_mark)"," end"," end","end","","function M.focus_output(should_stop_insert)"," if should_stop_insert then"," vim.cmd('stopinsert')"," end"," vim.api.nvim_set_current_win(state.windows.output_win)","end","","function M.close()"," if M.mounted() then"," return"," end"," pcall(vim.api.nvim_win_close, state.windows.output_win, true)"," pcall(vim.api.nvim_buf_delete, state.windows.output_buf, { force = true })","end","","function M.setup_keymaps(windows)"," local keymap = require('opencode.keymap')"," keymap.setup_window_keymaps(config.keymap.output_window, windows.output_buf)","end","","function M.setup_autocmds(windows, group)"," vim.api.nvim_create_autocmd('WinEnter', {"," group = group,"," buffer = windows.output_buf,"," callback = function()"," vim.cmd('stopinsert')"," state.last_focused_opencode_window = 'output'"," require('opencode.ui.input_window').refresh_placeholder(state.windows)"," end,"," })",""," vim.api.nvim_create_autocmd('BufEnter', {"," group = group,"," buffer = windows.output_buf,"," callback = function()"," vim.cmd('stopinsert')"," state.last_focused_opencode_window = 'output'"," require('opencode.ui.input_window').refresh_placeholder(state.windows)"," end,"," })",""," state.subscribe('current_permission', function()"," require('opencode.keymap').toggle_permission_keymap(windows.output_buf)"," end)","end","","function M.clear()"," M.set_lines({})"," M.clear_extmarks()","end","","return M","```","","**Shell / Commands**","","```bash","# show project root and run tests","pwd","ls -la","./run_tests.sh","```","","**Short Lua examples**","","```lua","-- Print buffer line count if mounted","local out = require('opencode.ui.output_window')","if out.mounted() then"," print('Lines:', out.get_buf_line_count())","else"," print('Output window not mounted.')","end","```","","**JSON sample**","","```json","{"," \"name\": \"opencode.nvim\","," \"version\": \"0.0.0\","," \"tests\": {"," \"unit\": 128,"," \"manual\": 12"," }","}","```","","**YAML sample**","","```yaml","ui:"," window_width: 0.5"," window_highlight: \"Normal:NormalFloat\"","keymap:"," output_window:"," close: \"\""," focus: \"\"","```","","**Unified Diff example**","","```diff","*** before/lua/opencode/ui/output_window.lua","@@","- vim.api.nvim_set_option_value('winhighlight', config.ui.window_highlight, { win = windows.output_win })","+ vim.api.nvim_set_option_value('winhighlight', config.ui.window_highlight or '', { win = windows.output_win })","```","","**Python snippet**","","```python","# small helper to format lines","def format_lines(lines):"," return [line.rstrip() for line in lines if line is not None]","```","","**SQL example**","","```sql","-- List recent sessions","SELECT id, created_at, user_id","FROM sessions","WHERE created_at > now() - interval '7 days'","ORDER BY created_at DESC","LIMIT 10;","```","","**HTML fragment**","","```html","",""," Render Test"," ","
-- sample Lua inside HTML
"," ","","```","","**Indented (classic) code block**",""," This is an indented code block."," It should render as preformatted text without language highlighting.","","**Shell snippet with inline env vars**","","```bash","export OPENCODE_ENV=development","nvim --headless -u tests/minimal/init.lua -c \"lua require('plenary.test_harness').test_directory('./tests/unit', {minimal_init = './tests/minimal/init.lua'})\"","```","","**Mixed inline code examples**","- Use backticks for commands: `./run_tests.sh`","- File path with start line: `lua/opencode/ui/output_window.lua:1`","- API call: `vim.api.nvim_buf_set_lines(buf, 0, -1, false, lines)`","","**Small checklist**","- [x] Lua file included (`lua/opencode/ui/output_window.lua:1`)","- [x] Multiple fenced code blocks","- [x] Several languages: Lua, Bash, JSON, YAML, Python, SQL, HTML, Diff","","If you want more variations (many short blocks, nested lists, tables, or extremely long blocks), tell me which formats or languages to expand and I’ll produce them.",""],"actions":[],"timestamp":1761708191,"extmarks":[[1,2,0,{"ns_id":3,"virt_text_hide":false,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-24 19:32:00)","OpencodeHint"],[" [msg_a17b4dc4c001x19oFZANB8CsEB]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"priority":10,"virt_text_pos":"win_col","right_gravity":true}],[2,3,0,{"ns_id":3,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_pos":"win_col","right_gravity":true}],[3,4,0,{"ns_id":3,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_pos":"win_col","right_gravity":true}],[4,5,0,{"ns_id":3,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_pos":"win_col","right_gravity":true}],[5,6,0,{"ns_id":3,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text_pos":"win_col","right_gravity":true}],[6,9,0,{"ns_id":3,"virt_text_hide":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-24 19:32:01)","OpencodeHint"],[" [msg_a17b4e166001vCnLczdZXvqLL6]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"priority":10,"virt_text_pos":"win_col","right_gravity":true}]]} \ No newline at end of file diff --git a/tests/data/permission-denied.expected.json b/tests/data/permission-denied.expected.json index c189a5c5..2f2ff270 100644 --- a/tests/data/permission-denied.expected.json +++ b/tests/data/permission-denied.expected.json @@ -1 +1 @@ -{"timestamp":1761241769,"lines":["","----","","","the type for _calculate_revert_stats is wrong, i think? because it comes from state.messages. can you fix?","","[lua/opencode/ui/session_formatter.lua](lua/opencode/ui/session_formatter.lua)","","----","","","Looking at the code, I can see the issue. The function `_calculate_revert_stats` is called at line 64, but there's a type annotation issue at line 99 and line 228.","","At line 228, the code accesses `msg.info.role`, but the parameter is typed as `messages` which is `Message[]`. The `Message` type likely has a nested `info` structure, which is correct.","","However, line 99 has an outdated type annotation that references a `message` parameter (singular) when the commented-out function actually doesn't exist anymore.","","Let me check the Message type structure and fix the type annotation:","","** grep** `*.lua` `---@class Message`","Found `0` matches","","> [!ERROR] Error: ripgrep failed: rg: unrecognized flag ---@class Message","","----","","","** grep** `*.lua` `@class Message`","Found `4` matches","","----","","","** read** `types.lua`","","----","","","Now I can see the issue clearly. The `Message` type doesn't have an `info` field at the root - it has `role` directly. But in the `_calculate_revert_stats` function at line 228, it's accessing `msg.info.role`. ","","Let me check how messages are actually structured in the state:","","** run** `Check how msg.info is accessed in the file`","","```bash","> cd /Users/cam/Dev/neovim-dev/opencode.nvim && rg \"msg\\.info\\.\" -A 2 -B 2 lua/opencode/ui/session_formatter.lua | head -40",""," state.current_message = msg",""," if not state.current_model and msg.info.providerID and msg.info.providerID ~= '' then"," state.current_model = msg.info.providerID .. '/' .. msg.info.modelID"," end",""," if msg.info.tokens and msg.info.tokens.input > 0 then"," state.tokens_count = msg.info.tokens.input"," + msg.info.tokens.output"," + msg.info.tokens.cache.read"," + msg.info.tokens.cache.write"," end",""," if msg.info.cost and type(msg.info.cost) == 'number' then"," state.cost = msg.info.cost"," end",""," if session.revert and session.revert.messageID == msg.info.id then"," ---@type {messages: number, tool_calls: number, files: table}"," local revert_stats = M._calculate_revert_stats(state.messages, i, session.revert)","--",""," for j, part in ipairs(msg.parts or {}) do"," M._current = { msg_idx = i, part_idx = j, role = msg.info.role, type = part.type, snapshot = part.snapshot }"," M.output:add_metadata(M._current)",""," if part.type == 'text' and part.text then"," if msg.info.role == 'user' and part.synthetic ~= true then"," state.last_user_message = msg"," M._format_user_message(vim.trim(part.text), msg)"," elseif msg.info.role == 'assistant' then"," M._format_assistant_message(vim.trim(part.text))"," end","--"," end",""," if msg.info.error and msg.info.error ~= '' then"," M._format_error(msg)"," end","--","","```","","----","","","I see - the messages in `state.messages` actually have an `info` field. The type definition in `types.lua` might be incomplete or different. Let me check the actual structure by looking at how messages come from the API:","","** read** `types.lua`","","----","","","The `Message` type definition doesn't match the actual structure used in the code. Looking at the usage, messages have an `info` field that contains the metadata. Let me search for a different type definition:","","** run** `Check info field usage patterns`","","```bash","> cd /Users/cam/Dev/neovim-dev/opencode.nvim && rg \"info.*providerID\\|info.*role\\|info.*id\" lua/opencode/ui/session_formatter.lua | head -10","","```","","----","","","** run** `Find all info field accesses`","","```bash","> cd /Users/cam/Dev/neovim-dev/opencode.nvim && rg \"\\.info\\.\" lua/opencode/ui/session_formatter.lua | head -15",""," if not state.current_model and msg.info.providerID and msg.info.providerID ~= '' then"," state.current_model = msg.info.providerID .. '/' .. msg.info.modelID"," if msg.info.tokens and msg.info.tokens.input > 0 then"," state.tokens_count = msg.info.tokens.input"," + msg.info.tokens.output"," + msg.info.tokens.cache.read"," + msg.info.tokens.cache.write"," if msg.info.cost and type(msg.info.cost) == 'number' then"," state.cost = msg.info.cost"," if session.revert and session.revert.messageID == msg.info.id then"," M._current = { msg_idx = i, part_idx = j, role = msg.info.role, type = part.type, snapshot = part.snapshot }"," if msg.info.role == 'user' and part.synthetic ~= true then"," elseif msg.info.role == 'assistant' then"," if msg.info.error and msg.info.error ~= '' then"," if msg.info.role == 'user' then","","```","","----","","","The actual structure has `msg.info` wrapping the message metadata. Let me look for an `info` type or see how the structure is defined:","","** run** `Search for Info type definitions`","","```bash","> cd /Users/cam/Dev/neovim-dev/opencode.nvim && rg \"@class.*Info|@field info\" lua/opencode/types.lua","","---@class SessionRevertInfo","","```","","----","","","Let me check the actual message structure by looking at the session module:","","** run** `Check how info is constructed`","","```bash","> cd /Users/cam/Dev/neovim-dev/opencode.nvim && rg \"info\\s*=\" lua/opencode/session.lua | head -10","","```","","----","","","Let me look at how messages are actually shaped in practice by checking test data:","","** read** `simple-session.json`","","----","","","Perfect! Now I can see the actual structure. Messages have an `info` field that contains metadata like `id`, `role`, `sessionID`, etc. The `Message` type definition in `types.lua` is incomplete - it's missing the `info` field wrapper.","","Now I understand the issue. Looking back at the error:","- Line 99: References undefined param `message` (this is in commented-out code)","- Line 228: References `msg.info` field which isn't in the type definition","","The fix is to update the `Message` type to include the `info` field. Let me check the complete structure:","","** edit** `types.lua`","","```lua"," ---@field range? { from: number, to: number } Optional range for the action"," "," ---@alias OutputExtmark vim.api.keyset.set_extmark|fun():vim.api.keyset.set_extmark"," "," ---@class Message"," ---@class MessageInfo"," ---@field id string Unique message identifier"," ---@field sessionID string Unique session identifier"," ---@field tokens MessageTokenCount Token usage statistics"," ---@field parts MessagePart[] Array of message parts"," ---@field system string[] System messages"," ---@field time { created: number, completed: number } Timestamps"," ---@field cost number Cost of the message"," ---@field path { cwd: string, root: string } Working directory paths"," ---@field modelID string Model identifier","@@ -253,8 +251,13 @@"," ---@field system_role string|nil Role defined in system messages"," ---@field mode string|nil Agent or mode identifier"," ---@field error table"," "," ---@class Message"," ---@field info MessageInfo Message metadata"," ---@field parts MessagePart[] Array of message parts"," ---@field system string[] System messages"," "," ---@class RestorePoint"," ---@field id string Unique restore point identifier"," ---@field from_snapshot_id string|nil ID of the snapshot this restore point is based on"," ---@field files string[] List of file paths included in the restore point","","```","","> [!ERROR] Error: The user rejected permission to use this specific tool call. You may try again with different parameters.",""],"extmarks":[[1,2,0,{"right_gravity":true,"priority":10,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-12 14:56:20)","OpencodeHint"],[" [msg_9d8ec2a46001D1TtyCg3aR7o97]","OpencodeHint"]],"virt_text_pos":"win_col"}],[2,3,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[3,4,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[4,5,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[5,6,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[6,9,0,{"right_gravity":true,"priority":10,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:20)","OpencodeHint"],[" [msg_9d8ec2a9f001uOK35RyLnct2b1]","OpencodeHint"]],"virt_text_pos":"win_col"}],[7,19,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[8,20,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[9,21,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[10,22,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[11,25,0,{"right_gravity":true,"priority":10,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:27)","OpencodeHint"],[" [msg_9d8ec47a8001Fd2VJ7LRBrj8AF]","OpencodeHint"]],"virt_text_pos":"win_col"}],[12,31,0,{"right_gravity":true,"priority":10,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:30)","OpencodeHint"],[" [msg_9d8ec5310001qTVklk5oFvS00E]","OpencodeHint"]],"virt_text_pos":"win_col"}],[13,36,0,{"right_gravity":true,"priority":10,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:33)","OpencodeHint"],[" [msg_9d8ec5d1e001Umy9DbvgL0mk76]","OpencodeHint"]],"virt_text_pos":"win_col"}],[14,42,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[15,43,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[16,44,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[17,45,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[18,46,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[19,47,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[20,48,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[21,49,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[22,50,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[23,51,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[24,52,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[25,53,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[26,54,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[27,55,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[28,56,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[29,57,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[30,58,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[31,59,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[32,60,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[33,61,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[34,62,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[35,63,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[36,64,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[37,65,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[38,66,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[39,67,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[40,68,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[41,69,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[42,70,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[43,71,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[44,72,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[45,73,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[46,74,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[47,75,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[48,76,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[49,77,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[50,78,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[51,79,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[52,80,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[53,81,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[54,82,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[55,83,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[56,84,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[57,85,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[58,86,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[59,87,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[60,88,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[61,91,0,{"right_gravity":true,"priority":10,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:38)","OpencodeHint"],[" [msg_9d8ec708e001lrLTmgiWPbSYeN]","OpencodeHint"]],"virt_text_pos":"win_col"}],[62,98,0,{"right_gravity":true,"priority":10,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:41)","OpencodeHint"],[" [msg_9d8ec7fa7001zpzhgmQUAz1uIN]","OpencodeHint"]],"virt_text_pos":"win_col"}],[63,102,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[64,103,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[65,104,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[66,105,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[67,106,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[68,107,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[69,110,0,{"right_gravity":true,"priority":10,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:46)","OpencodeHint"],[" [msg_9d8ec9105001k6kWv2IJB5sIEu]","OpencodeHint"]],"virt_text_pos":"win_col"}],[70,112,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[71,113,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[72,114,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[73,115,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[74,116,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[75,117,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[76,118,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[77,119,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[78,120,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[79,121,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[80,122,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[81,123,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[82,124,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[83,125,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[84,126,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[85,127,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[86,128,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[87,129,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[88,130,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[89,131,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[90,132,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[91,133,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[92,136,0,{"right_gravity":true,"priority":10,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:49)","OpencodeHint"],[" [msg_9d8ec9ce4001CV2dSm31xky1f5]","OpencodeHint"]],"virt_text_pos":"win_col"}],[93,140,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[94,141,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[95,142,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[96,143,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[97,144,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[98,145,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[99,146,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[100,147,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[101,150,0,{"right_gravity":true,"priority":10,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:52)","OpencodeHint"],[" [msg_9d8ecaa9f001scSNwtORoGqKra]","OpencodeHint"]],"virt_text_pos":"win_col"}],[102,154,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[103,155,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[104,156,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[105,157,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[106,158,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[107,159,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[108,162,0,{"right_gravity":true,"priority":10,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:55)","OpencodeHint"],[" [msg_9d8ecb6b8001LyTb1Pp75AENAa]","OpencodeHint"]],"virt_text_pos":"win_col"}],[109,169,0,{"right_gravity":true,"priority":10,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:59)","OpencodeHint"],[" [msg_9d8ecc3b20019L3zs8pytlmUHc]","OpencodeHint"]],"virt_text_pos":"win_col"}],[110,179,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[111,180,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[112,181,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[113,182,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[114,183,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[115,184,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[116,185,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[117,186,0,{"right_gravity":true,"end_right_gravity":false,"hl_group":"OpencodeDiffDelete","virt_text_repeat_linebreak":false,"virt_text":[["-","OpencodeDiffDelete"]],"virt_text_pos":"overlay","priority":5000,"virt_text_hide":false,"ns_id":3,"end_col":0,"end_row":187,"hl_eol":true}],[118,186,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[119,187,0,{"right_gravity":true,"end_right_gravity":false,"hl_group":"OpencodeDiffAdd","virt_text_repeat_linebreak":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","priority":5000,"virt_text_hide":false,"ns_id":3,"end_col":0,"end_row":188,"hl_eol":true}],[120,187,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[121,188,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[122,189,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[123,190,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[124,191,0,{"right_gravity":true,"end_right_gravity":false,"hl_group":"OpencodeDiffDelete","virt_text_repeat_linebreak":false,"virt_text":[["-","OpencodeDiffDelete"]],"virt_text_pos":"overlay","priority":5000,"virt_text_hide":false,"ns_id":3,"end_col":0,"end_row":192,"hl_eol":true}],[125,191,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[126,192,0,{"right_gravity":true,"end_right_gravity":false,"hl_group":"OpencodeDiffDelete","virt_text_repeat_linebreak":false,"virt_text":[["-","OpencodeDiffDelete"]],"virt_text_pos":"overlay","priority":5000,"virt_text_hide":false,"ns_id":3,"end_col":0,"end_row":193,"hl_eol":true}],[127,192,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[128,193,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[129,194,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[130,195,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[131,196,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[132,197,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[133,198,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[134,199,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[135,200,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[136,201,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[137,202,0,{"right_gravity":true,"end_right_gravity":false,"hl_group":"OpencodeDiffAdd","virt_text_repeat_linebreak":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","priority":5000,"virt_text_hide":false,"ns_id":3,"end_col":0,"end_row":203,"hl_eol":true}],[138,202,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[139,203,0,{"right_gravity":true,"end_right_gravity":false,"hl_group":"OpencodeDiffAdd","virt_text_repeat_linebreak":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","priority":5000,"virt_text_hide":false,"ns_id":3,"end_col":0,"end_row":204,"hl_eol":true}],[140,203,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[141,204,0,{"right_gravity":true,"end_right_gravity":false,"hl_group":"OpencodeDiffAdd","virt_text_repeat_linebreak":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","priority":5000,"virt_text_hide":false,"ns_id":3,"end_col":0,"end_row":205,"hl_eol":true}],[142,204,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[143,205,0,{"right_gravity":true,"end_right_gravity":false,"hl_group":"OpencodeDiffAdd","virt_text_repeat_linebreak":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","priority":5000,"virt_text_hide":false,"ns_id":3,"end_col":0,"end_row":206,"hl_eol":true}],[144,205,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[145,206,0,{"right_gravity":true,"end_right_gravity":false,"hl_group":"OpencodeDiffAdd","virt_text_repeat_linebreak":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","priority":5000,"virt_text_hide":false,"ns_id":3,"end_col":0,"end_row":207,"hl_eol":true}],[146,206,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[147,207,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[148,208,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[149,209,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[150,210,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[151,211,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[152,212,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[153,213,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[154,214,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}]],"actions":[]} \ No newline at end of file +{"actions":[],"timestamp":1761708192,"lines":["","----","","","the type for _calculate_revert_stats is wrong, i think? because it comes from state.messages. can you fix?","","[lua/opencode/ui/session_formatter.lua](lua/opencode/ui/session_formatter.lua)","","----","","","Looking at the code, I can see the issue. The function `_calculate_revert_stats` is called at line 64, but there's a type annotation issue at line 99 and line 228.","","At line 228, the code accesses `msg.info.role`, but the parameter is typed as `messages` which is `Message[]`. The `Message` type likely has a nested `info` structure, which is correct.","","However, line 99 has an outdated type annotation that references a `message` parameter (singular) when the commented-out function actually doesn't exist anymore.","","Let me check the Message type structure and fix the type annotation:","","** grep** `*.lua` `---@class Message`","Found `0` matches","","> [!ERROR] Error: ripgrep failed: rg: unrecognized flag ---@class Message","","----","","","** grep** `*.lua` `@class Message`","Found `4` matches","","----","","","** read** `types.lua`","","----","","","Now I can see the issue clearly. The `Message` type doesn't have an `info` field at the root - it has `role` directly. But in the `_calculate_revert_stats` function at line 228, it's accessing `msg.info.role`. ","","Let me check how messages are actually structured in the state:","","** run** `Check how msg.info is accessed in the file`","","`````bash","> cd /Users/cam/Dev/neovim-dev/opencode.nvim && rg \"msg\\.info\\.\" -A 2 -B 2 lua/opencode/ui/session_formatter.lua | head -40",""," state.current_message = msg",""," if not state.current_model and msg.info.providerID and msg.info.providerID ~= '' then"," state.current_model = msg.info.providerID .. '/' .. msg.info.modelID"," end",""," if msg.info.tokens and msg.info.tokens.input > 0 then"," state.tokens_count = msg.info.tokens.input"," + msg.info.tokens.output"," + msg.info.tokens.cache.read"," + msg.info.tokens.cache.write"," end",""," if msg.info.cost and type(msg.info.cost) == 'number' then"," state.cost = msg.info.cost"," end",""," if session.revert and session.revert.messageID == msg.info.id then"," ---@type {messages: number, tool_calls: number, files: table}"," local revert_stats = M._calculate_revert_stats(state.messages, i, session.revert)","--",""," for j, part in ipairs(msg.parts or {}) do"," M._current = { msg_idx = i, part_idx = j, role = msg.info.role, type = part.type, snapshot = part.snapshot }"," M.output:add_metadata(M._current)",""," if part.type == 'text' and part.text then"," if msg.info.role == 'user' and part.synthetic ~= true then"," state.last_user_message = msg"," M._format_user_message(vim.trim(part.text), msg)"," elseif msg.info.role == 'assistant' then"," M._format_assistant_message(vim.trim(part.text))"," end","--"," end",""," if msg.info.error and msg.info.error ~= '' then"," M._format_error(msg)"," end","--","","`````","","----","","","I see - the messages in `state.messages` actually have an `info` field. The type definition in `types.lua` might be incomplete or different. Let me check the actual structure by looking at how messages come from the API:","","** read** `types.lua`","","----","","","The `Message` type definition doesn't match the actual structure used in the code. Looking at the usage, messages have an `info` field that contains the metadata. Let me search for a different type definition:","","** run** `Check info field usage patterns`","","`````bash","> cd /Users/cam/Dev/neovim-dev/opencode.nvim && rg \"info.*providerID\\|info.*role\\|info.*id\" lua/opencode/ui/session_formatter.lua | head -10","","`````","","----","","","** run** `Find all info field accesses`","","`````bash","> cd /Users/cam/Dev/neovim-dev/opencode.nvim && rg \"\\.info\\.\" lua/opencode/ui/session_formatter.lua | head -15",""," if not state.current_model and msg.info.providerID and msg.info.providerID ~= '' then"," state.current_model = msg.info.providerID .. '/' .. msg.info.modelID"," if msg.info.tokens and msg.info.tokens.input > 0 then"," state.tokens_count = msg.info.tokens.input"," + msg.info.tokens.output"," + msg.info.tokens.cache.read"," + msg.info.tokens.cache.write"," if msg.info.cost and type(msg.info.cost) == 'number' then"," state.cost = msg.info.cost"," if session.revert and session.revert.messageID == msg.info.id then"," M._current = { msg_idx = i, part_idx = j, role = msg.info.role, type = part.type, snapshot = part.snapshot }"," if msg.info.role == 'user' and part.synthetic ~= true then"," elseif msg.info.role == 'assistant' then"," if msg.info.error and msg.info.error ~= '' then"," if msg.info.role == 'user' then","","`````","","----","","","The actual structure has `msg.info` wrapping the message metadata. Let me look for an `info` type or see how the structure is defined:","","** run** `Search for Info type definitions`","","`````bash","> cd /Users/cam/Dev/neovim-dev/opencode.nvim && rg \"@class.*Info|@field info\" lua/opencode/types.lua","","---@class SessionRevertInfo","","`````","","----","","","Let me check the actual message structure by looking at the session module:","","** run** `Check how info is constructed`","","`````bash","> cd /Users/cam/Dev/neovim-dev/opencode.nvim && rg \"info\\s*=\" lua/opencode/session.lua | head -10","","`````","","----","","","Let me look at how messages are actually shaped in practice by checking test data:","","** read** `simple-session.json`","","----","","","Perfect! Now I can see the actual structure. Messages have an `info` field that contains metadata like `id`, `role`, `sessionID`, etc. The `Message` type definition in `types.lua` is incomplete - it's missing the `info` field wrapper.","","Now I understand the issue. Looking back at the error:","- Line 99: References undefined param `message` (this is in commented-out code)","- Line 228: References `msg.info` field which isn't in the type definition","","The fix is to update the `Message` type to include the `info` field. Let me check the complete structure:","","** edit** `types.lua`","","`````lua"," ---@field range? { from: number, to: number } Optional range for the action"," "," ---@alias OutputExtmark vim.api.keyset.set_extmark|fun():vim.api.keyset.set_extmark"," "," ---@class Message"," ---@class MessageInfo"," ---@field id string Unique message identifier"," ---@field sessionID string Unique session identifier"," ---@field tokens MessageTokenCount Token usage statistics"," ---@field parts MessagePart[] Array of message parts"," ---@field system string[] System messages"," ---@field time { created: number, completed: number } Timestamps"," ---@field cost number Cost of the message"," ---@field path { cwd: string, root: string } Working directory paths"," ---@field modelID string Model identifier","@@ -253,8 +251,13 @@"," ---@field system_role string|nil Role defined in system messages"," ---@field mode string|nil Agent or mode identifier"," ---@field error table"," "," ---@class Message"," ---@field info MessageInfo Message metadata"," ---@field parts MessagePart[] Array of message parts"," ---@field system string[] System messages"," "," ---@class RestorePoint"," ---@field id string Unique restore point identifier"," ---@field from_snapshot_id string|nil ID of the snapshot this restore point is based on"," ---@field files string[] List of file paths included in the restore point","","`````","","> [!ERROR] Error: The user rejected permission to use this specific tool call. You may try again with different parameters.",""],"extmarks":[[1,2,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":10,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-12 14:56:20)","OpencodeHint"],[" [msg_9d8ec2a46001D1TtyCg3aR7o97]","OpencodeHint"]]}],[2,3,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]]}],[3,4,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]]}],[4,5,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]]}],[5,6,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]]}],[6,9,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":10,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:20)","OpencodeHint"],[" [msg_9d8ec2a9f001uOK35RyLnct2b1]","OpencodeHint"]]}],[7,19,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[8,20,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[9,21,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[10,22,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[11,25,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":10,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:27)","OpencodeHint"],[" [msg_9d8ec47a8001Fd2VJ7LRBrj8AF]","OpencodeHint"]]}],[12,31,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":10,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:30)","OpencodeHint"],[" [msg_9d8ec5310001qTVklk5oFvS00E]","OpencodeHint"]]}],[13,36,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":10,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:33)","OpencodeHint"],[" [msg_9d8ec5d1e001Umy9DbvgL0mk76]","OpencodeHint"]]}],[14,42,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[15,43,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[16,44,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[17,45,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[18,46,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[19,47,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[20,48,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[21,49,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[22,50,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[23,51,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[24,52,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[25,53,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[26,54,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[27,55,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[28,56,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[29,57,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[30,58,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[31,59,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[32,60,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[33,61,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[34,62,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[35,63,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[36,64,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[37,65,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[38,66,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[39,67,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[40,68,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[41,69,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[42,70,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[43,71,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[44,72,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[45,73,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[46,74,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[47,75,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[48,76,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[49,77,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[50,78,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[51,79,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[52,80,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[53,81,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[54,82,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[55,83,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[56,84,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[57,85,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[58,86,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[59,87,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[60,88,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[61,91,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":10,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:38)","OpencodeHint"],[" [msg_9d8ec708e001lrLTmgiWPbSYeN]","OpencodeHint"]]}],[62,98,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":10,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:41)","OpencodeHint"],[" [msg_9d8ec7fa7001zpzhgmQUAz1uIN]","OpencodeHint"]]}],[63,102,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[64,103,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[65,104,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[66,105,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[67,106,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[68,107,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[69,110,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":10,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:46)","OpencodeHint"],[" [msg_9d8ec9105001k6kWv2IJB5sIEu]","OpencodeHint"]]}],[70,112,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[71,113,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[72,114,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[73,115,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[74,116,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[75,117,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[76,118,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[77,119,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[78,120,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[79,121,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[80,122,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[81,123,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[82,124,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[83,125,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[84,126,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[85,127,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[86,128,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[87,129,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[88,130,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[89,131,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[90,132,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[91,133,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[92,136,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":10,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:49)","OpencodeHint"],[" [msg_9d8ec9ce4001CV2dSm31xky1f5]","OpencodeHint"]]}],[93,140,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[94,141,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[95,142,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[96,143,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[97,144,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[98,145,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[99,146,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[100,147,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[101,150,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":10,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:52)","OpencodeHint"],[" [msg_9d8ecaa9f001scSNwtORoGqKra]","OpencodeHint"]]}],[102,154,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[103,155,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[104,156,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[105,157,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[106,158,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[107,159,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[108,162,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":10,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:55)","OpencodeHint"],[" [msg_9d8ecb6b8001LyTb1Pp75AENAa]","OpencodeHint"]]}],[109,169,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":10,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 14:56:59)","OpencodeHint"],[" [msg_9d8ecc3b20019L3zs8pytlmUHc]","OpencodeHint"]]}],[110,179,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[111,180,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[112,181,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[113,182,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[114,183,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[115,184,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[116,185,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[117,186,0,{"virt_text_pos":"overlay","priority":5000,"end_col":0,"end_row":187,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"hl_group":"OpencodeDiffDelete","virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["-","OpencodeDiffDelete"]]}],[118,186,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[119,187,0,{"virt_text_pos":"overlay","priority":5000,"end_col":0,"end_row":188,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"hl_group":"OpencodeDiffAdd","virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]]}],[120,187,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[121,188,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[122,189,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[123,190,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[124,191,0,{"virt_text_pos":"overlay","priority":5000,"end_col":0,"end_row":192,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"hl_group":"OpencodeDiffDelete","virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["-","OpencodeDiffDelete"]]}],[125,191,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[126,192,0,{"virt_text_pos":"overlay","priority":5000,"end_col":0,"end_row":193,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"hl_group":"OpencodeDiffDelete","virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["-","OpencodeDiffDelete"]]}],[127,192,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[128,193,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[129,194,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[130,195,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[131,196,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[132,197,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[133,198,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[134,199,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[135,200,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[136,201,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[137,202,0,{"virt_text_pos":"overlay","priority":5000,"end_col":0,"end_row":203,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"hl_group":"OpencodeDiffAdd","virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]]}],[138,202,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[139,203,0,{"virt_text_pos":"overlay","priority":5000,"end_col":0,"end_row":204,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"hl_group":"OpencodeDiffAdd","virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]]}],[140,203,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[141,204,0,{"virt_text_pos":"overlay","priority":5000,"end_col":0,"end_row":205,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"hl_group":"OpencodeDiffAdd","virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]]}],[142,204,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[143,205,0,{"virt_text_pos":"overlay","priority":5000,"end_col":0,"end_row":206,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"hl_group":"OpencodeDiffAdd","virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]]}],[144,205,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[145,206,0,{"virt_text_pos":"overlay","priority":5000,"end_col":0,"end_row":207,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"hl_group":"OpencodeDiffAdd","virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]]}],[146,206,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[147,207,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[148,208,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[149,209,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[150,210,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[151,211,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[152,212,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[153,213,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}],[154,214,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"ns_id":3,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]]}]]} \ No newline at end of file diff --git a/tests/data/permission-prompt.expected.json b/tests/data/permission-prompt.expected.json index 62060a3a..d1596eac 100644 --- a/tests/data/permission-prompt.expected.json +++ b/tests/data/permission-prompt.expected.json @@ -1 +1 @@ -{"timestamp":1761241892,"lines":["","----","","","Perfect! Now I understand how it works. The message headers have extmarks with `virt_text` where the first element contains the icon (either `header_user` or `header_assistant`). Let me check the output_window module to understand the extmark namespace:","","** run** `Find extmark namespace usage`","","```bash","> rg \"nvim_buf_get_extmarks|ns_id\" /Users/cam/Dev/neovim-dev/opencode.nvim/lua/opencode/ui/output_window.lua -B 2 -A 2","","```","","> [!WARNING] Permission required to run this tool.",">","> Accept `a` Always `A` Deny `d`",""],"extmarks":[[1,2,0,{"right_gravity":true,"priority":10,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-16 04:27:36)","OpencodeHint"],[" [msg_9eb45fbe60020xE560OGH3Vdoo]","OpencodeHint"]],"virt_text_pos":"win_col"}],[2,6,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[3,7,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[4,8,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[5,9,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[6,10,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[7,11,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[8,12,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[9,13,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[10,14,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[11,15,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[12,16,0,{"right_gravity":true,"priority":4096,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}]],"actions":[]} \ No newline at end of file +{"timestamp":1761708192,"extmarks":[[1,2,0,{"ns_id":3,"virt_text_hide":false,"priority":10,"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_pos":"win_col","virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-16 04:27:36)","OpencodeHint"],[" [msg_9eb45fbe60020xE560OGH3Vdoo]","OpencodeHint"]]}],[2,6,0,{"ns_id":3,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]]}],[3,7,0,{"ns_id":3,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]]}],[4,8,0,{"ns_id":3,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]]}],[5,9,0,{"ns_id":3,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]]}],[6,10,0,{"ns_id":3,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]]}],[7,11,0,{"ns_id":3,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]]}],[8,12,0,{"ns_id":3,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]]}],[9,13,0,{"ns_id":3,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]]}],[10,14,0,{"ns_id":3,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]]}],[11,15,0,{"ns_id":3,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]]}],[12,16,0,{"ns_id":3,"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]]}]],"lines":["","----","","","Perfect! Now I understand how it works. The message headers have extmarks with `virt_text` where the first element contains the icon (either `header_user` or `header_assistant`). Let me check the output_window module to understand the extmark namespace:","","** run** `Find extmark namespace usage`","","`````bash","> rg \"nvim_buf_get_extmarks|ns_id\" /Users/cam/Dev/neovim-dev/opencode.nvim/lua/opencode/ui/output_window.lua -B 2 -A 2","","`````","","> [!WARNING] Permission required to run this tool.",">","> Accept `a` Always `A` Deny `d`",""],"actions":[]} \ No newline at end of file diff --git a/tests/data/permission.expected.json b/tests/data/permission.expected.json index 8550baac..1178edaf 100644 --- a/tests/data/permission.expected.json +++ b/tests/data/permission.expected.json @@ -1 +1 @@ -{"lines":["","----","","","add a file, test.txt, with \":)\" in it","","----","","","** write** `test.txt`","","```txt",":)","```","","**󰻛 Created Snapshot** `c78fb2dd`","","----","",""],"actions":[{"display_line":16,"text":"[R]evert file","args":["c78fb2dd2d533cfe530692cc3e3c8f92a0e4af1d"],"key":"R","type":"diff_revert_selected_file","range":{"from":16,"to":16}},{"display_line":16,"text":"Revert [A]ll","args":["c78fb2dd2d533cfe530692cc3e3c8f92a0e4af1d"],"key":"A","type":"diff_revert_all","range":{"from":16,"to":16}},{"display_line":16,"text":"[D]iff","args":["c78fb2dd2d533cfe530692cc3e3c8f92a0e4af1d"],"key":"D","type":"diff_open","range":{"from":16,"to":16}}],"extmarks":[[1,2,0,{"virt_text_hide":false,"virt_text_win_col":-3,"ns_id":3,"priority":10,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-12 05:43:49)","OpencodeHint"],[" [msg_9d6f253910015UFmkGkiWtUsRW]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_pos":"win_col"}],[2,3,0,{"virt_text_hide":false,"virt_text_win_col":-3,"ns_id":3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col"}],[3,4,0,{"virt_text_hide":false,"virt_text_win_col":-3,"ns_id":3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col"}],[4,7,0,{"virt_text_hide":false,"virt_text_win_col":-3,"ns_id":3,"priority":10,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 05:43:49)","OpencodeHint"],[" [msg_9d6f253df001TjqxW12FAjGf5s]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_pos":"win_col"}],[5,9,0,{"virt_text_hide":false,"virt_text_win_col":-1,"ns_id":3,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col"}],[6,10,0,{"virt_text_hide":false,"virt_text_win_col":-1,"ns_id":3,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col"}],[7,11,0,{"virt_text_hide":false,"virt_text_win_col":-1,"ns_id":3,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col"}],[8,12,0,{"virt_text_hide":false,"virt_text_win_col":-1,"ns_id":3,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col"}],[9,13,0,{"virt_text_hide":false,"virt_text_win_col":-1,"ns_id":3,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col"}],[10,18,0,{"virt_text_hide":false,"virt_text_win_col":-3,"ns_id":3,"priority":10,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 05:44:00)","OpencodeHint"],[" [msg_9d6f27f4800103Tp3N6i6JW53p]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_pos":"win_col"}]],"timestamp":1760658430} \ No newline at end of file +{"timestamp":1761708192,"extmarks":[[1,2,0,{"virt_text_win_col":-3,"ns_id":3,"right_gravity":true,"priority":10,"virt_text_hide":false,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-12 05:43:49)","OpencodeHint"],[" [msg_9d6f253910015UFmkGkiWtUsRW]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"win_col"}],[2,3,0,{"virt_text_win_col":-3,"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col"}],[3,4,0,{"virt_text_win_col":-3,"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col"}],[4,7,0,{"virt_text_win_col":-3,"ns_id":3,"right_gravity":true,"priority":10,"virt_text_hide":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 05:43:49)","OpencodeHint"],[" [msg_9d6f253df001TjqxW12FAjGf5s]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"win_col"}],[5,9,0,{"virt_text_win_col":-1,"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col"}],[6,10,0,{"virt_text_win_col":-1,"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col"}],[7,11,0,{"virt_text_win_col":-1,"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col"}],[8,12,0,{"virt_text_win_col":-1,"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col"}],[9,13,0,{"virt_text_win_col":-1,"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col"}],[10,18,0,{"virt_text_win_col":-3,"ns_id":3,"right_gravity":true,"priority":10,"virt_text_hide":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-12 05:44:00)","OpencodeHint"],[" [msg_9d6f27f4800103Tp3N6i6JW53p]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"win_col"}]],"actions":[{"args":["c78fb2dd2d533cfe530692cc3e3c8f92a0e4af1d"],"key":"R","type":"diff_revert_selected_file","display_line":16,"range":{"to":16,"from":16},"text":"[R]evert file"},{"args":["c78fb2dd2d533cfe530692cc3e3c8f92a0e4af1d"],"key":"A","type":"diff_revert_all","display_line":16,"range":{"to":16,"from":16},"text":"Revert [A]ll"},{"args":["c78fb2dd2d533cfe530692cc3e3c8f92a0e4af1d"],"key":"D","type":"diff_open","display_line":16,"range":{"to":16,"from":16},"text":"[D]iff"}],"lines":["","----","","","add a file, test.txt, with \":)\" in it","","----","","","** write** `test.txt`","","`````txt",":)","`````","","**󰻛 Created Snapshot** `c78fb2dd`","","----","",""]} \ No newline at end of file diff --git a/tests/data/planning.expected.json b/tests/data/planning.expected.json index 2aecac35..0bd90e45 100644 --- a/tests/data/planning.expected.json +++ b/tests/data/planning.expected.json @@ -1 +1 @@ -{"extmarks":[[1,2,0,{"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-11 17:41:45)","OpencodeHint"],[" [msg_9d45d40c9001s7A1sP3Ew537QN]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false}],[2,3,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false}],[3,4,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false}],[4,5,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false}],[5,6,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false}],[6,9,0,{"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4","OpencodeHint"],[" (2025-10-11 17:41:45)","OpencodeHint"],[" [msg_9d45d411b00254Lm5jVRwAeQxT]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false}],[7,13,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false}],[8,14,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false}],[9,15,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false}],[10,16,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false}],[11,17,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false}],[12,20,0,{"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4","OpencodeHint"],[" (2025-10-11 17:41:51)","OpencodeHint"],[" [msg_9d45d585800269UgJnOLD8i2pF]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false}],[13,25,0,{"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4","OpencodeHint"],[" (2025-10-11 17:41:54)","OpencodeHint"],[" [msg_9d45d65b40026mDvwR5cCGTA30]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false}],[14,27,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false}],[15,28,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false}],[16,29,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false}],[17,30,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false}],[18,31,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false}],[19,34,0,{"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4","OpencodeHint"],[" (2025-10-11 17:41:58)","OpencodeHint"],[" [msg_9d45d7390002yE2ve5szXtMdw0]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"win_col","ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false}]],"timestamp":1760658431,"lines":["","----","","","can you make a new neovim plugin for me?","","[a-empty.txt](a-empty.txt)","","----","","","I'll help you create a new Neovim plugin. Let me first examine your current setup and then create the plugin structure.","","**󰝖 plan** `4 todos`","- [ ] Examine existing Lua plugin structure ","- [ ] Create basic plugin directory structure ","- [ ] Write main plugin init.lua file ","- [ ] Create plugin documentation ","","----","","","** read** `init.lua`","","----","","","**󰝖 plan** `3 todos`","- [x] Examine existing Lua plugin structure ","- [-] Create basic plugin directory structure ","- [ ] Write main plugin init.lua file ","- [ ] Create plugin documentation ","","----","","","What would you like your Neovim plugin to do? I can see you have an example plugin structure already. I'll need to know:","","1. What functionality you want the plugin to provide","2. What you'd like to name it","3. Any specific features or commands you want to include","","Once you provide these details, I can create a complete plugin structure for you based on the pattern I see in your existing example-plugin.",""],"actions":[]} \ No newline at end of file +{"timestamp":1761708192,"extmarks":[[1,2,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-11 17:41:45)","OpencodeHint"],[" [msg_9d45d40c9001s7A1sP3Ew537QN]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"win_col","priority":10}],[2,3,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[3,4,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[4,5,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[5,6,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[6,9,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4","OpencodeHint"],[" (2025-10-11 17:41:45)","OpencodeHint"],[" [msg_9d45d411b00254Lm5jVRwAeQxT]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"win_col","priority":10}],[7,13,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[8,14,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[9,15,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[10,16,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[11,17,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[12,20,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4","OpencodeHint"],[" (2025-10-11 17:41:51)","OpencodeHint"],[" [msg_9d45d585800269UgJnOLD8i2pF]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"win_col","priority":10}],[13,25,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4","OpencodeHint"],[" (2025-10-11 17:41:54)","OpencodeHint"],[" [msg_9d45d65b40026mDvwR5cCGTA30]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"win_col","priority":10}],[14,27,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[15,28,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[16,29,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[17,30,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[18,31,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[19,34,0,{"ns_id":3,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4","OpencodeHint"],[" (2025-10-11 17:41:58)","OpencodeHint"],[" [msg_9d45d7390002yE2ve5szXtMdw0]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"win_col","priority":10}]],"actions":[],"lines":["","----","","","can you make a new neovim plugin for me?","","[a-empty.txt](a-empty.txt)","","----","","","I'll help you create a new Neovim plugin. Let me first examine your current setup and then create the plugin structure.","","**󰝖 plan** `4 todos`","- [ ] Examine existing Lua plugin structure ","- [ ] Create basic plugin directory structure ","- [ ] Write main plugin init.lua file ","- [ ] Create plugin documentation ","","----","","","** read** `init.lua`","","----","","","**󰝖 plan** `3 todos`","- [x] Examine existing Lua plugin structure ","- [-] Create basic plugin directory structure ","- [ ] Write main plugin init.lua file ","- [ ] Create plugin documentation ","","----","","","What would you like your Neovim plugin to do? I can see you have an example plugin structure already. I'll need to know:","","1. What functionality you want the plugin to provide","2. What you'd like to name it","3. Any specific features or commands you want to include","","Once you provide these details, I can create a complete plugin structure for you based on the pattern I see in your existing example-plugin.",""]} \ No newline at end of file diff --git a/tests/data/redo-all.expected.json b/tests/data/redo-all.expected.json index 05bfe70a..031ce52e 100644 --- a/tests/data/redo-all.expected.json +++ b/tests/data/redo-all.expected.json @@ -1 +1 @@ -{"extmarks":[[1,2,0,{"ns_id":3,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-20 15:20:02)","OpencodeHint"],[" [msg_a0234c0b7001y2o9S1jMaNVZar]","OpencodeHint"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":10,"virt_text_repeat_linebreak":false}],[2,3,0,{"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":4096,"virt_text_repeat_linebreak":true}],[3,4,0,{"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":4096,"virt_text_repeat_linebreak":true}],[4,5,0,{"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":4096,"virt_text_repeat_linebreak":true}],[5,6,0,{"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":4096,"virt_text_repeat_linebreak":true}],[6,9,0,{"ns_id":3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:04)","OpencodeHint"],[" [msg_a0234c7960011LTxTvD94hfWCi]","OpencodeHint"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":10,"virt_text_repeat_linebreak":false}],[7,13,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[8,14,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[9,15,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[10,16,0,{"ns_id":3,"end_row":17,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"priority":5000,"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","end_col":0,"virt_text":[["-","OpencodeDiffDelete"]],"hl_group":"OpencodeDiffDelete"}],[11,16,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[12,17,0,{"ns_id":3,"end_row":18,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"priority":5000,"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","end_col":0,"virt_text":[["+","OpencodeDiffAdd"]],"hl_group":"OpencodeDiffAdd"}],[13,17,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[14,18,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[15,19,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[16,20,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[17,21,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[18,26,0,{"ns_id":3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:09)","OpencodeHint"],[" [msg_a0234d8fb001SXyngLjuKSuxOY]","OpencodeHint"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":10,"virt_text_repeat_linebreak":false}],[19,31,0,{"ns_id":3,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-20 15:20:11)","OpencodeHint"],[" [msg_a0234e308001SKl5bQUibp5gtI]","OpencodeHint"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":10,"virt_text_repeat_linebreak":false}],[20,32,0,{"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":4096,"virt_text_repeat_linebreak":true}],[21,33,0,{"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":4096,"virt_text_repeat_linebreak":true}],[22,36,0,{"ns_id":3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:11)","OpencodeHint"],[" [msg_a0234e31f001m4EsQdPmY3PTtS]","OpencodeHint"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":10,"virt_text_repeat_linebreak":false}],[23,43,0,{"ns_id":3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:16)","OpencodeHint"],[" [msg_a0234f482001PQbMjWc6W8s0eF]","OpencodeHint"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":10,"virt_text_repeat_linebreak":false}],[24,47,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[25,48,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[26,49,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[27,50,0,{"ns_id":3,"end_row":51,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"priority":5000,"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","end_col":0,"virt_text":[["-","OpencodeDiffDelete"]],"hl_group":"OpencodeDiffDelete"}],[28,50,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[29,51,0,{"ns_id":3,"end_row":52,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"priority":5000,"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","end_col":0,"virt_text":[["+","OpencodeDiffAdd"]],"hl_group":"OpencodeDiffAdd"}],[30,51,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[31,52,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[32,53,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[33,54,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[34,55,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[35,60,0,{"ns_id":3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:17)","OpencodeHint"],[" [msg_a0234f9c6001JCKYaca1HHwwx6]","OpencodeHint"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":10,"virt_text_repeat_linebreak":false}],[36,65,0,{"ns_id":3,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-20 15:22:29)","OpencodeHint"],[" [msg_a0236fd1c001TlwqL8fwvq529i]","OpencodeHint"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":10,"virt_text_repeat_linebreak":false}],[37,66,0,{"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":4096,"virt_text_repeat_linebreak":true}],[38,67,0,{"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":4096,"virt_text_repeat_linebreak":true}],[39,70,0,{"ns_id":3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:22:29)","OpencodeHint"],[" [msg_a0236fd57001pTnTjSBdFlleCb]","OpencodeHint"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":10,"virt_text_repeat_linebreak":false}],[40,77,0,{"ns_id":3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:22:34)","OpencodeHint"],[" [msg_a02371241001PBQAsr8Oc9hqNI]","OpencodeHint"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":10,"virt_text_repeat_linebreak":false}],[41,81,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[42,82,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[43,83,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[44,84,0,{"ns_id":3,"end_row":85,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"priority":5000,"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","end_col":0,"virt_text":[["-","OpencodeDiffDelete"]],"hl_group":"OpencodeDiffDelete"}],[45,84,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[46,85,0,{"ns_id":3,"end_row":86,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"priority":5000,"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","end_col":0,"virt_text":[["+","OpencodeDiffAdd"]],"hl_group":"OpencodeDiffAdd"}],[47,85,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[48,86,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[49,87,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[50,88,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[51,89,0,{"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[52,94,0,{"ns_id":3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:22:39)","OpencodeHint"],[" [msg_a023723d0001r87MaJThFssUw1]","OpencodeHint"]],"virt_text_pos":"win_col","right_gravity":true,"virt_text_hide":false,"virt_text_win_col":-3,"priority":10,"virt_text_repeat_linebreak":false}]],"lines":["","----","","","add another word","","[test.txt](test.txt)","","----","","","I'll append a single word (\"again\") to the first line of `test.txt`. Applying a precise edit to the existing line now.","","** edit** `test.txt`","","```txt"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more again"," "," ","","```","","**󰻛 Created Snapshot** `1b6ba655`","","----","","","**Done:** added the word `again` to `test.txt`.","","----","","","add another word","","----","","","I'll read `test.txt` to get the current first-line content, then append one word (\"again2\") to that line. Proceeding to read the file.","","** read** `test.txt`","","----","","","Now I'll append the word \"again2\" to the first line. I'll apply an exact in-place edit to update that line.","","** edit** `test.txt`","","```txt"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more again"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more again again2"," "," ","","```","","**󰻛 Created Snapshot** `57d83f55`","","----","","","**Done:** appended the word `again2` to `test.txt`.","","----","","","add another word","","----","","","I'll read `test.txt` to get the current first-line content, then append the word `again3`. Proceeding to read the file.","","** read** `test.txt`","","----","","","I'll append the word \"again3\" to the first line of `test.txt` with an exact in-place edit. Applying the change now.","","** edit** `test.txt`","","```txt"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more again again2"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more again again2 again3"," "," ","","```","","**󰻛 Created Snapshot** `d988cc85`","","----","","","**Done:** appended the word `again3` to `test.txt`.",""],"timestamp":1760979963,"actions":[{"display_line":92,"type":"diff_revert_selected_file","key":"R","text":"[R]evert file","range":{"from":92,"to":92},"args":["d988cc85565b99017d40ad8baea20225165be9d5"]},{"display_line":92,"type":"diff_revert_all","key":"A","text":"Revert [A]ll","range":{"from":92,"to":92},"args":["d988cc85565b99017d40ad8baea20225165be9d5"]},{"display_line":92,"type":"diff_open","key":"D","text":"[D]iff","range":{"from":92,"to":92},"args":["d988cc85565b99017d40ad8baea20225165be9d5"]},{"display_line":24,"type":"diff_revert_selected_file","key":"R","text":"[R]evert file","range":{"from":24,"to":24},"args":["1b6ba655c6c0d899965adff278ac6320d5fc3b12"]},{"display_line":24,"type":"diff_revert_all","key":"A","text":"Revert [A]ll","range":{"from":24,"to":24},"args":["1b6ba655c6c0d899965adff278ac6320d5fc3b12"]},{"display_line":24,"type":"diff_open","key":"D","text":"[D]iff","range":{"from":24,"to":24},"args":["1b6ba655c6c0d899965adff278ac6320d5fc3b12"]},{"display_line":58,"type":"diff_revert_selected_file","key":"R","text":"[R]evert file","range":{"from":58,"to":58},"args":["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"]},{"display_line":58,"type":"diff_revert_all","key":"A","text":"Revert [A]ll","range":{"from":58,"to":58},"args":["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"]},{"display_line":58,"type":"diff_open","key":"D","text":"[D]iff","range":{"from":58,"to":58},"args":["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"]}]} \ No newline at end of file +{"extmarks":[[1,2,0,{"virt_text_repeat_linebreak":false,"priority":10,"virt_text_win_col":-3,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-20 15:20:02)","OpencodeHint"],[" [msg_a0234c0b7001y2o9S1jMaNVZar]","OpencodeHint"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[2,3,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[3,4,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[4,5,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[5,6,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[6,9,0,{"virt_text_repeat_linebreak":false,"priority":10,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:04)","OpencodeHint"],[" [msg_a0234c7960011LTxTvD94hfWCi]","OpencodeHint"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[7,13,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[8,14,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[9,15,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[10,16,0,{"end_col":0,"end_row":17,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"hl_group":"OpencodeDiffDelete","ns_id":3,"priority":5000,"virt_text":[["-","OpencodeDiffDelete"]],"virt_text_pos":"overlay"}],[11,16,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[12,17,0,{"end_col":0,"end_row":18,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"hl_group":"OpencodeDiffAdd","ns_id":3,"priority":5000,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay"}],[13,17,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[14,18,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[15,19,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[16,20,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[17,21,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[18,26,0,{"virt_text_repeat_linebreak":false,"priority":10,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:09)","OpencodeHint"],[" [msg_a0234d8fb001SXyngLjuKSuxOY]","OpencodeHint"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[19,31,0,{"virt_text_repeat_linebreak":false,"priority":10,"virt_text_win_col":-3,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-20 15:20:11)","OpencodeHint"],[" [msg_a0234e308001SKl5bQUibp5gtI]","OpencodeHint"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[20,32,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[21,33,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[22,36,0,{"virt_text_repeat_linebreak":false,"priority":10,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:11)","OpencodeHint"],[" [msg_a0234e31f001m4EsQdPmY3PTtS]","OpencodeHint"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[23,43,0,{"virt_text_repeat_linebreak":false,"priority":10,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:16)","OpencodeHint"],[" [msg_a0234f482001PQbMjWc6W8s0eF]","OpencodeHint"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[24,47,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[25,48,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[26,49,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[27,50,0,{"end_col":0,"end_row":51,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"hl_group":"OpencodeDiffDelete","ns_id":3,"priority":5000,"virt_text":[["-","OpencodeDiffDelete"]],"virt_text_pos":"overlay"}],[28,50,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[29,51,0,{"end_col":0,"end_row":52,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"hl_group":"OpencodeDiffAdd","ns_id":3,"priority":5000,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay"}],[30,51,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[31,52,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[32,53,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[33,54,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[34,55,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[35,60,0,{"virt_text_repeat_linebreak":false,"priority":10,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:17)","OpencodeHint"],[" [msg_a0234f9c6001JCKYaca1HHwwx6]","OpencodeHint"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[36,65,0,{"virt_text_repeat_linebreak":false,"priority":10,"virt_text_win_col":-3,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-20 15:22:29)","OpencodeHint"],[" [msg_a0236fd1c001TlwqL8fwvq529i]","OpencodeHint"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[37,66,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[38,67,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[39,70,0,{"virt_text_repeat_linebreak":false,"priority":10,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:22:29)","OpencodeHint"],[" [msg_a0236fd57001pTnTjSBdFlleCb]","OpencodeHint"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[40,77,0,{"virt_text_repeat_linebreak":false,"priority":10,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:22:34)","OpencodeHint"],[" [msg_a02371241001PBQAsr8Oc9hqNI]","OpencodeHint"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[41,81,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[42,82,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[43,83,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[44,84,0,{"end_col":0,"end_row":85,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"hl_group":"OpencodeDiffDelete","ns_id":3,"priority":5000,"virt_text":[["-","OpencodeDiffDelete"]],"virt_text_pos":"overlay"}],[45,84,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[46,85,0,{"end_col":0,"end_row":86,"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"hl_group":"OpencodeDiffAdd","ns_id":3,"priority":5000,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay"}],[47,85,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[48,86,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[49,87,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[50,88,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[51,89,0,{"virt_text_repeat_linebreak":true,"priority":4096,"virt_text_win_col":-1,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}],[52,94,0,{"virt_text_repeat_linebreak":false,"priority":10,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:22:39)","OpencodeHint"],[" [msg_a023723d0001r87MaJThFssUw1]","OpencodeHint"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col"}]],"lines":["","----","","","add another word","","[test.txt](test.txt)","","----","","","I'll append a single word (\"again\") to the first line of `test.txt`. Applying a precise edit to the existing line now.","","** edit** `test.txt`","","`````txt"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more again"," "," ","","`````","","**󰻛 Created Snapshot** `1b6ba655`","","----","","","**Done:** added the word `again` to `test.txt`.","","----","","","add another word","","----","","","I'll read `test.txt` to get the current first-line content, then append one word (\"again2\") to that line. Proceeding to read the file.","","** read** `test.txt`","","----","","","Now I'll append the word \"again2\" to the first line. I'll apply an exact in-place edit to update that line.","","** edit** `test.txt`","","`````txt"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more again"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more again again2"," "," ","","`````","","**󰻛 Created Snapshot** `57d83f55`","","----","","","**Done:** appended the word `again2` to `test.txt`.","","----","","","add another word","","----","","","I'll read `test.txt` to get the current first-line content, then append the word `again3`. Proceeding to read the file.","","** read** `test.txt`","","----","","","I'll append the word \"again3\" to the first line of `test.txt` with an exact in-place edit. Applying the change now.","","** edit** `test.txt`","","`````txt"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more again again2"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more again again2 again3"," "," ","","`````","","**󰻛 Created Snapshot** `d988cc85`","","----","","","**Done:** appended the word `again3` to `test.txt`.",""],"actions":[{"text":"[R]evert file","type":"diff_revert_selected_file","key":"R","display_line":58,"args":["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"],"range":{"to":58,"from":58}},{"text":"Revert [A]ll","type":"diff_revert_all","key":"A","display_line":58,"args":["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"],"range":{"to":58,"from":58}},{"text":"[D]iff","type":"diff_open","key":"D","display_line":58,"args":["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"],"range":{"to":58,"from":58}},{"text":"[R]evert file","type":"diff_revert_selected_file","key":"R","display_line":92,"args":["d988cc85565b99017d40ad8baea20225165be9d5"],"range":{"to":92,"from":92}},{"text":"Revert [A]ll","type":"diff_revert_all","key":"A","display_line":92,"args":["d988cc85565b99017d40ad8baea20225165be9d5"],"range":{"to":92,"from":92}},{"text":"[D]iff","type":"diff_open","key":"D","display_line":92,"args":["d988cc85565b99017d40ad8baea20225165be9d5"],"range":{"to":92,"from":92}},{"text":"[R]evert file","type":"diff_revert_selected_file","key":"R","display_line":24,"args":["1b6ba655c6c0d899965adff278ac6320d5fc3b12"],"range":{"to":24,"from":24}},{"text":"Revert [A]ll","type":"diff_revert_all","key":"A","display_line":24,"args":["1b6ba655c6c0d899965adff278ac6320d5fc3b12"],"range":{"to":24,"from":24}},{"text":"[D]iff","type":"diff_open","key":"D","display_line":24,"args":["1b6ba655c6c0d899965adff278ac6320d5fc3b12"],"range":{"to":24,"from":24}}],"timestamp":1761708193} \ No newline at end of file diff --git a/tests/data/redo-once.expected.json b/tests/data/redo-once.expected.json index 5fabb6be..3a50269e 100644 --- a/tests/data/redo-once.expected.json +++ b/tests/data/redo-once.expected.json @@ -1 +1 @@ -{"extmarks":[[1,2,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-20 15:20:02)","OpencodeHint"],[" [msg_a0234c0b7001y2o9S1jMaNVZar]","OpencodeHint"]],"priority":10,"virt_text_pos":"win_col"}],[2,3,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"priority":4096,"virt_text_pos":"win_col"}],[3,4,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"priority":4096,"virt_text_pos":"win_col"}],[4,5,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"priority":4096,"virt_text_pos":"win_col"}],[5,6,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"priority":4096,"virt_text_pos":"win_col"}],[6,9,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:04)","OpencodeHint"],[" [msg_a0234c7960011LTxTvD94hfWCi]","OpencodeHint"]],"priority":10,"virt_text_pos":"win_col"}],[7,13,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"virt_text_pos":"win_col"}],[8,14,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"virt_text_pos":"win_col"}],[9,15,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"virt_text_pos":"win_col"}],[10,16,0,{"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"ns_id":3,"hl_eol":true,"priority":5000,"hl_group":"OpencodeDiffDelete","virt_text":[["-","OpencodeDiffDelete"]],"end_col":0,"end_row":17,"virt_text_pos":"overlay"}],[11,16,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"virt_text_pos":"win_col"}],[12,17,0,{"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"ns_id":3,"hl_eol":true,"priority":5000,"hl_group":"OpencodeDiffAdd","virt_text":[["+","OpencodeDiffAdd"]],"end_col":0,"end_row":18,"virt_text_pos":"overlay"}],[13,17,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"virt_text_pos":"win_col"}],[14,18,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"virt_text_pos":"win_col"}],[15,19,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"virt_text_pos":"win_col"}],[16,20,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"virt_text_pos":"win_col"}],[17,21,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"virt_text_pos":"win_col"}],[18,26,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:09)","OpencodeHint"],[" [msg_a0234d8fb001SXyngLjuKSuxOY]","OpencodeHint"]],"priority":10,"virt_text_pos":"win_col"}],[19,31,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-20 15:20:11)","OpencodeHint"],[" [msg_a0234e308001SKl5bQUibp5gtI]","OpencodeHint"]],"priority":10,"virt_text_pos":"win_col"}],[20,32,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"priority":4096,"virt_text_pos":"win_col"}],[21,33,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"priority":4096,"virt_text_pos":"win_col"}],[22,36,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:11)","OpencodeHint"],[" [msg_a0234e31f001m4EsQdPmY3PTtS]","OpencodeHint"]],"priority":10,"virt_text_pos":"win_col"}],[23,43,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:16)","OpencodeHint"],[" [msg_a0234f482001PQbMjWc6W8s0eF]","OpencodeHint"]],"priority":10,"virt_text_pos":"win_col"}],[24,47,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"virt_text_pos":"win_col"}],[25,48,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"virt_text_pos":"win_col"}],[26,49,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"virt_text_pos":"win_col"}],[27,50,0,{"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"ns_id":3,"hl_eol":true,"priority":5000,"hl_group":"OpencodeDiffDelete","virt_text":[["-","OpencodeDiffDelete"]],"end_col":0,"end_row":51,"virt_text_pos":"overlay"}],[28,50,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"virt_text_pos":"win_col"}],[29,51,0,{"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"ns_id":3,"hl_eol":true,"priority":5000,"hl_group":"OpencodeDiffAdd","virt_text":[["+","OpencodeDiffAdd"]],"end_col":0,"end_row":52,"virt_text_pos":"overlay"}],[30,51,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"virt_text_pos":"win_col"}],[31,52,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"virt_text_pos":"win_col"}],[32,53,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"virt_text_pos":"win_col"}],[33,54,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"virt_text_pos":"win_col"}],[34,55,0,{"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"priority":4096,"virt_text_pos":"win_col"}],[35,60,0,{"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:17)","OpencodeHint"],[" [msg_a0234f9c6001JCKYaca1HHwwx6]","OpencodeHint"]],"priority":10,"virt_text_pos":"win_col"}],[36,70,0,{"right_gravity":true,"virt_text_win_col":12,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text":[["+1","OpencodeDiffAddText"]],"priority":1000,"virt_text_pos":"win_col"}],[37,70,0,{"right_gravity":true,"virt_text_win_col":15,"virt_text_hide":false,"ns_id":3,"virt_text_repeat_linebreak":false,"virt_text":[["-1","OpencodeDiffDeleteText"]],"priority":1000,"virt_text_pos":"win_col"}]],"actions":[{"text":"[R]evert file","args":["1b6ba655c6c0d899965adff278ac6320d5fc3b12"],"key":"R","display_line":24,"type":"diff_revert_selected_file","range":{"from":24,"to":24}},{"text":"Revert [A]ll","args":["1b6ba655c6c0d899965adff278ac6320d5fc3b12"],"key":"A","display_line":24,"type":"diff_revert_all","range":{"from":24,"to":24}},{"text":"[D]iff","args":["1b6ba655c6c0d899965adff278ac6320d5fc3b12"],"key":"D","display_line":24,"type":"diff_open","range":{"from":24,"to":24}},{"text":"[R]evert file","args":["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"],"key":"R","display_line":58,"type":"diff_revert_selected_file","range":{"from":58,"to":58}},{"text":"Revert [A]ll","args":["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"],"key":"A","display_line":58,"type":"diff_revert_all","range":{"from":58,"to":58}},{"text":"[D]iff","args":["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"],"key":"D","display_line":58,"type":"diff_open","range":{"from":58,"to":58}}],"timestamp":1760978474,"lines":["","----","","","add another word","","[test.txt](test.txt)","","----","","","I'll append a single word (\"again\") to the first line of `test.txt`. Applying a precise edit to the existing line now.","","** edit** `test.txt`","","```txt"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more again"," "," ","","```","","**󰻛 Created Snapshot** `1b6ba655`","","----","","","**Done:** added the word `again` to `test.txt`.","","----","","","add another word","","----","","","I'll read `test.txt` to get the current first-line content, then append one word (\"again2\") to that line. Proceeding to read the file.","","** read** `test.txt`","","----","","","Now I'll append the word \"again2\" to the first line. I'll apply an exact in-place edit to update that line.","","** edit** `test.txt`","","```txt"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more again"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more again again2"," "," ","","```","","**󰻛 Created Snapshot** `57d83f55`","","----","","","**Done:** appended the word `again2` to `test.txt`.","","----","","> 1 message reverted, 2 tool calls reverted",">","> type `/redo` to restore.",""," test.txt: +1 -1"]} \ No newline at end of file +{"actions":[{"text":"[R]evert file","range":{"to":58,"from":58},"args":["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"],"type":"diff_revert_selected_file","display_line":58,"key":"R"},{"text":"Revert [A]ll","range":{"to":58,"from":58},"args":["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"],"type":"diff_revert_all","display_line":58,"key":"A"},{"text":"[D]iff","range":{"to":58,"from":58},"args":["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"],"type":"diff_open","display_line":58,"key":"D"},{"text":"[R]evert file","range":{"to":24,"from":24},"args":["1b6ba655c6c0d899965adff278ac6320d5fc3b12"],"type":"diff_revert_selected_file","display_line":24,"key":"R"},{"text":"Revert [A]ll","range":{"to":24,"from":24},"args":["1b6ba655c6c0d899965adff278ac6320d5fc3b12"],"type":"diff_revert_all","display_line":24,"key":"A"},{"text":"[D]iff","range":{"to":24,"from":24},"args":["1b6ba655c6c0d899965adff278ac6320d5fc3b12"],"type":"diff_open","display_line":24,"key":"D"}],"timestamp":1761708193,"extmarks":[[1,2,0,{"virt_text_hide":false,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-20 15:20:02)","OpencodeHint"],[" [msg_a0234c0b7001y2o9S1jMaNVZar]","OpencodeHint"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10,"right_gravity":true,"virt_text_repeat_linebreak":false}],[2,3,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[3,4,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[4,5,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[5,6,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[6,9,0,{"virt_text_hide":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:04)","OpencodeHint"],[" [msg_a0234c7960011LTxTvD94hfWCi]","OpencodeHint"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10,"right_gravity":true,"virt_text_repeat_linebreak":false}],[7,13,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[8,14,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[9,15,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[10,16,0,{"virt_text_hide":false,"virt_text_repeat_linebreak":false,"hl_group":"OpencodeDiffDelete","virt_text_pos":"overlay","virt_text":[["-","OpencodeDiffDelete"]],"hl_eol":true,"ns_id":3,"end_col":0,"end_row":17,"priority":5000,"right_gravity":true,"end_right_gravity":false}],[11,16,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[12,17,0,{"virt_text_hide":false,"virt_text_repeat_linebreak":false,"hl_group":"OpencodeDiffAdd","virt_text_pos":"overlay","virt_text":[["+","OpencodeDiffAdd"]],"hl_eol":true,"ns_id":3,"end_col":0,"end_row":18,"priority":5000,"right_gravity":true,"end_right_gravity":false}],[13,17,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[14,18,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[15,19,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[16,20,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[17,21,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[18,26,0,{"virt_text_hide":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:09)","OpencodeHint"],[" [msg_a0234d8fb001SXyngLjuKSuxOY]","OpencodeHint"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10,"right_gravity":true,"virt_text_repeat_linebreak":false}],[19,31,0,{"virt_text_hide":false,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-20 15:20:11)","OpencodeHint"],[" [msg_a0234e308001SKl5bQUibp5gtI]","OpencodeHint"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10,"right_gravity":true,"virt_text_repeat_linebreak":false}],[20,32,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[21,33,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[22,36,0,{"virt_text_hide":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:11)","OpencodeHint"],[" [msg_a0234e31f001m4EsQdPmY3PTtS]","OpencodeHint"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10,"right_gravity":true,"virt_text_repeat_linebreak":false}],[23,43,0,{"virt_text_hide":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:16)","OpencodeHint"],[" [msg_a0234f482001PQbMjWc6W8s0eF]","OpencodeHint"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10,"right_gravity":true,"virt_text_repeat_linebreak":false}],[24,47,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[25,48,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[26,49,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[27,50,0,{"virt_text_hide":false,"virt_text_repeat_linebreak":false,"hl_group":"OpencodeDiffDelete","virt_text_pos":"overlay","virt_text":[["-","OpencodeDiffDelete"]],"hl_eol":true,"ns_id":3,"end_col":0,"end_row":51,"priority":5000,"right_gravity":true,"end_right_gravity":false}],[28,50,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[29,51,0,{"virt_text_hide":false,"virt_text_repeat_linebreak":false,"hl_group":"OpencodeDiffAdd","virt_text_pos":"overlay","virt_text":[["+","OpencodeDiffAdd"]],"hl_eol":true,"ns_id":3,"end_col":0,"end_row":52,"priority":5000,"right_gravity":true,"end_right_gravity":false}],[30,51,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[31,52,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[32,53,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[33,54,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[34,55,0,{"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"right_gravity":true,"virt_text_repeat_linebreak":true}],[35,60,0,{"virt_text_hide":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-20 15:20:17)","OpencodeHint"],[" [msg_a0234f9c6001JCKYaca1HHwwx6]","OpencodeHint"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10,"right_gravity":true,"virt_text_repeat_linebreak":false}],[36,70,0,{"virt_text_hide":false,"virt_text":[["+1","OpencodeDiffAddText"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":12,"priority":1000,"right_gravity":true,"virt_text_repeat_linebreak":false}],[37,70,0,{"virt_text_hide":false,"virt_text":[["-1","OpencodeDiffDeleteText"]],"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":15,"priority":1000,"right_gravity":true,"virt_text_repeat_linebreak":false}]],"lines":["","----","","","add another word","","[test.txt](test.txt)","","----","","","I'll append a single word (\"again\") to the first line of `test.txt`. Applying a precise edit to the existing line now.","","** edit** `test.txt`","","`````txt"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more again"," "," ","","`````","","**󰻛 Created Snapshot** `1b6ba655`","","----","","","**Done:** added the word `again` to `test.txt`.","","----","","","add another word","","----","","","I'll read `test.txt` to get the current first-line content, then append one word (\"again2\") to that line. Proceeding to read the file.","","** read** `test.txt`","","----","","","Now I'll append the word \"again2\" to the first line. I'll apply an exact in-place edit to update that line.","","** edit** `test.txt`","","`````txt"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more again"," tangram quiver saffron nebula cobalt murmur plinth zephyr ember lattice cadenza another yet extra more again again2"," "," ","","`````","","**󰻛 Created Snapshot** `57d83f55`","","----","","","**Done:** appended the word `again2` to `test.txt`.","","----","","> 1 message reverted, 2 tool calls reverted",">","> type `/redo` to restore.",""," test.txt: +1 -1"]} \ No newline at end of file diff --git a/tests/data/revert.expected.json b/tests/data/revert.expected.json index e5cc2c23..32a39d99 100644 --- a/tests/data/revert.expected.json +++ b/tests/data/revert.expected.json @@ -1 +1 @@ -{"actions":[{"range":{"to":55,"from":55},"text":"[R]evert file","display_line":55,"key":"R","args":["c410b2b4024de020aea223c5248eec89216de53f"],"type":"diff_revert_selected_file"},{"range":{"to":55,"from":55},"text":"Revert [A]ll","display_line":55,"key":"A","args":["c410b2b4024de020aea223c5248eec89216de53f"],"type":"diff_revert_all"},{"range":{"to":55,"from":55},"text":"[D]iff","display_line":55,"key":"D","args":["c410b2b4024de020aea223c5248eec89216de53f"],"type":"diff_open"}],"extmarks":[[1,2,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-19 17:50:43)","OpencodeHint"],[" [msg_9fd985573001fk1Xlot7uyDgTo]","OpencodeHint"]],"virt_text_win_col":-3,"priority":10}],[2,3,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"priority":4096}],[3,4,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"priority":4096}],[4,5,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"priority":4096}],[5,6,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"priority":4096}],[6,9,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" (2025-10-19 17:50:44)","OpencodeHint"],[" [msg_9fd985a4d001wOX3Op7CpFiCTq]","OpencodeHint"]],"virt_text_win_col":-3,"priority":10}],[7,27,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-19 17:50:57)","OpencodeHint"],[" [msg_9fd988c92001w0IZCVPQsN6xa9]","OpencodeHint"]],"virt_text_win_col":-3,"priority":10}],[8,28,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"priority":4096}],[9,29,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"priority":4096}],[10,32,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" (2025-10-19 17:50:57)","OpencodeHint"],[" [msg_9fd988ca7001lgaGttpI4YeGSA]","OpencodeHint"]],"virt_text_win_col":-3,"priority":10}],[11,38,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"priority":4096}],[12,39,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"priority":4096}],[13,40,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"priority":4096}],[14,41,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"priority":4096}],[15,42,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"priority":4096}],[16,43,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"priority":4096}],[17,44,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"priority":4096}],[18,45,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"priority":4096}],[19,46,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"priority":4096}],[20,47,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"priority":4096}],[21,48,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"priority":4096}],[22,49,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"priority":4096}],[23,50,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"priority":4096}],[24,51,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"priority":4096}],[25,52,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"priority":4096}],[26,57,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" (2025-10-19 17:50:59)","OpencodeHint"],[" [msg_9fd98942d001elqd2sd8CZeOoA]","OpencodeHint"]],"virt_text_win_col":-3,"priority":10}],[27,67,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","virt_text":[["-20","OpencodeDiffDeleteText"]],"virt_text_win_col":11,"priority":1000}]],"lines":["","----","","","write 10 random words","","[poem.md](poem.md)","","----","","","Here are 10 random words:","","1. Lantern ","2. Whisper ","3. Velvet ","4. Orbit ","5. Timber ","6. Quiver ","7. Mosaic ","8. Ember ","9. Spiral ","10. Glimmer","","Let me know if you need them in a specific format or want to use them in a file!","","----","","","write 10 random words to the file","","----","","","I will write 10 random words to poem.md, each on a new line.","","Proceeding to update the file now.","","** write** `poem.md`","","```md","Lantern","Whisper","Velvet","Orbit","Timber","Quiver","Mosaic","Ember","Spiral","Glimmer","","```","","**󰻛 Created Snapshot** `c410b2b4`","","----","","","The file poem.md has been updated with 10 random words, each on a new line. Task complete! If you need anything else, let me know.","","----","","> 2 messages reverted, 4 tool calls reverted",">","> type `/redo` to restore.",""," poem.md: -20"],"timestamp":1760961403} \ No newline at end of file +{"extmarks":[[1,2,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-19 17:50:43)","OpencodeHint"],[" [msg_9fd985573001fk1Xlot7uyDgTo]","OpencodeHint"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"ns_id":3,"priority":10}],[2,3,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[3,4,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[4,5,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[5,6,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[6,9,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" (2025-10-19 17:50:44)","OpencodeHint"],[" [msg_9fd985a4d001wOX3Op7CpFiCTq]","OpencodeHint"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"ns_id":3,"priority":10}],[7,27,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-19 17:50:57)","OpencodeHint"],[" [msg_9fd988c92001w0IZCVPQsN6xa9]","OpencodeHint"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"ns_id":3,"priority":10}],[8,28,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[9,29,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[10,32,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" (2025-10-19 17:50:57)","OpencodeHint"],[" [msg_9fd988ca7001lgaGttpI4YeGSA]","OpencodeHint"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"ns_id":3,"priority":10}],[11,38,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[12,39,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[13,40,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[14,41,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[15,42,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[16,43,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[17,44,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[18,45,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[19,46,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[20,47,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[21,48,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[22,49,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[23,50,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[24,51,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[25,52,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096}],[26,57,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" (2025-10-19 17:50:59)","OpencodeHint"],[" [msg_9fd98942d001elqd2sd8CZeOoA]","OpencodeHint"]],"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"ns_id":3,"priority":10}],[27,67,0,{"virt_text_pos":"win_col","virt_text_hide":false,"right_gravity":true,"virt_text":[["-20","OpencodeDiffDeleteText"]],"virt_text_win_col":11,"virt_text_repeat_linebreak":false,"ns_id":3,"priority":1000}]],"actions":[{"type":"diff_revert_selected_file","display_line":55,"args":["c410b2b4024de020aea223c5248eec89216de53f"],"range":{"from":55,"to":55},"key":"R","text":"[R]evert file"},{"type":"diff_revert_all","display_line":55,"args":["c410b2b4024de020aea223c5248eec89216de53f"],"range":{"from":55,"to":55},"key":"A","text":"Revert [A]ll"},{"type":"diff_open","display_line":55,"args":["c410b2b4024de020aea223c5248eec89216de53f"],"range":{"from":55,"to":55},"key":"D","text":"[D]iff"}],"timestamp":1761711021,"lines":["","----","","","write 10 random words","","[poem.md](poem.md)","","----","","","Here are 10 random words:","","1. Lantern ","2. Whisper ","3. Velvet ","4. Orbit ","5. Timber ","6. Quiver ","7. Mosaic ","8. Ember ","9. Spiral ","10. Glimmer","","Let me know if you need them in a specific format or want to use them in a file!","","----","","","write 10 random words to the file","","----","","","I will write 10 random words to poem.md, each on a new line.","","Proceeding to update the file now.","","** write** `poem.md`","","`````markdown","Lantern","Whisper","Velvet","Orbit","Timber","Quiver","Mosaic","Ember","Spiral","Glimmer","","`````","","**󰻛 Created Snapshot** `c410b2b4`","","----","","","The file poem.md has been updated with 10 random words, each on a new line. Task complete! If you need anything else, let me know.","","----","","> 2 messages reverted, 4 tool calls reverted",">","> type `/redo` to restore.",""," poem.md: -20"]} \ No newline at end of file diff --git a/tests/data/selection.expected.json b/tests/data/selection.expected.json index 1db2d3de..8df89fe6 100644 --- a/tests/data/selection.expected.json +++ b/tests/data/selection.expected.json @@ -1 +1 @@ -{"extmarks":[[1,2,0,{"virt_text_repeat_linebreak":false,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-18 05:02:28)","OpencodeHint"],[" [msg_9f5b29fea001z6jYXF7CG9omHa]","OpencodeHint"]],"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_win_col":-3,"priority":10,"ns_id":3}],[2,3,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3}],[3,4,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3}],[4,5,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3}],[5,6,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3}],[6,7,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3}],[7,8,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3}],[8,9,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3}],[9,9,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3}],[10,10,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3}],[11,11,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3}],[12,12,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3}],[13,13,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3}],[14,13,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3}],[15,14,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3}],[16,17,0,{"virt_text_repeat_linebreak":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-18 05:02:28)","OpencodeHint"],[" [msg_9f5b2a039001xop8ITmXQq0Gjh]","OpencodeHint"]],"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_win_col":-3,"priority":10,"ns_id":3}]],"timestamp":1760763898,"lines":["","----","","","here's some context","","```txt","this is a string","```","","```txt","this is a selection test","```","","[diff-test.txt](diff-test.txt)","","----","","","I can see the file `/Users/cam/tmp/a/diff-test.txt` contains \"this is a string\" on line 1.","","The two selection contexts you provided show:","1. Current content: \"this is a string\"","2. Expected/desired content: \"this is a selection test\"","","Since I'm in read-only mode, I can only observe that there's a difference between what's currently in the file and what one of the selections indicates should be there.",""]} \ No newline at end of file +{"lines":["","----","","","here's some context","","```txt","this is a string","```","","```txt","this is a selection test","```","","[diff-test.txt](diff-test.txt)","","----","","","I can see the file `/Users/cam/tmp/a/diff-test.txt` contains \"this is a string\" on line 1.","","The two selection contexts you provided show:","1. Current content: \"this is a string\"","2. Expected/desired content: \"this is a selection test\"","","Since I'm in read-only mode, I can only observe that there's a difference between what's currently in the file and what one of the selections indicates should be there.",""],"extmarks":[[1,2,0,{"ns_id":3,"right_gravity":true,"priority":10,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-18 05:02:28)","OpencodeHint"],[" [msg_9f5b29fea001z6jYXF7CG9omHa]","OpencodeHint"]],"virt_text_pos":"win_col"}],[2,3,0,{"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[3,4,0,{"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[4,5,0,{"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[5,6,0,{"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[6,7,0,{"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[7,8,0,{"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[8,9,0,{"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[9,9,0,{"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[10,10,0,{"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[11,11,0,{"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[12,12,0,{"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[13,13,0,{"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[14,13,0,{"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[15,14,0,{"ns_id":3,"right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[16,17,0,{"ns_id":3,"right_gravity":true,"priority":10,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-18 05:02:28)","OpencodeHint"],[" [msg_9f5b2a039001xop8ITmXQq0Gjh]","OpencodeHint"]],"virt_text_pos":"win_col"}]],"timestamp":1761708194,"actions":[]} \ No newline at end of file diff --git a/tests/data/shifting-and-multiple-perms.expected.json b/tests/data/shifting-and-multiple-perms.expected.json index 189b38e0..1efd9a3d 100644 --- a/tests/data/shifting-and-multiple-perms.expected.json +++ b/tests/data/shifting-and-multiple-perms.expected.json @@ -1 +1 @@ -{"timestamp":1760681258,"lines":["","----","","","no, i want the extra line added when i've streamed the most recent part but i don't want it still there when i add the next part. i.e. i want an extra blank line at the end","","[lua/opencode/ui/renderer.lua](lua/opencode/ui/renderer.lua)","","----","","","Ah, I understand now! You want:","1. An extra blank line at the very end of the buffer when content has been streamed","2. But when **new** content is about to be added, remove that extra blank line first (so the new content doesn't have an awkward gap above it)","","This is a \"trailing spacer\" that should only exist when we're \"done\" with the current output, but gets removed before adding more.","","Here's the approach:","","## Solution","","Add tracking for whether a trailing blank line exists, and:","- **Add** a blank line after writing new content (in `_write_formatted_data`)","- **Remove** the trailing blank line before writing new content (also in `_write_formatted_data`)","","### Changes needed in `renderer.lua`:","","1. **Add state tracking** (after line 14):"," ```lua"," M._has_trailing_line = false"," ```","","2. **Reset the flag** in `M.reset()` (after line 21):"," ```lua"," M._has_trailing_line = false"," ```","","3. **Modify `_write_formatted_data`** (around line 247-276):"," - Before writing: remove trailing line if it exists"," - After writing: add a new trailing line"," "," ```lua"," function M._write_formatted_data(formatted_data)"," local buf = state.windows.output_buf"," local start_line = output_window.get_buf_line_count()"," "," -- Remove trailing blank line before adding new content"," if M._has_trailing_line and start_line > 0 then"," output_window.set_lines({}, start_line - 1, start_line)"," start_line = start_line - 1"," M._has_trailing_line = false"," end"," "," local new_lines = formatted_data.lines"," local extmarks = formatted_data.extmarks"," "," if #new_lines == 0 or not buf then"," return nil"," end"," "," -- [existing action extraction code...]"," "," output_window.set_lines(new_lines, start_line)"," output_window.set_extmarks(extmarks, start_line)"," "," -- Add trailing blank line after writing"," local end_line = start_line + #new_lines"," output_window.set_lines({''}, end_line)"," M._has_trailing_line = true"," "," return {"," line_start = start_line,"," line_end = start_line + #new_lines - 1,"," }"," end"," ```","","This way:","- ✅ Extra blank line appears after streaming content","- ✅ Gets removed automatically before next content is added","- ✅ No gap between messages","- ✅ Always has visual spacing at the bottom","","----","","","but i'd only want to do that for things added to the end","","----","","","Ah yes, you're right! The trailing blank line should only be added/removed when writing to the **end** of the buffer, not when doing replacements in the middle (like `_replace_part_in_buffer`).","","Let me trace through the code:","","1. **`_write_formatted_data`** - writes at end (line 247-276)","2. **`_insert_part_to_buffer`** - calls `_write_formatted_data`, so writes at end (line 282-300)","3. **`_replace_part_in_buffer`** - replaces in middle of buffer (line 307-353)","","So the logic should be:","- In **`_write_formatted_data`**: Remove trailing line before writing (if exists), then add it back after","- In **`_replace_part_in_buffer`**: Don't touch the trailing line at all","- In **`render_output`**: This sets the entire buffer, so no trailing line management needed","","The key insight is that `_write_formatted_data` is specifically for appending to the end (line 249: `start_line = output_window.get_buf_line_count()`), so that's the only place where we need to:","1. Remove the trailing blank line first (if it exists)","2. Write the new content","3. Add a new trailing blank line","","Does that match what you want? The trailing line only exists at the very end, and only gets managed when appending new content to the end.","","----","","","yes","","----","","","** edit** `renderer.lua`","","** edit** `renderer.lua`","","** edit** `renderer.lua`","","```lua"," ---@return {line_start: integer, line_end: integer}? Range where data was written"," function M._write_formatted_data(formatted_data)"," local buf = state.windows.output_buf"," local start_line = output_window.get_buf_line_count()"," "," -- Remove trailing blank line before adding new content"," if M._has_trailing_line and start_line > 0 then"," output_window.set_lines({}, start_line - 1, start_line)"," start_line = start_line - 1"," M._has_trailing_line = false"," end"," "," local new_lines = formatted_data.lines"," local extmarks = formatted_data.extmarks"," "," if #new_lines == 0 or not buf then","@@ -268,8 +276,13 @@"," "," output_window.set_lines(new_lines, start_line)"," output_window.set_extmarks(extmarks, start_line)"," "," -- Add trailing blank line after writing"," local end_line = start_line + #new_lines"," output_window.set_lines({''}, end_line)"," M._has_trailing_line = true"," "," return {"," line_start = start_line,"," line_end = start_line + #new_lines - 1,"," }","","```","","> [!WARNING] Permission required to run this tool.",">","> Accept `a` Always `A` Deny `d`",""],"actions":[],"extmarks":[[1,2,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":10,"ns_id":3,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-17 01:05:49)","OpencodeHint"],[" [msg_9efb39d68001J2h30a50B2774b]","OpencodeHint"]],"virt_text_pos":"win_col"}],[2,3,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[3,4,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[4,5,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[5,6,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[6,9,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":10,"ns_id":3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-17 01:05:50)","OpencodeHint"],[" [msg_9efb39dc3002f81rMRqF2WO1UU]","OpencodeHint"]],"virt_text_pos":"win_col"}],[7,84,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":10,"ns_id":3,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-17 01:07:23)","OpencodeHint"],[" [msg_9efb50a0b001WFK7AMDV45cF8Z]","OpencodeHint"]],"virt_text_pos":"win_col"}],[8,85,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[9,86,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[10,89,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":10,"ns_id":3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-17 01:07:23)","OpencodeHint"],[" [msg_9efb50a2a002dzMgbQnasd86o1]","OpencodeHint"]],"virt_text_pos":"win_col"}],[11,112,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":10,"ns_id":3,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-17 01:08:01)","OpencodeHint"],[" [msg_9efb59d93001LSm9y0DS9p8cP6]","OpencodeHint"]],"virt_text_pos":"win_col"}],[12,113,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[13,114,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[14,117,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_win_col":-3,"virt_text_hide":false,"priority":10,"ns_id":3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-17 01:08:01)","OpencodeHint"],[" [msg_9efb59db4002uWmyFRTjRIhIaQ]","OpencodeHint"]],"virt_text_pos":"win_col"}],[15,123,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[16,124,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[17,125,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[18,126,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[19,127,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[20,128,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[21,129,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[22,130,0,{"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","priority":5000,"ns_id":3,"hl_group":"OpencodeDiffAdd","end_col":0,"end_row":131}],[23,130,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[24,131,0,{"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","priority":5000,"ns_id":3,"hl_group":"OpencodeDiffAdd","end_col":0,"end_row":132}],[25,131,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[26,132,0,{"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","priority":5000,"ns_id":3,"hl_group":"OpencodeDiffAdd","end_col":0,"end_row":133}],[27,132,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[28,133,0,{"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","priority":5000,"ns_id":3,"hl_group":"OpencodeDiffAdd","end_col":0,"end_row":134}],[29,133,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[30,134,0,{"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","priority":5000,"ns_id":3,"hl_group":"OpencodeDiffAdd","end_col":0,"end_row":135}],[31,134,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[32,135,0,{"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","priority":5000,"ns_id":3,"hl_group":"OpencodeDiffAdd","end_col":0,"end_row":136}],[33,135,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[34,136,0,{"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","priority":5000,"ns_id":3,"hl_group":"OpencodeDiffAdd","end_col":0,"end_row":137}],[35,136,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[36,137,0,{"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","priority":5000,"ns_id":3,"hl_group":"OpencodeDiffAdd","end_col":0,"end_row":138}],[37,137,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[38,138,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[39,139,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[40,140,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[41,141,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[42,142,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[43,143,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[44,144,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[45,145,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[46,146,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[47,147,0,{"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","priority":5000,"ns_id":3,"hl_group":"OpencodeDiffAdd","end_col":0,"end_row":148}],[48,147,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[49,148,0,{"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","priority":5000,"ns_id":3,"hl_group":"OpencodeDiffAdd","end_col":0,"end_row":149}],[50,148,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[51,149,0,{"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","priority":5000,"ns_id":3,"hl_group":"OpencodeDiffAdd","end_col":0,"end_row":150}],[52,149,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[53,150,0,{"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","priority":5000,"ns_id":3,"hl_group":"OpencodeDiffAdd","end_col":0,"end_row":151}],[54,150,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[55,151,0,{"hl_eol":true,"right_gravity":true,"end_right_gravity":false,"virt_text_hide":false,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","priority":5000,"ns_id":3,"hl_group":"OpencodeDiffAdd","end_col":0,"end_row":152}],[56,151,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[57,152,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[58,153,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[59,154,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[60,155,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[61,156,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[62,157,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[63,158,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[64,159,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[65,160,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[66,161,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}],[67,162,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-1,"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col"}]]} \ No newline at end of file +{"extmarks":[[1,2,0,{"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-17 01:05:49)","OpencodeHint"],[" [msg_9efb39d68001J2h30a50B2774b]","OpencodeHint"]],"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"right_gravity":true,"priority":10,"virt_text_pos":"win_col","ns_id":3}],[2,3,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[3,4,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[4,5,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[5,6,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[6,9,0,{"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-17 01:05:50)","OpencodeHint"],[" [msg_9efb39dc3002f81rMRqF2WO1UU]","OpencodeHint"]],"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"right_gravity":true,"priority":10,"virt_text_pos":"win_col","ns_id":3}],[7,84,0,{"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-17 01:07:23)","OpencodeHint"],[" [msg_9efb50a0b001WFK7AMDV45cF8Z]","OpencodeHint"]],"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"right_gravity":true,"priority":10,"virt_text_pos":"win_col","ns_id":3}],[8,85,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[9,86,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[10,89,0,{"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-17 01:07:23)","OpencodeHint"],[" [msg_9efb50a2a002dzMgbQnasd86o1]","OpencodeHint"]],"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"right_gravity":true,"priority":10,"virt_text_pos":"win_col","ns_id":3}],[11,112,0,{"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-17 01:08:01)","OpencodeHint"],[" [msg_9efb59d93001LSm9y0DS9p8cP6]","OpencodeHint"]],"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"right_gravity":true,"priority":10,"virt_text_pos":"win_col","ns_id":3}],[12,113,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[13,114,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[14,117,0,{"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-17 01:08:01)","OpencodeHint"],[" [msg_9efb59db4002uWmyFRTjRIhIaQ]","OpencodeHint"]],"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"right_gravity":true,"priority":10,"virt_text_pos":"win_col","ns_id":3}],[15,123,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[16,124,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[17,125,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[18,126,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[19,127,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[20,128,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[21,129,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[22,130,0,{"hl_group":"OpencodeDiffAdd","virt_text_hide":false,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","end_row":131,"priority":5000,"right_gravity":true,"end_right_gravity":false,"end_col":0,"hl_eol":true}],[23,130,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[24,131,0,{"hl_group":"OpencodeDiffAdd","virt_text_hide":false,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","end_row":132,"priority":5000,"right_gravity":true,"end_right_gravity":false,"end_col":0,"hl_eol":true}],[25,131,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[26,132,0,{"hl_group":"OpencodeDiffAdd","virt_text_hide":false,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","end_row":133,"priority":5000,"right_gravity":true,"end_right_gravity":false,"end_col":0,"hl_eol":true}],[27,132,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[28,133,0,{"hl_group":"OpencodeDiffAdd","virt_text_hide":false,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","end_row":134,"priority":5000,"right_gravity":true,"end_right_gravity":false,"end_col":0,"hl_eol":true}],[29,133,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[30,134,0,{"hl_group":"OpencodeDiffAdd","virt_text_hide":false,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","end_row":135,"priority":5000,"right_gravity":true,"end_right_gravity":false,"end_col":0,"hl_eol":true}],[31,134,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[32,135,0,{"hl_group":"OpencodeDiffAdd","virt_text_hide":false,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","end_row":136,"priority":5000,"right_gravity":true,"end_right_gravity":false,"end_col":0,"hl_eol":true}],[33,135,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[34,136,0,{"hl_group":"OpencodeDiffAdd","virt_text_hide":false,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","end_row":137,"priority":5000,"right_gravity":true,"end_right_gravity":false,"end_col":0,"hl_eol":true}],[35,136,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[36,137,0,{"hl_group":"OpencodeDiffAdd","virt_text_hide":false,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","end_row":138,"priority":5000,"right_gravity":true,"end_right_gravity":false,"end_col":0,"hl_eol":true}],[37,137,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[38,138,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[39,139,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[40,140,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[41,141,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[42,142,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[43,143,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[44,144,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[45,145,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[46,146,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[47,147,0,{"hl_group":"OpencodeDiffAdd","virt_text_hide":false,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","end_row":148,"priority":5000,"right_gravity":true,"end_right_gravity":false,"end_col":0,"hl_eol":true}],[48,147,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[49,148,0,{"hl_group":"OpencodeDiffAdd","virt_text_hide":false,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","end_row":149,"priority":5000,"right_gravity":true,"end_right_gravity":false,"end_col":0,"hl_eol":true}],[50,148,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[51,149,0,{"hl_group":"OpencodeDiffAdd","virt_text_hide":false,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","end_row":150,"priority":5000,"right_gravity":true,"end_right_gravity":false,"end_col":0,"hl_eol":true}],[52,149,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[53,150,0,{"hl_group":"OpencodeDiffAdd","virt_text_hide":false,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","end_row":151,"priority":5000,"right_gravity":true,"end_right_gravity":false,"end_col":0,"hl_eol":true}],[54,150,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[55,151,0,{"hl_group":"OpencodeDiffAdd","virt_text_hide":false,"virt_text_repeat_linebreak":false,"ns_id":3,"virt_text":[["+","OpencodeDiffAdd"]],"virt_text_pos":"overlay","end_row":152,"priority":5000,"right_gravity":true,"end_right_gravity":false,"end_col":0,"hl_eol":true}],[56,151,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[57,152,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[58,153,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[59,154,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[60,155,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[61,156,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[62,157,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[63,158,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[64,159,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[65,160,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[66,161,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}],[67,162,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"virt_text_win_col":-1,"virt_text_repeat_linebreak":true,"right_gravity":true,"priority":4096,"virt_text_pos":"win_col","ns_id":3}]],"lines":["","----","","","no, i want the extra line added when i've streamed the most recent part but i don't want it still there when i add the next part. i.e. i want an extra blank line at the end","","[lua/opencode/ui/renderer.lua](lua/opencode/ui/renderer.lua)","","----","","","Ah, I understand now! You want:","1. An extra blank line at the very end of the buffer when content has been streamed","2. But when **new** content is about to be added, remove that extra blank line first (so the new content doesn't have an awkward gap above it)","","This is a \"trailing spacer\" that should only exist when we're \"done\" with the current output, but gets removed before adding more.","","Here's the approach:","","## Solution","","Add tracking for whether a trailing blank line exists, and:","- **Add** a blank line after writing new content (in `_write_formatted_data`)","- **Remove** the trailing blank line before writing new content (also in `_write_formatted_data`)","","### Changes needed in `renderer.lua`:","","1. **Add state tracking** (after line 14):"," ```lua"," M._has_trailing_line = false"," ```","","2. **Reset the flag** in `M.reset()` (after line 21):"," ```lua"," M._has_trailing_line = false"," ```","","3. **Modify `_write_formatted_data`** (around line 247-276):"," - Before writing: remove trailing line if it exists"," - After writing: add a new trailing line"," "," ```lua"," function M._write_formatted_data(formatted_data)"," local buf = state.windows.output_buf"," local start_line = output_window.get_buf_line_count()"," "," -- Remove trailing blank line before adding new content"," if M._has_trailing_line and start_line > 0 then"," output_window.set_lines({}, start_line - 1, start_line)"," start_line = start_line - 1"," M._has_trailing_line = false"," end"," "," local new_lines = formatted_data.lines"," local extmarks = formatted_data.extmarks"," "," if #new_lines == 0 or not buf then"," return nil"," end"," "," -- [existing action extraction code...]"," "," output_window.set_lines(new_lines, start_line)"," output_window.set_extmarks(extmarks, start_line)"," "," -- Add trailing blank line after writing"," local end_line = start_line + #new_lines"," output_window.set_lines({''}, end_line)"," M._has_trailing_line = true"," "," return {"," line_start = start_line,"," line_end = start_line + #new_lines - 1,"," }"," end"," ```","","This way:","- ✅ Extra blank line appears after streaming content","- ✅ Gets removed automatically before next content is added","- ✅ No gap between messages","- ✅ Always has visual spacing at the bottom","","----","","","but i'd only want to do that for things added to the end","","----","","","Ah yes, you're right! The trailing blank line should only be added/removed when writing to the **end** of the buffer, not when doing replacements in the middle (like `_replace_part_in_buffer`).","","Let me trace through the code:","","1. **`_write_formatted_data`** - writes at end (line 247-276)","2. **`_insert_part_to_buffer`** - calls `_write_formatted_data`, so writes at end (line 282-300)","3. **`_replace_part_in_buffer`** - replaces in middle of buffer (line 307-353)","","So the logic should be:","- In **`_write_formatted_data`**: Remove trailing line before writing (if exists), then add it back after","- In **`_replace_part_in_buffer`**: Don't touch the trailing line at all","- In **`render_output`**: This sets the entire buffer, so no trailing line management needed","","The key insight is that `_write_formatted_data` is specifically for appending to the end (line 249: `start_line = output_window.get_buf_line_count()`), so that's the only place where we need to:","1. Remove the trailing blank line first (if it exists)","2. Write the new content","3. Add a new trailing blank line","","Does that match what you want? The trailing line only exists at the very end, and only gets managed when appending new content to the end.","","----","","","yes","","----","","","** edit** `renderer.lua`","","** edit** `renderer.lua`","","** edit** `renderer.lua`","","`````lua"," ---@return {line_start: integer, line_end: integer}? Range where data was written"," function M._write_formatted_data(formatted_data)"," local buf = state.windows.output_buf"," local start_line = output_window.get_buf_line_count()"," "," -- Remove trailing blank line before adding new content"," if M._has_trailing_line and start_line > 0 then"," output_window.set_lines({}, start_line - 1, start_line)"," start_line = start_line - 1"," M._has_trailing_line = false"," end"," "," local new_lines = formatted_data.lines"," local extmarks = formatted_data.extmarks"," "," if #new_lines == 0 or not buf then","@@ -268,8 +276,13 @@"," "," output_window.set_lines(new_lines, start_line)"," output_window.set_extmarks(extmarks, start_line)"," "," -- Add trailing blank line after writing"," local end_line = start_line + #new_lines"," output_window.set_lines({''}, end_line)"," M._has_trailing_line = true"," "," return {"," line_start = start_line,"," line_end = start_line + #new_lines - 1,"," }","","`````","","> [!WARNING] Permission required to run this tool.",">","> Accept `a` Always `A` Deny `d`",""],"timestamp":1761708194,"actions":[]} \ No newline at end of file diff --git a/tests/data/simple-session.expected.json b/tests/data/simple-session.expected.json index 6103fe87..9f7a5811 100644 --- a/tests/data/simple-session.expected.json +++ b/tests/data/simple-session.expected.json @@ -1 +1 @@ -{"timestamp":1760658431,"lines":["","----","","","only answer the following, nothing else:","","1","","[a-empty.txt](a-empty.txt)","","----","","","1",""],"actions":[],"extmarks":[[1,2,0,{"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":false,"ns_id":3,"priority":10,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-10 19:18:25)","OpencodeHint"],[" [msg_9cf8f64de0016tbfTQqWMydbdr]","OpencodeHint"]],"virt_text_win_col":-3,"virt_text_pos":"win_col"}],[2,3,0,{"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"virt_text_pos":"win_col"}],[3,4,0,{"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"virt_text_pos":"win_col"}],[4,5,0,{"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"virt_text_pos":"win_col"}],[5,6,0,{"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"virt_text_pos":"win_col"}],[6,7,0,{"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"virt_text_pos":"win_col"}],[7,8,0,{"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":true,"ns_id":3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_win_col":-3,"virt_text_pos":"win_col"}],[8,11,0,{"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":false,"ns_id":3,"priority":10,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4","OpencodeHint"],[" (2025-10-10 19:18:25)","OpencodeHint"],[" [msg_9cf8f6549001tpoRuqkwS4Rxtl]","OpencodeHint"]],"virt_text_win_col":-3,"virt_text_pos":"win_col"}]]} \ No newline at end of file +{"timestamp":1761708194,"actions":[],"lines":["","----","","","only answer the following, nothing else:","","1","","[a-empty.txt](a-empty.txt)","","----","","","1",""],"extmarks":[[1,2,0,{"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-10 19:18:25)","OpencodeHint"],[" [msg_9cf8f64de0016tbfTQqWMydbdr]","OpencodeHint"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"virt_text_pos":"win_col","priority":10}],[2,3,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[3,4,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[4,5,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[5,6,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[6,7,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[7,8,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":true,"virt_text_pos":"win_col","priority":4096}],[8,11,0,{"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4","OpencodeHint"],[" (2025-10-10 19:18:25)","OpencodeHint"],[" [msg_9cf8f6549001tpoRuqkwS4Rxtl]","OpencodeHint"]],"right_gravity":true,"ns_id":3,"virt_text_hide":false,"virt_text_win_col":-3,"virt_text_repeat_linebreak":false,"virt_text_pos":"win_col","priority":10}]]} \ No newline at end of file diff --git a/tests/data/tool-invalid.expected.json b/tests/data/tool-invalid.expected.json index fcecb25e..2961995a 100644 --- a/tests/data/tool-invalid.expected.json +++ b/tests/data/tool-invalid.expected.json @@ -1 +1 @@ -{"extmarks":[[1,2,0,{"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-13 20:10:06)","OpencodeHint"],[" [msg_9df31cc90001HGn2UbFUgqJnLr]","OpencodeHint"]],"virt_text_hide":false,"priority":10,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"ns_id":3,"virt_text_pos":"win_col","right_gravity":true}],[2,4,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"ns_id":3,"virt_text_pos":"win_col","right_gravity":true}],[3,5,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"ns_id":3,"virt_text_pos":"win_col","right_gravity":true}],[4,6,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"ns_id":3,"virt_text_pos":"win_col","right_gravity":true}],[5,7,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"ns_id":3,"virt_text_pos":"win_col","right_gravity":true}],[6,8,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"ns_id":3,"virt_text_pos":"win_col","right_gravity":true}],[7,9,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"priority":4096,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"ns_id":3,"virt_text_pos":"win_col","right_gravity":true}]],"timestamp":1760658432,"lines":["","----","","","** tool** `invalid`","","> [!ERROR]",">","> Invalid input for tool edit: JSON parsing failed: Text: {\"filePath\": \"/Users/cam/Dev/neovim-dev/opencode.nvim/lua/opencode/ui/streaming_renderer.lua\", \"newString\": \"---Event handler for permission.replied events\\n---Re-renders part after permission is resolved\\n---@param event table Event object\\nfunctio.","> Error message: JSON Parse error: Unterminated string",""],"actions":[]} \ No newline at end of file +{"lines":["","----","","","** tool** `invalid`","","> [!ERROR]",">","> Invalid input for tool edit: JSON parsing failed: Text: {\"filePath\": \"/Users/cam/Dev/neovim-dev/opencode.nvim/lua/opencode/ui/streaming_renderer.lua\", \"newString\": \"---Event handler for permission.replied events\\n---Re-renders part after permission is resolved\\n---@param event table Event object\\nfunctio.","> Error message: JSON Parse error: Unterminated string",""],"timestamp":1761708194,"extmarks":[[1,2,0,{"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" (2025-10-13 20:10:06)","OpencodeHint"],[" [msg_9df31cc90001HGn2UbFUgqJnLr]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"ns_id":3,"right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text_hide":false,"priority":10}],[2,4,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"ns_id":3,"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_hide":false,"priority":4096}],[3,5,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"ns_id":3,"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_hide":false,"priority":4096}],[4,6,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"ns_id":3,"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_hide":false,"priority":4096}],[5,7,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"ns_id":3,"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_hide":false,"priority":4096}],[6,8,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"ns_id":3,"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_hide":false,"priority":4096}],[7,9,0,{"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"ns_id":3,"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_hide":false,"priority":4096}]],"actions":[]} \ No newline at end of file diff --git a/tests/data/updating-text.expected.json b/tests/data/updating-text.expected.json index e3562050..ce6bc6cf 100644 --- a/tests/data/updating-text.expected.json +++ b/tests/data/updating-text.expected.json @@ -1 +1 @@ -{"extmarks":[[1,2,0,{"ns_id":3,"virt_text_repeat_linebreak":false,"priority":10,"right_gravity":true,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-10 22:06:43)","OpencodeHint"],[" [msg_9d0297a630014CA5ly3Vvw8Kt5]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-3}],[2,3,0,{"ns_id":3,"virt_text_repeat_linebreak":true,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-3}],[3,4,0,{"ns_id":3,"virt_text_repeat_linebreak":true,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-3}],[4,5,0,{"ns_id":3,"virt_text_repeat_linebreak":true,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-3}],[5,6,0,{"ns_id":3,"virt_text_repeat_linebreak":true,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-3}],[6,9,0,{"ns_id":3,"virt_text_repeat_linebreak":false,"priority":10,"right_gravity":true,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4","OpencodeHint"],[" (2025-10-10 22:06:43)","OpencodeHint"],[" [msg_9d0297ab3001UGZU9fDJM4Y75w]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_win_col":-3}]],"lines":["","----","","","What would a new neovim lua plugin look like?","","[a-empty.txt](a-empty.txt)","","----","","","A new Neovim Lua plugin typically follows this structure:","","```","plugin-name/","├── lua/","│ └── plugin-name/","│ ├── init.lua -- Main entry point","│ ├── config.lua -- Configuration handling","│ └── utils.lua -- Utility functions","├── plugin/","│ └── plugin-name.lua -- Plugin registration","└── README.md","```","","**Minimal example:**","","`plugin/example.lua`:","```lua","if vim.g.loaded_example then"," return","end","vim.g.loaded_example = 1","","vim.api.nvim_create_user_command('Example', function()"," require('example').hello()","end, {})","```","","`lua/example/init.lua`:","```lua","local M = {}","","M.setup = function(opts)"," opts = opts or {}"," -- Handle configuration","end","","M.hello = function()"," print(\"Hello from my plugin!\")","end","","return M","```","","Key components:","- Use `vim.api` for Neovim API calls","- Provide a `setup()` function for configuration","- Create user commands with `nvim_create_user_command`","- Use autocommands with `nvim_create_autocmd`","- Follow Lua module patterns with `local M = {}`",""],"timestamp":1760658433,"actions":[]} \ No newline at end of file +{"extmarks":[[1,2,0,{"ns_id":3,"virt_text_pos":"win_col","right_gravity":true,"priority":10,"virt_text_hide":false,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-10 22:06:43)","OpencodeHint"],[" [msg_9d0297a630014CA5ly3Vvw8Kt5]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_win_col":-3}],[2,3,0,{"ns_id":3,"virt_text_pos":"win_col","right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_win_col":-3}],[3,4,0,{"ns_id":3,"virt_text_pos":"win_col","right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_win_col":-3}],[4,5,0,{"ns_id":3,"virt_text_pos":"win_col","right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_win_col":-3}],[5,6,0,{"ns_id":3,"virt_text_pos":"win_col","right_gravity":true,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_win_col":-3}],[6,9,0,{"ns_id":3,"virt_text_pos":"win_col","right_gravity":true,"priority":10,"virt_text_hide":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4","OpencodeHint"],[" (2025-10-10 22:06:43)","OpencodeHint"],[" [msg_9d0297ab3001UGZU9fDJM4Y75w]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_win_col":-3}]],"lines":["","----","","","What would a new neovim lua plugin look like?","","[a-empty.txt](a-empty.txt)","","----","","","A new Neovim Lua plugin typically follows this structure:","","```","plugin-name/","├── lua/","│ └── plugin-name/","│ ├── init.lua -- Main entry point","│ ├── config.lua -- Configuration handling","│ └── utils.lua -- Utility functions","├── plugin/","│ └── plugin-name.lua -- Plugin registration","└── README.md","```","","**Minimal example:**","","`plugin/example.lua`:","```lua","if vim.g.loaded_example then"," return","end","vim.g.loaded_example = 1","","vim.api.nvim_create_user_command('Example', function()"," require('example').hello()","end, {})","```","","`lua/example/init.lua`:","```lua","local M = {}","","M.setup = function(opts)"," opts = opts or {}"," -- Handle configuration","end","","M.hello = function()"," print(\"Hello from my plugin!\")","end","","return M","```","","Key components:","- Use `vim.api` for Neovim API calls","- Provide a `setup()` function for configuration","- Create user commands with `nvim_create_user_command`","- Use autocommands with `nvim_create_autocmd`","- Follow Lua module patterns with `local M = {}`",""],"actions":[],"timestamp":1761708195} \ No newline at end of file diff --git a/tests/unit/renderer_spec.lua b/tests/unit/renderer_spec.lua index e2c1caa3..b1bee192 100644 --- a/tests/unit/renderer_spec.lua +++ b/tests/unit/renderer_spec.lua @@ -3,6 +3,7 @@ local ui = require('opencode.ui.ui') local helpers = require('tests.helpers') local output_window = require('opencode.ui.output_window') local assert = require('luassert') +local config = require('opencode.config') local function assert_output_matches(expected, actual, name) local normalized_extmarks = helpers.normalize_namespace_ids(actual.extmarks) @@ -120,19 +121,29 @@ describe('renderer', function() local expected_path = 'tests/data/' .. name .. '.expected.json' if vim.fn.filereadable(expected_path) == 1 then - it('replays ' .. name .. ' correctly (event-by-event)', function() - local events = helpers.load_test_data(filepath) - state.active_session = helpers.get_session_from_events(events) - local expected = helpers.load_test_data(expected_path) - - helpers.replay_events(events) - vim.wait(1000, function() - return vim.tbl_isempty(state.event_manager.throttling_emitter.queue) - end) - - local actual = helpers.capture_output(state.windows and state.windows.output_buf, output_window.namespace) - assert_output_matches(expected, actual, name) - end) + for i = 1, 2 do + config.ui.output.rendering.event_collapsing = i == 1 and true or false + it( + 'replays ' + .. name + .. ' correctly (event-by-event, ' + .. (config.ui.output.rendering.event_collapsing and 'collapsing' or 'no collapsing') + .. ')', + function() + local events = helpers.load_test_data(filepath) + state.active_session = helpers.get_session_from_events(events) + local expected = helpers.load_test_data(expected_path) + + helpers.replay_events(events) + vim.wait(1000, function() + return vim.tbl_isempty(state.event_manager.throttling_emitter.queue) + end) + + local actual = helpers.capture_output(state.windows and state.windows.output_buf, output_window.namespace) + assert_output_matches(expected, actual, name) + end + ) + end if not vim.tbl_contains(skip_full_session, name) then it('replays ' .. name .. ' correctly (session)', function()