diff --git a/.gitignore b/.gitignore index 4821f80d..44490023 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,7 @@ luac.out doc/tags # Test dependencies -deps/ \ No newline at end of file +deps/ + +# Local Claude settings (keep out of repo) +.claude/ diff --git a/lua/opencode/ui/reference_picker.lua b/lua/opencode/ui/reference_picker.lua index 9c618fa3..9f15e5b8 100644 --- a/lua/opencode/ui/reference_picker.lua +++ b/lua/opencode/ui/reference_picker.lua @@ -1,40 +1,28 @@ --- Code reference picker for navigating to file references in LLM responses local state = require('opencode.state') local config = require('opencode.config') local base_picker = require('opencode.ui.base_picker') local icons = require('opencode.ui.icons') +---@class CodeReference +---@field file_path string +---@field line number|nil +---@field col number|nil +---@field match_start number +---@field match_end number + local M = {} ----Check if a file reference is valid ----@param path string File path ----@param context string Surrounding text ----@return boolean -local function is_valid_file_reference(path, context) - -- Reject URLs (but allow file paths that merely contain these substrings) - local lower = context:lower() - -- Match http/https URLs at word boundaries or www.-style URLs - if lower:match('%f[%w]https?://%S+') or lower:match('%f[%w]www%.[%w%-_]+') then - return false - end +local PATTERNS = { + { pat = '`([^`\n]+%.(%w+)):?(%d*):?(%d*)`', check_exists = false }, + { pat = 'file://([%S]+%.(%w+)):?(%d*):?(%d*)', check_exists = false }, + { pat = '([%w_./%-]+/[%w_./%-]*%.(%w+)):?(%d*):?(%d*)', check_exists = false }, + { pat = '([%w_%-]+%.(%w+)):?(%d*):?(%d*)', check_exists = true }, +} - return (path:match('%.[%w]+$') and vim.fn.filereadable(path) == 1) or false -end +local OVERLAP = 128 +local cache = {} +local exists_cache = {} ----@class CodeReference ----@field file_path string Relative or absolute file path ----@field line number|nil Line number (1-indexed) ----@field column number|nil Column number (optional) ----@field message_id string ID of the message containing this reference ----@field match_start number Start position in original text ----@field match_end number End position in original text ----@field file string Absolute file path (for Snacks picker preview) ----@field pos number[]|nil Position as {line, col} for Snacks picker preview ----@field end_pos number[]|nil End position as {line, col} for Snacks picker range highlighting - ----Create absolute path from relative path ----@param path string ----@return string local function make_absolute_path(path) if not vim.startswith(path, '/') then return vim.fn.getcwd() .. '/' .. path @@ -42,274 +30,219 @@ local function make_absolute_path(path) return path end ----Create a CodeReference object from parsed components ----@param path string ----@param line number|nil ----@param column number|nil ----@param end_line number|nil ----@param message_id string ----@param match_start number ----@param match_end number ----@return CodeReference -local function create_code_reference(path, line, column, end_line, message_id, match_start, match_end) - local abs_path = make_absolute_path(path) - - return { - file_path = path, - line = line, - column = column, - message_id = message_id, - match_start = match_start, - match_end = match_end, - file = abs_path, - pos = line and { line, (column or 1) - 1 } or nil, - end_pos = end_line and { end_line, 0 } or nil, - } -end - ----Parse line, column, and range information from pattern captures ----@param line_str string ----@param col_or_end_str string ----@param end_line_str string ----@return number|nil line, number|nil column, number|nil end_line -local function parse_position_info(line_str, col_or_end_str, end_line_str) - local line = line_str ~= '' and tonumber(line_str) or nil - local column = nil - local end_line = nil - - if end_line_str ~= '' then - end_line = tonumber(end_line_str) - elseif col_or_end_str ~= '' then - column = tonumber(col_or_end_str) +local function file_exists(path) + local abs = make_absolute_path(path) + if exists_cache[abs] == nil then + exists_cache[abs] = vim.fn.filereadable(abs) == 1 end - - return line, column, end_line + return exists_cache[abs] end ----Parse file references using a pattern ----@param text string The text to parse ----@param pattern string Lua pattern to match ----@param message_id string The message ID for tracking ----@return CodeReference[] -local function parse_references_with_pattern(text, pattern, message_id) - local references = {} - local search_start = 1 - - while search_start <= #text do - local match_start, match_end, path, line_str, col_or_end_str, end_line_str = text:find(pattern, search_start) - if not match_start then - break - end +local function is_valid_ext(ext) + return #ext >= 1 and #ext <= 5 and ext:match('^%a+$') ~= nil +end - local context_start = math.max(1, match_start - 30) - local context = text:sub(context_start, match_end + 10) +local function is_url_path(path, chunk, ms) + local context = chunk:sub(math.max(1, ms - 64), ms - 1) + return context:match('https?://[%S]*$') + or context:match('www%.[%S]*$') + or path:match('^//') + or path:match('^www%.') + or path:match('^[%w%-]+%.[%w%-]+/') +end - if path and is_valid_file_reference(path, context) then - local line, column, end_line = parse_position_info(line_str, col_or_end_str, end_line_str) - local ref = create_code_reference(path, line, column, end_line, message_id, match_start, match_end) - table.insert(references, ref) +local function overlaps(ranges, abs_ms, abs_me) + for _, r in ipairs(ranges) do + if abs_ms <= r[2] and abs_me >= r[1] then + return true end - - search_start = match_end + 1 end - - return references + return false end ----Parse file references from text using multiple pattern strategies ----@param text string The text to parse ----@param message_id string The message ID for tracking ----@return CodeReference[] -function M.parse_references(text, message_id) - local all_refs = {} - - local patterns = { - '`([^`\n]+%.%w+):?(%d*):?(%d*)-?(%d*)`', -- Backticks: `file.ext:line` - 'file://([%S]+%.%w+):?(%d*):?(%d*)-?(%d*)', -- file:// URIs - '([%w_./%-]+/[%w_./%-]*%.%w+):?(%d*):?(%d*)-?(%d*)', -- Paths with / - '([%w_%-]+%.%w+):?(%d*):?(%d*)-?(%d*)', -- Top-level files +local function make_ref(path, line_str, col_str, abs_start, abs_end) + return { + file_path = path, + line = line_str ~= '' and tonumber(line_str) or nil, + col = col_str ~= '' and tonumber(col_str) or nil, + match_start = abs_start, + match_end = abs_end, } +end - for _, pattern in ipairs(patterns) do - local refs = parse_references_with_pattern(text, pattern, message_id) - vim.list_extend(all_refs, refs) - end - - -- Sort by position and deduplicate - table.sort(all_refs, function(a, b) - return a.match_start < b.match_start - end) - - local deduplicated = {} - for _, ref in ipairs(all_refs) do - local last = deduplicated[#deduplicated] - if not last or ref.match_start > last.match_end then - table.insert(deduplicated, ref) - end - end - - return deduplicated +local function picker_ref_key(path, line) + return make_absolute_path(path) .. ':' .. (line or 0) end ----Collect all references from assistant messages in the current session ----Returns references in reverse order (most recent first) +---@param text string +---@param message_id string ---@return CodeReference[] -function M.collect_references() - local all_references = {} - - if not state.messages then - return all_references - end - - for i = #state.messages, 1, -1 do - local msg = state.messages[i] +function M.parse_references(text, message_id) + local c = cache[message_id] + if not c then + c = { + parsed_upto = 0, + refs = {}, + ranges = {}, + seen_paths = {}, + } + cache[message_id] = c + end + + local len = #text + if len <= c.parsed_upto then + return c.refs + end + + local scan_from = math.max(1, c.parsed_upto - OVERLAP + 1) + local chunk = text:sub(scan_from) + local abs_offset = scan_from - 1 + + for _, entry in ipairs(PATTERNS) do + local pos = 1 + while pos <= #chunk do + local ms, me, path, ext, l, col = chunk:find(entry.pat, pos) + if not ms then + break + end - if msg.info and msg.info.role == 'assistant' then - local refs = msg.references or M._parse_message_references(msg) - for _, ref in ipairs(refs) do - table.insert(all_references, ref) + if is_valid_ext(ext) then + local abs_ms = ms + abs_offset + local abs_me = me + abs_offset + local path_key = path .. ':' .. (l or '') .. ':' .. (col or '') + + if + not is_url_path(path, chunk, ms) + and not c.seen_paths[path_key] + and not overlaps(c.ranges, abs_ms, abs_me) + and (not entry.check_exists or file_exists(path)) + then + c.seen_paths[path_key] = true + table.insert(c.ranges, { abs_ms, abs_me }) + table.insert(c.refs, make_ref(path, l or '', col or '', abs_ms, abs_me)) + end end - end - end - -- Keep first occurrence which is most recent due to reverse iteration - local seen = {} - local deduplicated = {} - for _, ref in ipairs(all_references) do - local normalized_path = vim.fn.fnamemodify(ref.file_path, ':p') - local dedup_key = normalized_path .. ':' .. (ref.line or 0) - if not seen[dedup_key] then - seen[dedup_key] = true - table.insert(deduplicated, ref) + pos = me + 1 end end - return deduplicated + c.parsed_upto = len + return c.refs end ----Parse references from a single message's text parts ----@param msg OpencodeMessage ----@return CodeReference[] -function M._parse_message_references(msg) - local refs = {} - if not msg.parts then - return refs - end - - local message_id = msg.info and msg.info.id or '' - for _, part in ipairs(msg.parts) do - if part.type == 'text' and part.text then - local part_refs = M.parse_references(part.text, message_id) - for _, ref in ipairs(part_refs) do - table.insert(refs, ref) - end - end - - if part.type == 'tool' then - local file_path = vim.tbl_get(part, 'state', 'input', 'filePath') - if file_path and vim.fn.filereadable(file_path) == 1 then - local relative_path = vim.fn.fnamemodify(file_path, ':~:.') - local ref = create_code_reference(relative_path, nil, nil, nil, message_id, 0, 0) - table.insert(refs, ref) - end - end - end - return refs +function M.clear(message_id) + cache[message_id] = nil end ----Parse and cache references for all assistant messages in the current session -function M._parse_session_messages() - if not state.messages then - return - end +function M.clear_all() + cache = {} + exists_cache = {} +end - for _, msg in ipairs(state.messages) do - if msg.info and msg.info.role == 'assistant' and not msg.references then - msg.references = M._parse_message_references(msg) +local function format_reference_item(ref, width) + local icon = icons.get('file') + local location = ref.file_path + if ref.line then + location = location .. ':' .. ref.line + if ref.col then + location = location .. ':' .. ref.col end end + return base_picker.create_time_picker_item(icon .. ' ' .. location, nil, nil, width) end ----Setup reference picker event subscriptions ----Should be called once during plugin initialization -function M.setup() - if state.event_manager then - state.event_manager:subscribe('session.idle', function() - M._parse_session_messages() - end) +local function collect_picker_refs() + if not state.messages then + return {} end - state.store.subscribe('messages', function() - M._parse_session_messages() - end) -end + local seen = {} + local refs = {} ----Format a reference for display in the picker ----@param ref CodeReference ----@param width number|nil ----@return PickerItem -local function format_reference_item(ref, width) - local icon = icons.get('file') - local location = ref.file_path + for i = #state.messages, 1, -1 do + local msg = state.messages[i] + if msg.info and msg.info.role == 'assistant' then + local message_id = msg.info.id + + local c = cache[message_id] + if c then + for _, ref in ipairs(c.refs) do + local key = picker_ref_key(ref.file_path, ref.line) + if not seen[key] then + seen[key] = true + table.insert(refs, ref) + end + end + end - if ref.line then - location = location .. ':' .. ref.line - if ref.end_pos and ref.end_pos[1] then - location = location .. '-' .. ref.end_pos[1] - elseif ref.column then - location = location .. ':' .. ref.column + if msg.parts then + for _, part in ipairs(msg.parts) do + if part.type == 'tool' then + local file_path = vim.tbl_get(part, 'state', 'input', 'filePath') + if file_path and vim.fn.filereadable(file_path) == 1 then + local rel = vim.fn.fnamemodify(file_path, ':~:.') + local key = picker_ref_key(rel, nil) + if not seen[key] then + seen[key] = true + table.insert(refs, make_ref(rel, '', '', 0, 0)) + end + end + end + end + end end end - local display_text = icon .. ' ' .. location - - return base_picker.create_time_picker_item(display_text, nil, nil, width) + return refs end ----Open the reference picker function M.pick() - local references = M.collect_references() - - if #references == 0 then + local refs = collect_picker_refs() + if #refs == 0 then vim.notify('No code references found in the conversation', vim.log.levels.INFO) return end - local callback = function(selected) - if selected then - M.navigate_to(selected) - end - end - return base_picker.pick({ - items = references, + items = refs, format_fn = format_reference_item, actions = {}, - callback = callback, - title = 'Code References (' .. #references .. ')', + callback = function(selected) + if selected then + M.navigate_to(selected) + end + end, + title = 'Code References (' .. #refs .. ')', width = config.ui.picker_width or 100, preview = 'file', layout_opts = config.ui.picker, }) end ----Navigate to a code reference ----@param ref CodeReference function M.navigate_to(ref) local file_path = make_absolute_path(ref.file_path) + if vim.fn.filereadable(file_path) ~= 1 then + vim.notify('File not found: ' .. file_path, vim.log.levels.WARN) + return + end vim.cmd('tabedit ' .. vim.fn.fnameescape(file_path)) - if ref.line then local line = math.max(1, ref.line) - local col = ref.column and math.max(0, ref.column - 1) or 0 - + local col = ref.col and math.max(0, ref.col - 1) or 0 local line_count = vim.api.nvim_buf_line_count(0) - line = math.min(line, line_count) - - vim.api.nvim_win_set_cursor(0, { line, col }) + vim.api.nvim_win_set_cursor(0, { math.min(line, line_count), col }) vim.cmd('normal! zz') end end +---Setup reference picker event subscriptions +---Should be called once during plugin initialization +function M.setup() + state.store.subscribe('messages', function() + M.clear_all() + end) +end + return M diff --git a/tests/data/api-abort.expected.json b/tests/data/api-abort.expected.json index 76f5b5cd..e8ebd5bb 100644 --- a/tests/data/api-abort.expected.json +++ b/tests/data/api-abort.expected.json @@ -1,211 +1 @@ -{ - "actions": [], - "extmarks": [ - [ - 1, - 1, - 0, - { - "ns_id": 3, - "priority": 10, - "right_gravity": true, - "virt_text": [ - [ - "▌󰭻 ", - "OpencodeMessageRoleUser" - ], - [ - " " - ], - [ - "USER", - "OpencodeMessageRoleUser" - ], - [ - "", - "OpencodeHint" - ], - [ - " [msg_a27d8299d001nchmBunYlZcPyL]", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_win_col": -3 - } - ], - [ - 2, - 1, - 0, - { - "ns_id": 3, - "priority": 9, - "right_gravity": true, - "virt_text": [ - [ - " 2025-10-27 22:44:29", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false - } - ], - [ - 3, - 2, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 4, - 3, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 5, - 4, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 6, - 5, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 7, - 8, - 0, - { - "ns_id": 3, - "priority": 10, - "right_gravity": true, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "PLAN", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-4.1", - "OpencodeHint" - ], - [ - " [msg_a27d829f9002sfUFPslHq5P2b4]", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_win_col": -3 - } - ], - [ - 8, - 8, - 0, - { - "ns_id": 3, - "priority": 9, - "right_gravity": true, - "virt_text": [ - [ - " 2025-10-27 22:44:29", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false - } - ] - ], - "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.", - "", - "" - ], - "timestamp": 1770935234 -} \ No newline at end of file +{"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":[],"extmarks":[[1,1,0,{"virt_text_hide":false,"priority":10,"ns_id":3,"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_win_col":-3,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" [msg_a27d8299d001nchmBunYlZcPyL]","OpencodeHint"]],"virt_text_pos":"win_col"}],[2,1,0,{"virt_text_hide":false,"priority":9,"ns_id":3,"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text":[[" 2025-10-27 22:44:29","OpencodeHint"]],"virt_text_pos":"right_align"}],[3,2,0,{"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[4,3,0,{"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[5,4,0,{"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[6,5,0,{"virt_text_hide":false,"priority":4096,"ns_id":3,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_win_col":-3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col"}],[7,8,0,{"virt_text_hide":false,"priority":10,"ns_id":3,"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_win_col":-3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" [msg_a27d829f9002sfUFPslHq5P2b4]","OpencodeHint"]],"virt_text_pos":"win_col"}],[8,8,0,{"virt_text_hide":false,"priority":9,"ns_id":3,"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text":[[" 2025-10-27 22:44:29","OpencodeHint"]],"virt_text_pos":"right_align"}]],"timestamp":1773947710} \ No newline at end of file diff --git a/tests/data/diagnostics.expected.json b/tests/data/diagnostics.expected.json index a4abc10a..f49a6167 100644 --- a/tests/data/diagnostics.expected.json +++ b/tests/data/diagnostics.expected.json @@ -1,11797 +1 @@ -{ - "lines": [ - "----", - "", - "", - "help me fix the file", - "", - "[`lua/opencode/core.lua`](lua/opencode/core.lua)", - "", - "**Diagnostics:**  (3)", - "", - "----", - "", - "", - "Let's address the three EmmyLua diagnostics at line 130 in  `lua/opencode/core.lua`:", - "", - "### 1. `param-type-not-match`: expected `string` but found `string?`", - "- **Location:** `state.active_session.id` (line 130, col 20)", - "- **Cause:** `state.active_session` may be `nil`, so `state.active_session.id` could error or be `nil`. The function expects a `string`, not a nullable string.", - "- **Fix:** Add a nil check for `state.active_session` before accessing `.id`.", - "", - "### 2. `param-type-not-match`: expected `{ agent: string?, messageID: string?, model: {...}?, parts: Part[], system: string?, tools: table<...>? }` but found `{ model = table, agent = any, parts = OpencodeMessagePart[], ... }`", - "- **Location:** `params` argument to `:create_message` (line 130, col 45)", - "- **Cause:** The `model` field in `params` is `{ providerID = string?, modelID = string? }`, but the expected type is `{ modelID: string, providerID: string }?`. The order and possibly the optionality are mismatched.", - "- **Fix:** Ensure the `model` field matches the expected type exactly: `{ modelID: string, providerID: string }`.", - "", - "### 3. `need-check-nil`: `state.active_session may be nil`", - "- **Location:** Same as #1. This is a reminder to check for nil before accessing `state.active_session.id`.", - "", - "---", - "", - "## Step-by-step Fix Plan", - "", - "```markdown", - "- [ ] 1. Add a nil check for `state.active_session` before accessing `.id` in `M.send_message`.", - "- [ ] 2. Ensure the `model` field in `params` matches the expected type `{ modelID: string, providerID: string }`.", - "- [ ] 3. Test the changes to ensure the diagnostics are resolved and the function works as expected.", - "```", - "", - "Let's start with step 1: Add a nil check for `state.active_session` before accessing `.id`.", - "", - "** edit** `/home/francis/Projects/_nvim/opencode.nvim/lua/opencode/core.lua`", - "", - "`````lua", - " ", - " params.parts = context.format_message(prompt, opts.context)", - " M.before_run(opts)", - " ", - " if not state.active_session or not state.active_session.id then", - " vim.notify('No active session to send message to', vim.log.levels.ERROR)", - " return", - " end", - " state.api_client", - " :create_message(state.active_session.id, params)", - " :and_then(function(response)", - " if not response or not response.info or not response.parts then", - "", - "`````", - "", - "**󰻛 Created Snapshot** `8e790371`", - "", - "----", - "", - "", - "Step 1 is complete: nil check for `state.active_session` before accessing `.id` is added.", - "", - "Now, let's address step 2: Ensure the `model` field in `params` matches the expected type `{ modelID: string, providerID: string }`.", - "", - "Currently, the code is:", - "```lua", - "if opts.model then", - " local provider, model = opts.model:match('^(.-)/(.+)$')", - " params.model = { providerID = provider, modelID = model }", - " state.current_model = opts.model", - "end", - "```", - "The expected type is `{ modelID: string, providerID: string }`, but EmmyLua expects the order to be `modelID` first, then `providerID`. Let's update the assignment to match the expected order.", - "", - "I'll fix this now.", - "", - "** edit** `/home/francis/Projects/_nvim/opencode.nvim/lua/opencode/core.lua` 1s", - "", - "`````lua", - " local params = {}", - " ", - " if opts.model then", - " local provider, model = opts.model:match('^(.-)/(.+)$')", - " params.model = { providerID = provider, modelID = model }", - " params.model = { modelID = model, providerID = provider }", - " state.current_model = opts.model", - " end", - " ", - " if opts.agent then", - "", - "`````", - "", - "**󰻛 Created Snapshot** `f33f38a7`", - "", - "----", - "", - "", - "Step 2 is complete: the `model` field in `params` now matches the expected type `{ modelID = model, providerID = provider }`.", - "", - "Now, let's move to step 3: Test the changes to ensure the diagnostics are resolved and the function works as expected.", - "", - "I'll run the test suite using the provided script to verify everything is working.", - "", - "** run** `Run all tests to verify code changes` 3s", - "", - "`````bash", - "> ./run_tests.sh", - "", - "Running tests for opencode.nvim", - "------------------------------------------------", - "Starting...Scheduling: ./tests/minimal/plugin_spec.lua", - "", - "========================================\t", - "Testing: \t/home/francis/Projects/_nvim/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/keymap_spec.lua", - "Scheduling: ./tests/unit/opencode_server_spec.lua", - "Scheduling: ./tests/unit/context_completion_spec.lua", - "Scheduling: ./tests/unit/config_file_spec.lua", - "Scheduling: ./tests/unit/init_spec.lua", - "Scheduling: ./tests/unit/state_spec.lua", - "Scheduling: ./tests/unit/render_state_spec.lua", - "Scheduling: ./tests/unit/server_job_spec.lua", - "Scheduling: ./tests/unit/config_spec.lua", - "Scheduling: ./tests/unit/context_bar_spec.lua", - "Scheduling: ./tests/unit/renderer_spec.lua", - "Scheduling: ./tests/unit/api_client_spec.lua", - "Scheduling: ./tests/unit/core_spec.lua", - "Scheduling: ./tests/unit/session_spec.lua", - "Scheduling: ./tests/unit/event_manager_spec.lua", - "Scheduling: ./tests/unit/api_spec.lua", - "Scheduling: ./tests/unit/context_spec.lua", - "Scheduling: ./tests/unit/timer_spec.lua", - "Scheduling: ./tests/unit/util_spec.lua", - "Scheduling: ./tests/unit/snapshot_spec.lua", - "Scheduling: ./tests/unit/id_spec.lua", - "", - "========================================\t", - "Testing: \t/home/francis/Projects/_nvim/opencode.nvim/tests/unit/context_completion_spec.lua\t", - "Success\t||\tcontext completion get_source should return a completion source\t", - "Success\t||\tcontext completion complete function should return empty table when trigger char does not match\t", - "Success\t||\tcontext completion complete function should return context items when trigger char matches\t", - "Success\t||\tcontext completion complete function should include selection items when selections exist\t", - "Success\t||\tcontext completion complete function should include mentioned files when they exist\t", - "Success\t||\tcontext completion complete function should include subagent items when they exist\t", - "Success\t||\tcontext completion complete function should filter items based on input\t", - "Success\t||\tcontext completion complete function should sort items with available items first\t", - "Success\t||\tcontext completion on_complete function should handle nil item gracefully\t", - "Success\t||\tcontext completion on_complete function should handle item without data gracefully\t", - "Success\t||\tcontext completion on_complete function should toggle context enabled state for toggleable items\t", - "Success\t||\tcontext completion on_complete function should remove mentioned file when selected\t", - "Success\t||\tcontext completion on_complete function should remove subagent when selected\t", - "Success\t||\tcontext completion on_complete function should remove selection when selection item selected\t", - "Success\t||\tcontext completion on_complete function should clean up trigger character from current line\t", - "Success\t||\tcontext completion formatting functions should format diagnostics correctly\t", - "Success\t||\tcontext completion formatting functions should format cursor data correctly\t", - "Success\t||\tcontext completion formatting functions should format selection correctly\t", - "Success\t||\tcontext completion edge cases should handle empty context gracefully\t", - "Success\t||\tcontext completion edge cases should handle disabled contexts correctly\t", - "\t", - "Success: \t20\t", - "Failed : \t0\t", - "========================================\t", - "", - "========================================\t", - "Testing: \t/home/francis/Projects/_nvim/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_permission_keymap sets up permission keymaps when there is a current permission\t", - "Success\t||\topencode.keymap setup_permission_keymap should delete existing permission keymaps if no current permission exists after being set\t", - "Success\t||\topencode.keymap setup_permission_keymap does not set permission keymaps when there is no current permission\t", - "\t", - "Success: \t13\t", - "Failed : \t0\t", - "========================================\t", - "", - "========================================\t", - "Testing: \t/home/francis/Projects/_nvim/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/home/francis/Projects/_nvim/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_agents respects disabled defaults\t", - "Success\t||\tconfig_file.setup get_opencode_project returns project\t", - "\t", - "Success: \t4\t", - "Failed : \t0\t", - "========================================\t", - "", - "========================================\t", - "Testing: \t/home/francis/Projects/_nvim/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/home/francis/Projects/_nvim/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 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", - "\t", - "Success: \t37\t", - "Failed : \t0\t", - "========================================\t", - "", - "========================================\t", - "Testing: \t/home/francis/Projects/_nvim/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/home/francis/Projects/_nvim/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/home/francis/Projects/_nvim/opencode.nvim/tests/unit/context_bar_spec.lua\t", - "Success\t||\topencode.ui.context_bar opencode.ui.context_bar renders minimal winbar with right aligh token only\t", - "Success\t||\topencode.ui.context_bar opencode.ui.context_bar renders winbar with current file when present\t", - "Success\t||\topencode.ui.context_bar opencode.ui.context_bar renders winbar with multiple context elements\t", - "Success\t||\topencode.ui.context_bar opencode.ui.context_bar renders winbar with diagnostics\t", - "Success\t||\topencode.ui.context_bar opencode.ui.context_bar respects context enabled settings\t", - "Success\t||\topencode.ui.context_bar opencode.ui.context_bar handles empty winbar gracefully\t", - "Success\t||\topencode.ui.context_bar opencode.ui.context_bar does nothing when window is invalid\t", - "Success\t||\topencode.ui.context_bar opencode.ui.context_bar uses provided windows parameter\t", - "Success\t||\topencode.ui.context_bar setup subscribes to state changes\t", - "\t", - "Success: \t9\t", - "Failed : \t0\t", - "========================================\t", - "", - "========================================\t", - "Testing: \t/home/francis/Projects/_nvim/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", - "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/home/francis/Projects/_nvim/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 send_message persist options in state when sending message\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: \t11\t", - "Failed : \t0\t", - "========================================\t", - "", - "========================================\t", - "Testing: \t/home/francis/Projects/_nvim/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/home/francis/Projects/_nvim/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/home/francis/Projects/_nvim/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", - "File not added to context. Could not read.", - "", - "========================================\t", - "Testing: \t/home/francis/Projects/_nvim/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", - ":OpencodeOpenInput is deprecated. Use `:Opencode open input` instead", - ":OpencodeStop is deprecated. Use `:Opencode cancel` instead", - ":OpencodeClose is deprecated. Use `:Opencode close` instead", - "", - "========================================\t", - "Testing: \t/home/francis/Projects/_nvim/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 the main Opencode command and legacy commands\t", - "Success\t||\topencode.api setup sets up legacy command functions that route to main command\t", - "Success\t||\topencode.api Lua API provides callable functions that match commands\t", - "Success\t||\topencode.api run command argument parsing parses agent prefix and passes to send_message\t", - "Success\t||\topencode.api run command argument parsing parses model prefix and passes to send_message\t", - "Success\t||\topencode.api run command argument parsing parses context prefix and passes to send_message\t", - "Success\t||\topencode.api run command argument parsing parses multiple prefixes and passes all to send_message\t", - "Success\t||\topencode.api run command argument parsing works with run_new command\t", - "Success\t||\topencode.api run command argument parsing requires a prompt after prefixes\t", - "Success\t||\topencode.api run command argument parsing Lua API accepts opts directly without parsing\t", - "\t", - "Success: \t11\t", - "Failed : \t0\t", - "========================================\t", - "", - "========================================\t", - "Testing: \t/home/francis/Projects/_nvim/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", - "Success\t||\tutil.parse_run_args parses no prefixes\t", - "Success\t||\tutil.parse_run_args parses single agent prefix\t", - "Success\t||\tutil.parse_run_args parses single model prefix\t", - "Success\t||\tutil.parse_run_args parses single context prefix\t", - "Success\t||\tutil.parse_run_args parses multiple prefixes in order\t", - "Success\t||\tutil.parse_run_args parses context with multiple comma-delimited values\t", - "Success\t||\tutil.parse_run_args handles empty prompt after prefixes\t", - "Success\t||\tutil.parse_run_args handles empty string\t", - "Success\t||\tutil.parse_run_args stops parsing at first non-prefix token\t", - "\t", - "Success: \t14\t", - "Failed : \t0\t", - "========================================\t", - "", - "========================================\t", - "Testing: \t/home/francis/Projects/_nvim/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/home/francis/Projects/_nvim/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/home/francis/Projects/_nvim/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", - "Two pending permissions? existing: per_9efb5b2f3001aqJAFBMiGjFjVZ new: per_9efb5bc2a001j9Bd6bFjLB7hrc", - "Two pending permissions? existing: per_9efb5bc2a001j9Bd6bFjLB7hrc new: per_9efb5d6d1001uwVXQ9dhlBlgfO", - "", - "========================================\t", - "Testing: \t/home/francis/Projects/_nvim/opencode.nvim/tests/unit/renderer_spec.lua\t", - "Success\t||\trenderer replays ansi-codes correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays ansi-codes correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays ansi-codes correctly (session)\t", - "Success\t||\trenderer replays api-abort correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays api-abort correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays api-abort correctly (session)\t", - "Success\t||\trenderer replays api-error correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays api-error correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays api-error correctly (session)\t", - "Success\t||\trenderer replays cursor_data correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays cursor_data correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays cursor_data correctly (session)\t", - "Success\t||\trenderer replays diff correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays diff correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays diff correctly (session)\t", - "Success\t||\trenderer replays markdown-codefence correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays markdown-codefence correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays markdown-codefence correctly (session)\t", - "Success\t||\trenderer replays mentions-with-ranges correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays mentions-with-ranges correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays mentions-with-ranges correctly (session)\t", - "Success\t||\trenderer replays message-removal correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays message-removal correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays perf correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays perf correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays perf correctly (session)\t", - "Success\t||\trenderer replays permission-denied correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays permission-denied correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays permission-denied correctly (session)\t", - "Success\t||\trenderer replays permission-prompt correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays permission-prompt correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays permission correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays permission correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays permission correctly (session)\t", - "Success\t||\trenderer replays planning correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays planning correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays planning correctly (session)\t", - "Success\t||\trenderer replays redo-all correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays redo-all correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays redo-all correctly (session)\t", - "Success\t||\trenderer replays redo-once correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays redo-once correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays redo-once correctly (session)\t", - "Success\t||\trenderer replays revert correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays revert correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays revert correctly (session)\t", - "Success\t||\trenderer replays selection correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays selection correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays selection correctly (session)\t", - "Success\t||\trenderer replays shifting-and-multiple-perms correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays shifting-and-multiple-perms correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays simple-session correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays simple-session correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays simple-session correctly (session)\t", - "Success\t||\trenderer replays tool-invalid correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays tool-invalid correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays tool-invalid correctly (session)\t", - "Success\t||\trenderer replays updating-text correctly (event-by-event, collapsing)\t", - "Success\t||\trenderer replays updating-text correctly (event-by-event, no collapsing)\t", - "Success\t||\trenderer replays updating-text correctly (session)\t", - "\t", - "Success: \t60\t", - "Failed : \t0\t", - "========================================\t", - "✓ Unit tests passed", - "------------------------------------------------", - "All tests passed successfully!", - "", - "`````", - "", - "----", - "", - "", - "All steps are complete and all tests pass! Here’s a summary of what was fixed:", - "", - "- ✅ Added a nil check for `state.active_session` before accessing `.id` in `M.send_message`.", - "- ✅ Ensured the `model` field in `params` matches the expected type `{ modelID = ..., providerID = ... }`.", - "- ✅ Verified the fixes by running the full test suite—no errors or failures.", - "", - "Your file is now robust and EmmyLua diagnostics at line 130 are resolved. If you need further tweaks or want to address other diagnostics, let me know!", - "", - "" - ], - "extmarks": [ - [ - 1, - 1, - 0, - { - "virt_text_win_col": -3, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "▌󰭻 ", - "OpencodeMessageRoleUser" - ], - [ - " " - ], - [ - "USER", - "OpencodeMessageRoleUser" - ], - [ - "", - "OpencodeHint" - ], - [ - " [msg_a49ed91d6001coTsjFq9x6FF5W]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 10, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 2, - 1, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - " 2025-11-03 13:34:57", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false, - "priority": 9, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 3, - 2, - 0, - { - "virt_text_win_col": -3, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 4, - 3, - 0, - { - "virt_text_win_col": -3, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 5, - 4, - 0, - { - "virt_text_win_col": -3, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 6, - 5, - 0, - { - "virt_text_win_col": -3, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 7, - 6, - 0, - { - "virt_text_win_col": -3, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 8, - 7, - 0, - { - "virt_text_win_col": -3, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 9, - 8, - 0, - { - "virt_text_win_col": -3, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 10, - 10, - 0, - { - "virt_text_win_col": -3, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-4.1", - "OpencodeHint" - ], - [ - " [msg_a49ed9828001mN6CDcWPnGnpHS]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 10, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 11, - 10, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - " 2025-11-03 13:34:59", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false, - "priority": 9, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 12, - 39, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 13, - 40, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 14, - 41, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 15, - 42, - 0, - { - "end_row": 43, - "end_right_gravity": false, - "virt_text": [ - [ - "126", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "priority": 5000, - "ns_id": 3, - "right_gravity": true, - "end_col": 0, - "virt_text_hide": false - } - ], - [ - 16, - 42, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 17, - 43, - 0, - { - "end_row": 44, - "end_right_gravity": false, - "virt_text": [ - [ - "127", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "priority": 5000, - "ns_id": 3, - "right_gravity": true, - "end_col": 0, - "virt_text_hide": false - } - ], - [ - 18, - 43, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 19, - 44, - 0, - { - "end_row": 45, - "end_right_gravity": false, - "virt_text": [ - [ - "128", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "priority": 5000, - "ns_id": 3, - "right_gravity": true, - "end_col": 0, - "virt_text_hide": false - } - ], - [ - 20, - 44, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 21, - 45, - 0, - { - "end_row": 46, - "end_right_gravity": false, - "virt_text": [ - [ - "129", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "priority": 5000, - "ns_id": 3, - "right_gravity": true, - "end_col": 0, - "virt_text_hide": false - } - ], - [ - 22, - 45, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 23, - 46, - 0, - { - "end_row": 47, - "end_right_gravity": false, - "virt_text": [ - [ - "130", - "OpencodeDiffAddGutter" - ], - [ - "+", - "OpencodeDiffAddGutter" - ], - [ - " ", - "OpencodeDiffAddGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "hl_eol": true, - "ns_id": 3, - "priority": 5000, - "right_gravity": true, - "virt_text_hide": false, - "end_col": 0, - "hl_group": "OpencodeDiffAdd" - } - ], - [ - 24, - 46, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 25, - 47, - 0, - { - "end_row": 48, - "end_right_gravity": false, - "virt_text": [ - [ - "131", - "OpencodeDiffAddGutter" - ], - [ - "+", - "OpencodeDiffAddGutter" - ], - [ - " ", - "OpencodeDiffAddGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "hl_eol": true, - "ns_id": 3, - "priority": 5000, - "right_gravity": true, - "virt_text_hide": false, - "end_col": 0, - "hl_group": "OpencodeDiffAdd" - } - ], - [ - 26, - 47, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 27, - 48, - 0, - { - "end_row": 49, - "end_right_gravity": false, - "virt_text": [ - [ - "132", - "OpencodeDiffAddGutter" - ], - [ - "+", - "OpencodeDiffAddGutter" - ], - [ - " ", - "OpencodeDiffAddGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "hl_eol": true, - "ns_id": 3, - "priority": 5000, - "right_gravity": true, - "virt_text_hide": false, - "end_col": 0, - "hl_group": "OpencodeDiffAdd" - } - ], - [ - 28, - 48, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 29, - 49, - 0, - { - "end_row": 50, - "end_right_gravity": false, - "virt_text": [ - [ - "133", - "OpencodeDiffAddGutter" - ], - [ - "+", - "OpencodeDiffAddGutter" - ], - [ - " ", - "OpencodeDiffAddGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "hl_eol": true, - "ns_id": 3, - "priority": 5000, - "right_gravity": true, - "virt_text_hide": false, - "end_col": 0, - "hl_group": "OpencodeDiffAdd" - } - ], - [ - 30, - 49, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 31, - 50, - 0, - { - "end_row": 51, - "end_right_gravity": false, - "virt_text": [ - [ - "134", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "priority": 5000, - "ns_id": 3, - "right_gravity": true, - "end_col": 0, - "virt_text_hide": false - } - ], - [ - 32, - 50, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 33, - 51, - 0, - { - "end_row": 52, - "end_right_gravity": false, - "virt_text": [ - [ - "135", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "priority": 5000, - "ns_id": 3, - "right_gravity": true, - "end_col": 0, - "virt_text_hide": false - } - ], - [ - 34, - 51, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 35, - 52, - 0, - { - "end_row": 53, - "end_right_gravity": false, - "virt_text": [ - [ - "136", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "priority": 5000, - "ns_id": 3, - "right_gravity": true, - "end_col": 0, - "virt_text_hide": false - } - ], - [ - 36, - 52, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 37, - 53, - 0, - { - "end_row": 54, - "end_right_gravity": false, - "virt_text": [ - [ - "137", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "priority": 5000, - "ns_id": 3, - "right_gravity": true, - "end_col": 0, - "virt_text_hide": false - } - ], - [ - 38, - 53, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 39, - 54, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 40, - 55, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 41, - 60, - 0, - { - "virt_text_win_col": -3, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-4.1", - "OpencodeHint" - ], - [ - " [msg_a49edb694001syExFxMUW1ik3n]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 10, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 42, - 60, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - " 2025-11-03 13:35:06", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false, - "priority": 9, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 43, - 78, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 44, - 79, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 45, - 80, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 46, - 81, - 0, - { - "end_row": 82, - "end_right_gravity": false, - "virt_text": [ - [ - "114", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "priority": 5000, - "ns_id": 3, - "right_gravity": true, - "end_col": 0, - "virt_text_hide": false - } - ], - [ - 47, - 81, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 48, - 82, - 0, - { - "end_row": 83, - "end_right_gravity": false, - "virt_text": [ - [ - "115", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "priority": 5000, - "ns_id": 3, - "right_gravity": true, - "end_col": 0, - "virt_text_hide": false - } - ], - [ - 49, - 82, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 50, - 83, - 0, - { - "end_row": 84, - "end_right_gravity": false, - "virt_text": [ - [ - "116", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "priority": 5000, - "ns_id": 3, - "right_gravity": true, - "end_col": 0, - "virt_text_hide": false - } - ], - [ - 51, - 83, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 52, - 84, - 0, - { - "end_row": 85, - "end_right_gravity": false, - "virt_text": [ - [ - "117", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "priority": 5000, - "ns_id": 3, - "right_gravity": true, - "end_col": 0, - "virt_text_hide": false - } - ], - [ - 53, - 84, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 54, - 85, - 0, - { - "end_row": 86, - "end_right_gravity": false, - "virt_text": [ - [ - "118", - "OpencodeDiffDeleteGutter" - ], - [ - "-", - "OpencodeDiffDeleteGutter" - ], - [ - " ", - "OpencodeDiffDeleteGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "hl_eol": true, - "ns_id": 3, - "priority": 5000, - "right_gravity": true, - "virt_text_hide": false, - "end_col": 0, - "hl_group": "OpencodeDiffDelete" - } - ], - [ - 55, - 85, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 56, - 86, - 0, - { - "end_row": 87, - "end_right_gravity": false, - "virt_text": [ - [ - "118", - "OpencodeDiffAddGutter" - ], - [ - "+", - "OpencodeDiffAddGutter" - ], - [ - " ", - "OpencodeDiffAddGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "hl_eol": true, - "ns_id": 3, - "priority": 5000, - "right_gravity": true, - "virt_text_hide": false, - "end_col": 0, - "hl_group": "OpencodeDiffAdd" - } - ], - [ - 57, - 86, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 58, - 87, - 0, - { - "end_row": 88, - "end_right_gravity": false, - "virt_text": [ - [ - "119", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "priority": 5000, - "ns_id": 3, - "right_gravity": true, - "end_col": 0, - "virt_text_hide": false - } - ], - [ - 59, - 87, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 60, - 88, - 0, - { - "end_row": 89, - "end_right_gravity": false, - "virt_text": [ - [ - "120", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "priority": 5000, - "ns_id": 3, - "right_gravity": true, - "end_col": 0, - "virt_text_hide": false - } - ], - [ - 61, - 88, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 62, - 89, - 0, - { - "end_row": 90, - "end_right_gravity": false, - "virt_text": [ - [ - "121", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "priority": 5000, - "ns_id": 3, - "right_gravity": true, - "end_col": 0, - "virt_text_hide": false - } - ], - [ - 63, - 89, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 64, - 90, - 0, - { - "end_row": 91, - "end_right_gravity": false, - "virt_text": [ - [ - "122", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "virt_text_repeat_linebreak": false, - "priority": 5000, - "ns_id": 3, - "right_gravity": true, - "end_col": 0, - "virt_text_hide": false - } - ], - [ - 65, - 90, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 66, - 91, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 67, - 92, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 68, - 97, - 0, - { - "virt_text_win_col": -3, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-4.1", - "OpencodeHint" - ], - [ - " [msg_a49edc4640017DZPFVUPHCm7Ji]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 10, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 69, - 97, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - " 2025-11-03 13:35:10", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false, - "priority": 9, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 70, - 105, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 71, - 106, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 72, - 107, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 73, - 108, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 74, - 109, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 75, - 110, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 76, - 111, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 77, - 112, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 78, - 113, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 79, - 114, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 80, - 115, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 81, - 116, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 82, - 117, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 83, - 118, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 84, - 119, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 85, - 120, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 86, - 121, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 87, - 122, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 88, - 123, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 89, - 124, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 90, - 125, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 91, - 126, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 92, - 127, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 93, - 128, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 94, - 129, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 95, - 130, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 96, - 131, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 97, - 132, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 98, - 133, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 99, - 134, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 100, - 135, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 101, - 136, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 102, - 137, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 103, - 138, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 104, - 139, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 105, - 140, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 106, - 141, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 107, - 142, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 108, - 143, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 109, - 144, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 110, - 145, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 111, - 146, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 112, - 147, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 113, - 148, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 114, - 149, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 115, - 150, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 116, - 151, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 117, - 152, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 118, - 153, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 119, - 154, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 120, - 155, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 121, - 156, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 122, - 157, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 123, - 158, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 124, - 159, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 125, - 160, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 126, - 161, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 127, - 162, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 128, - 163, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 129, - 164, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 130, - 165, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 131, - 166, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 132, - 167, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 133, - 168, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 134, - 169, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 135, - 170, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 136, - 171, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 137, - 172, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 138, - 173, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 139, - 174, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 140, - 175, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 141, - 176, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 142, - 177, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 143, - 178, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 144, - 179, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 145, - 180, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 146, - 181, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 147, - 182, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 148, - 183, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 149, - 184, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 150, - 185, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 151, - 186, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 152, - 187, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 153, - 188, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 154, - 189, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 155, - 190, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 156, - 191, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 157, - 192, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 158, - 193, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 159, - 194, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 160, - 195, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 161, - 196, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 162, - 197, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 163, - 198, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 164, - 199, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 165, - 200, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 166, - 201, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 167, - 202, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 168, - 203, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 169, - 204, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 170, - 205, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 171, - 206, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 172, - 207, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 173, - 208, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 174, - 209, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 175, - 210, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 176, - 211, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 177, - 212, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 178, - 213, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 179, - 214, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 180, - 215, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 181, - 216, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 182, - 217, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 183, - 218, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 184, - 219, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 185, - 220, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 186, - 221, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 187, - 222, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 188, - 223, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 189, - 224, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 190, - 225, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 191, - 226, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 192, - 227, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 193, - 228, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 194, - 229, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 195, - 230, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 196, - 231, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 197, - 232, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 198, - 233, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 199, - 234, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 200, - 235, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 201, - 236, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 202, - 237, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 203, - 238, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 204, - 239, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 205, - 240, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 206, - 241, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 207, - 242, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 208, - 243, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 209, - 244, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 210, - 245, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 211, - 246, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 212, - 247, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 213, - 248, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 214, - 249, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 215, - 250, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 216, - 251, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 217, - 252, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 218, - 253, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 219, - 254, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 220, - 255, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 221, - 256, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 222, - 257, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 223, - 258, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 224, - 259, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 225, - 260, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 226, - 261, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 227, - 262, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 228, - 263, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 229, - 264, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 230, - 265, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 231, - 266, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 232, - 267, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 233, - 268, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 234, - 269, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 235, - 270, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 236, - 271, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 237, - 272, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 238, - 273, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 239, - 274, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 240, - 275, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 241, - 276, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 242, - 277, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 243, - 278, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 244, - 279, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 245, - 280, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 246, - 281, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 247, - 282, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 248, - 283, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 249, - 284, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 250, - 285, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 251, - 286, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 252, - 287, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 253, - 288, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 254, - 289, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 255, - 290, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 256, - 291, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 257, - 292, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 258, - 293, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 259, - 294, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 260, - 295, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 261, - 296, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 262, - 297, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 263, - 298, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 264, - 299, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 265, - 300, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 266, - 301, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 267, - 302, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 268, - 303, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 269, - 304, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 270, - 305, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 271, - 306, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 272, - 307, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 273, - 308, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 274, - 309, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 275, - 310, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 276, - 311, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 277, - 312, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 278, - 313, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 279, - 314, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 280, - 315, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 281, - 316, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 282, - 317, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 283, - 318, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 284, - 319, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 285, - 320, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 286, - 321, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 287, - 322, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 288, - 323, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 289, - 324, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 290, - 325, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 291, - 326, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 292, - 327, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 293, - 328, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 294, - 329, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 295, - 330, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 296, - 331, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 297, - 332, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 298, - 333, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 299, - 334, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 300, - 335, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 301, - 336, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 302, - 337, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 303, - 338, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 304, - 339, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 305, - 340, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 306, - 341, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 307, - 342, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 308, - 343, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 309, - 344, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 310, - 345, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 311, - 346, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 312, - 347, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 313, - 348, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 314, - 349, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 315, - 350, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 316, - 351, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 317, - 352, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 318, - 353, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 319, - 354, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 320, - 355, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 321, - 356, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 322, - 357, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 323, - 358, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 324, - 359, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 325, - 360, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 326, - 361, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 327, - 362, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 328, - 363, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 329, - 364, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 330, - 365, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 331, - 366, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 332, - 367, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 333, - 368, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 334, - 369, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 335, - 370, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 336, - 371, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 337, - 372, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 338, - 373, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 339, - 374, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 340, - 375, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 341, - 376, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 342, - 377, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 343, - 378, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 344, - 379, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 345, - 380, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 346, - 381, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 347, - 382, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 348, - 383, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 349, - 384, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 350, - 385, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 351, - 386, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 352, - 387, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 353, - 388, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 354, - 389, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 355, - 390, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 356, - 391, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 357, - 392, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 358, - 393, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 359, - 394, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 360, - 395, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 361, - 396, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 362, - 397, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 363, - 398, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 364, - 399, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 365, - 400, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 366, - 401, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 367, - 402, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 368, - 403, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 369, - 404, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 370, - 405, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 371, - 406, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 372, - 407, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 373, - 408, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 374, - 409, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 375, - 410, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 376, - 411, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 377, - 412, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 378, - 413, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 379, - 414, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 380, - 415, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 381, - 416, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 382, - 417, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 383, - 418, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 384, - 419, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 385, - 420, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 386, - 421, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 387, - 422, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 388, - 423, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 389, - 424, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 390, - 425, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 391, - 426, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 392, - 427, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 393, - 428, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 394, - 429, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 395, - 430, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 396, - 431, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 397, - 432, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 398, - 433, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 399, - 434, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 400, - 435, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 401, - 436, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 402, - 437, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 403, - 438, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 404, - 439, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 405, - 440, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 406, - 441, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 407, - 442, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 408, - 443, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 409, - 444, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 410, - 445, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 411, - 446, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 412, - 447, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 413, - 448, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 414, - 449, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 415, - 450, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 416, - 451, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 417, - 452, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 418, - 453, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 419, - 454, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 420, - 455, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 421, - 456, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 422, - 457, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 423, - 458, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 424, - 459, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 425, - 460, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 426, - 461, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 427, - 462, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 428, - 463, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 429, - 464, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 430, - 465, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 431, - 466, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 432, - 467, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 433, - 468, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 434, - 469, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 435, - 470, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 436, - 471, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 437, - 472, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 438, - 473, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 439, - 474, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 440, - 475, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 441, - 476, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 442, - 477, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 443, - 478, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 444, - 479, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 445, - 480, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 446, - 481, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 447, - 482, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 448, - 483, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 449, - 484, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 450, - 485, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 451, - 486, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 452, - 487, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 453, - 488, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 454, - 489, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 455, - 490, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 456, - 491, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 457, - 492, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 458, - 493, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 459, - 494, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 460, - 495, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 461, - 496, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 462, - 497, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 463, - 498, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 464, - 499, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 465, - 500, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 466, - 501, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 467, - 502, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 468, - 503, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 469, - 504, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 470, - 505, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 471, - 506, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 472, - 507, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 473, - 508, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 474, - 509, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 475, - 510, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 476, - 511, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 477, - 512, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 478, - 513, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 479, - 514, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 480, - 515, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 481, - 516, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 482, - 517, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 483, - 518, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 484, - 519, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 485, - 520, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 486, - 521, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 487, - 522, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 488, - 523, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 489, - 524, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 490, - 525, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 491, - 526, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 492, - 527, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 493, - 528, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 494, - 529, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 495, - 530, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 496, - 531, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 497, - 532, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 498, - 533, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 499, - 534, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 500, - 535, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 501, - 536, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 502, - 537, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 503, - 538, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 504, - 539, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 505, - 540, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 506, - 541, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 507, - 542, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 508, - 543, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 509, - 544, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 510, - 545, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 511, - 546, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 512, - 547, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 513, - 548, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 514, - 549, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 515, - 550, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 516, - 551, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 517, - 552, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 518, - 553, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 519, - 554, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 520, - 555, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 521, - 556, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 522, - 557, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 523, - 558, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 524, - 559, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 525, - 560, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 526, - 561, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 527, - 562, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 528, - 563, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 529, - 564, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 530, - 565, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 531, - 566, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 532, - 567, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 533, - 568, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 534, - 569, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 535, - 570, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 536, - 571, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 537, - 572, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 538, - 573, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 539, - 574, - 0, - { - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 540, - 577, - 0, - { - "virt_text_win_col": -3, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-4.1", - "OpencodeHint" - ], - [ - " [msg_a49edd87f001eOJDDoq5Vb5hra]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col", - "right_gravity": true, - "priority": 10, - "ns_id": 3, - "virt_text_hide": false - } - ], - [ - 541, - 577, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - " 2025-11-03 13:35:15", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false, - "priority": 9, - "ns_id": 3, - "virt_text_hide": false - } - ] - ], - "actions": [ - { - "type": "diff_revert_selected_file", - "range": { - "from": 57, - "to": 57 - }, - "display_line": 57, - "text": "[R]evert file", - "key": "R", - "args": [ - "8e7903714919009004aad8754db0035fb47ecb24" - ] - }, - { - "type": "diff_revert_all", - "range": { - "from": 57, - "to": 57 - }, - "display_line": 57, - "text": "Revert [A]ll", - "key": "A", - "args": [ - "8e7903714919009004aad8754db0035fb47ecb24" - ] - }, - { - "type": "diff_open", - "range": { - "from": 57, - "to": 57 - }, - "display_line": 57, - "text": "[D]iff", - "key": "D", - "args": [ - "8e7903714919009004aad8754db0035fb47ecb24" - ] - }, - { - "type": "diff_revert_selected_file", - "range": { - "from": 94, - "to": 94 - }, - "display_line": 94, - "text": "[R]evert file", - "key": "R", - "args": [ - "f33f38a70b284207e092c2c578a24e96fdd1bd4d" - ] - }, - { - "type": "diff_revert_all", - "range": { - "from": 94, - "to": 94 - }, - "display_line": 94, - "text": "Revert [A]ll", - "key": "A", - "args": [ - "f33f38a70b284207e092c2c578a24e96fdd1bd4d" - ] - }, - { - "type": "diff_open", - "range": { - "from": 94, - "to": 94 - }, - "display_line": 94, - "text": "[D]iff", - "key": "D", - "args": [ - "f33f38a70b284207e092c2c578a24e96fdd1bd4d" - ] - } - ], - "timestamp": 1772803136 -} +{"actions":[{"type":"diff_revert_selected_file","range":{"from":94,"to":94},"key":"R","display_line":94,"args":["f33f38a70b284207e092c2c578a24e96fdd1bd4d"],"text":"[R]evert file"},{"type":"diff_revert_all","range":{"from":94,"to":94},"key":"A","display_line":94,"args":["f33f38a70b284207e092c2c578a24e96fdd1bd4d"],"text":"Revert [A]ll"},{"type":"diff_open","range":{"from":94,"to":94},"key":"D","display_line":94,"args":["f33f38a70b284207e092c2c578a24e96fdd1bd4d"],"text":"[D]iff"},{"type":"diff_revert_selected_file","range":{"from":57,"to":57},"key":"R","display_line":57,"args":["8e7903714919009004aad8754db0035fb47ecb24"],"text":"[R]evert file"},{"type":"diff_revert_all","range":{"from":57,"to":57},"key":"A","display_line":57,"args":["8e7903714919009004aad8754db0035fb47ecb24"],"text":"Revert [A]ll"},{"type":"diff_open","range":{"from":57,"to":57},"key":"D","display_line":57,"args":["8e7903714919009004aad8754db0035fb47ecb24"],"text":"[D]iff"}],"extmarks":[[1,1,0,{"virt_text_win_col":-3,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":10,"right_gravity":true,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" [msg_a49ed91d6001coTsjFq9x6FF5W]","OpencodeHint"]],"virt_text_repeat_linebreak":false}],[2,1,0,{"virt_text_hide":false,"virt_text_pos":"right_align","ns_id":3,"priority":9,"right_gravity":true,"virt_text":[[" 2025-11-03 13:34:57","OpencodeHint"]],"virt_text_repeat_linebreak":false}],[3,2,0,{"virt_text_win_col":-3,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true}],[4,3,0,{"virt_text_win_col":-3,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true}],[5,4,0,{"virt_text_win_col":-3,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true}],[6,5,0,{"virt_text_win_col":-3,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true}],[7,6,0,{"virt_text_win_col":-3,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true}],[8,7,0,{"virt_text_win_col":-3,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true}],[9,8,0,{"virt_text_win_col":-3,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true}],[10,10,0,{"virt_text_win_col":-3,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":10,"right_gravity":true,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" [msg_a49ed9828001mN6CDcWPnGnpHS]","OpencodeHint"]],"virt_text_repeat_linebreak":false}],[11,10,0,{"virt_text_hide":false,"virt_text_pos":"right_align","ns_id":3,"priority":9,"right_gravity":true,"virt_text":[[" 2025-11-03 13:34:59","OpencodeHint"]],"virt_text_repeat_linebreak":false}],[12,39,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[13,40,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[14,41,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[15,42,0,{"priority":5000,"end_col":0,"end_row":43,"end_right_gravity":false,"virt_text_hide":false,"ns_id":3,"virt_text_pos":"overlay","right_gravity":true,"virt_text":[["126","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_repeat_linebreak":false}],[16,42,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[17,43,0,{"priority":5000,"end_col":0,"end_row":44,"end_right_gravity":false,"virt_text_hide":false,"ns_id":3,"virt_text_pos":"overlay","right_gravity":true,"virt_text":[["127","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_repeat_linebreak":false}],[18,43,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[19,44,0,{"priority":5000,"end_col":0,"end_row":45,"end_right_gravity":false,"virt_text_hide":false,"ns_id":3,"virt_text_pos":"overlay","right_gravity":true,"virt_text":[["128","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_repeat_linebreak":false}],[20,44,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[21,45,0,{"priority":5000,"end_col":0,"end_row":46,"end_right_gravity":false,"virt_text_hide":false,"ns_id":3,"virt_text_pos":"overlay","right_gravity":true,"virt_text":[["129","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_repeat_linebreak":false}],[22,45,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[23,46,0,{"priority":5000,"virt_text_pos":"overlay","end_col":0,"end_row":47,"end_right_gravity":false,"virt_text_hide":false,"hl_eol":true,"ns_id":3,"hl_group":"OpencodeDiffAdd","right_gravity":true,"virt_text":[["130","OpencodeDiffAddGutter"],["+","OpencodeDiffAddGutter"],[" ","OpencodeDiffAddGutter"]],"virt_text_repeat_linebreak":false}],[24,46,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[25,47,0,{"priority":5000,"virt_text_pos":"overlay","end_col":0,"end_row":48,"end_right_gravity":false,"virt_text_hide":false,"hl_eol":true,"ns_id":3,"hl_group":"OpencodeDiffAdd","right_gravity":true,"virt_text":[["131","OpencodeDiffAddGutter"],["+","OpencodeDiffAddGutter"],[" ","OpencodeDiffAddGutter"]],"virt_text_repeat_linebreak":false}],[26,47,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[27,48,0,{"priority":5000,"virt_text_pos":"overlay","end_col":0,"end_row":49,"end_right_gravity":false,"virt_text_hide":false,"hl_eol":true,"ns_id":3,"hl_group":"OpencodeDiffAdd","right_gravity":true,"virt_text":[["132","OpencodeDiffAddGutter"],["+","OpencodeDiffAddGutter"],[" ","OpencodeDiffAddGutter"]],"virt_text_repeat_linebreak":false}],[28,48,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[29,49,0,{"priority":5000,"virt_text_pos":"overlay","end_col":0,"end_row":50,"end_right_gravity":false,"virt_text_hide":false,"hl_eol":true,"ns_id":3,"hl_group":"OpencodeDiffAdd","right_gravity":true,"virt_text":[["133","OpencodeDiffAddGutter"],["+","OpencodeDiffAddGutter"],[" ","OpencodeDiffAddGutter"]],"virt_text_repeat_linebreak":false}],[30,49,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[31,50,0,{"priority":5000,"end_col":0,"end_row":51,"end_right_gravity":false,"virt_text_hide":false,"ns_id":3,"virt_text_pos":"overlay","right_gravity":true,"virt_text":[["134","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_repeat_linebreak":false}],[32,50,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[33,51,0,{"priority":5000,"end_col":0,"end_row":52,"end_right_gravity":false,"virt_text_hide":false,"ns_id":3,"virt_text_pos":"overlay","right_gravity":true,"virt_text":[["135","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_repeat_linebreak":false}],[34,51,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[35,52,0,{"priority":5000,"end_col":0,"end_row":53,"end_right_gravity":false,"virt_text_hide":false,"ns_id":3,"virt_text_pos":"overlay","right_gravity":true,"virt_text":[["136","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_repeat_linebreak":false}],[36,52,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[37,53,0,{"priority":5000,"end_col":0,"end_row":54,"end_right_gravity":false,"virt_text_hide":false,"ns_id":3,"virt_text_pos":"overlay","right_gravity":true,"virt_text":[["137","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_repeat_linebreak":false}],[38,53,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[39,54,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[40,55,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[41,60,0,{"virt_text_win_col":-3,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":10,"right_gravity":true,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" [msg_a49edb694001syExFxMUW1ik3n]","OpencodeHint"]],"virt_text_repeat_linebreak":false}],[42,60,0,{"virt_text_hide":false,"virt_text_pos":"right_align","ns_id":3,"priority":9,"right_gravity":true,"virt_text":[[" 2025-11-03 13:35:06","OpencodeHint"]],"virt_text_repeat_linebreak":false}],[43,78,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[44,79,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[45,80,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[46,81,0,{"priority":5000,"end_col":0,"end_row":82,"end_right_gravity":false,"virt_text_hide":false,"ns_id":3,"virt_text_pos":"overlay","right_gravity":true,"virt_text":[["114","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_repeat_linebreak":false}],[47,81,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[48,82,0,{"priority":5000,"end_col":0,"end_row":83,"end_right_gravity":false,"virt_text_hide":false,"ns_id":3,"virt_text_pos":"overlay","right_gravity":true,"virt_text":[["115","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_repeat_linebreak":false}],[49,82,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[50,83,0,{"priority":5000,"end_col":0,"end_row":84,"end_right_gravity":false,"virt_text_hide":false,"ns_id":3,"virt_text_pos":"overlay","right_gravity":true,"virt_text":[["116","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_repeat_linebreak":false}],[51,83,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[52,84,0,{"priority":5000,"end_col":0,"end_row":85,"end_right_gravity":false,"virt_text_hide":false,"ns_id":3,"virt_text_pos":"overlay","right_gravity":true,"virt_text":[["117","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_repeat_linebreak":false}],[53,84,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[54,85,0,{"priority":5000,"virt_text_pos":"overlay","end_col":0,"end_row":86,"end_right_gravity":false,"virt_text_hide":false,"hl_eol":true,"ns_id":3,"hl_group":"OpencodeDiffDelete","right_gravity":true,"virt_text":[["118","OpencodeDiffDeleteGutter"],["-","OpencodeDiffDeleteGutter"],[" ","OpencodeDiffDeleteGutter"]],"virt_text_repeat_linebreak":false}],[55,85,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[56,86,0,{"priority":5000,"virt_text_pos":"overlay","end_col":0,"end_row":87,"end_right_gravity":false,"virt_text_hide":false,"hl_eol":true,"ns_id":3,"hl_group":"OpencodeDiffAdd","right_gravity":true,"virt_text":[["118","OpencodeDiffAddGutter"],["+","OpencodeDiffAddGutter"],[" ","OpencodeDiffAddGutter"]],"virt_text_repeat_linebreak":false}],[57,86,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[58,87,0,{"priority":5000,"end_col":0,"end_row":88,"end_right_gravity":false,"virt_text_hide":false,"ns_id":3,"virt_text_pos":"overlay","right_gravity":true,"virt_text":[["119","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_repeat_linebreak":false}],[59,87,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[60,88,0,{"priority":5000,"end_col":0,"end_row":89,"end_right_gravity":false,"virt_text_hide":false,"ns_id":3,"virt_text_pos":"overlay","right_gravity":true,"virt_text":[["120","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_repeat_linebreak":false}],[61,88,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[62,89,0,{"priority":5000,"end_col":0,"end_row":90,"end_right_gravity":false,"virt_text_hide":false,"ns_id":3,"virt_text_pos":"overlay","right_gravity":true,"virt_text":[["121","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_repeat_linebreak":false}],[63,89,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[64,90,0,{"priority":5000,"end_col":0,"end_row":91,"end_right_gravity":false,"virt_text_hide":false,"ns_id":3,"virt_text_pos":"overlay","right_gravity":true,"virt_text":[["122","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_repeat_linebreak":false}],[65,90,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[66,91,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[67,92,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[68,97,0,{"virt_text_win_col":-3,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":10,"right_gravity":true,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" [msg_a49edc4640017DZPFVUPHCm7Ji]","OpencodeHint"]],"virt_text_repeat_linebreak":false}],[69,97,0,{"virt_text_hide":false,"virt_text_pos":"right_align","ns_id":3,"priority":9,"right_gravity":true,"virt_text":[[" 2025-11-03 13:35:10","OpencodeHint"]],"virt_text_repeat_linebreak":false}],[70,105,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[71,106,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[72,107,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[73,108,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[74,109,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[75,110,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[76,111,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[77,112,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[78,113,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[79,114,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[80,115,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[81,116,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[82,117,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[83,118,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[84,119,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[85,120,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[86,121,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[87,122,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[88,123,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[89,124,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[90,125,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[91,126,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[92,127,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[93,128,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[94,129,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[95,130,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[96,131,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[97,132,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[98,133,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[99,134,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[100,135,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[101,136,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[102,137,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[103,138,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[104,139,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[105,140,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[106,141,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[107,142,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[108,143,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[109,144,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[110,145,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[111,146,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[112,147,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[113,148,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[114,149,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[115,150,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[116,151,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[117,152,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[118,153,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[119,154,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[120,155,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[121,156,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[122,157,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[123,158,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[124,159,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[125,160,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[126,161,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[127,162,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[128,163,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[129,164,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[130,165,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[131,166,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[132,167,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[133,168,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[134,169,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[135,170,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[136,171,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[137,172,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[138,173,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[139,174,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[140,175,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[141,176,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[142,177,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[143,178,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[144,179,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[145,180,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[146,181,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[147,182,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[148,183,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[149,184,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[150,185,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[151,186,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[152,187,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[153,188,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[154,189,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[155,190,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[156,191,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[157,192,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[158,193,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[159,194,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[160,195,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[161,196,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[162,197,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[163,198,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[164,199,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[165,200,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[166,201,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[167,202,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[168,203,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[169,204,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[170,205,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[171,206,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[172,207,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[173,208,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[174,209,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[175,210,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[176,211,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[177,212,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[178,213,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[179,214,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[180,215,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[181,216,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[182,217,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[183,218,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[184,219,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[185,220,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[186,221,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[187,222,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[188,223,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[189,224,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[190,225,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[191,226,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[192,227,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[193,228,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[194,229,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[195,230,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[196,231,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[197,232,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[198,233,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[199,234,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[200,235,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[201,236,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[202,237,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[203,238,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[204,239,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[205,240,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[206,241,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[207,242,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[208,243,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[209,244,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[210,245,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[211,246,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[212,247,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[213,248,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[214,249,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[215,250,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[216,251,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[217,252,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[218,253,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[219,254,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[220,255,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[221,256,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[222,257,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[223,258,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[224,259,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[225,260,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[226,261,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[227,262,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[228,263,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[229,264,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[230,265,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[231,266,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[232,267,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[233,268,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[234,269,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[235,270,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[236,271,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[237,272,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[238,273,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[239,274,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[240,275,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[241,276,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[242,277,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[243,278,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[244,279,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[245,280,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[246,281,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[247,282,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[248,283,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[249,284,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[250,285,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[251,286,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[252,287,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[253,288,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[254,289,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[255,290,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[256,291,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[257,292,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[258,293,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[259,294,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[260,295,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[261,296,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[262,297,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[263,298,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[264,299,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[265,300,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[266,301,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[267,302,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[268,303,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[269,304,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[270,305,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[271,306,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[272,307,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[273,308,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[274,309,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[275,310,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[276,311,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[277,312,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[278,313,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[279,314,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[280,315,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[281,316,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[282,317,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[283,318,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[284,319,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[285,320,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[286,321,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[287,322,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[288,323,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[289,324,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[290,325,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[291,326,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[292,327,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[293,328,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[294,329,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[295,330,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[296,331,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[297,332,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[298,333,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[299,334,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[300,335,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[301,336,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[302,337,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[303,338,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[304,339,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[305,340,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[306,341,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[307,342,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[308,343,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[309,344,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[310,345,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[311,346,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[312,347,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[313,348,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[314,349,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[315,350,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[316,351,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[317,352,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[318,353,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[319,354,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[320,355,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[321,356,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[322,357,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[323,358,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[324,359,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[325,360,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[326,361,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[327,362,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[328,363,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[329,364,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[330,365,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[331,366,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[332,367,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[333,368,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[334,369,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[335,370,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[336,371,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[337,372,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[338,373,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[339,374,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[340,375,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[341,376,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[342,377,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[343,378,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[344,379,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[345,380,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[346,381,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[347,382,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[348,383,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[349,384,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[350,385,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[351,386,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[352,387,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[353,388,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[354,389,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[355,390,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[356,391,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[357,392,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[358,393,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[359,394,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[360,395,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[361,396,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[362,397,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[363,398,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[364,399,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[365,400,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[366,401,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[367,402,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[368,403,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[369,404,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[370,405,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[371,406,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[372,407,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[373,408,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[374,409,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[375,410,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[376,411,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[377,412,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[378,413,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[379,414,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[380,415,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[381,416,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[382,417,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[383,418,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[384,419,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[385,420,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[386,421,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[387,422,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[388,423,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[389,424,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[390,425,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[391,426,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[392,427,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[393,428,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[394,429,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[395,430,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[396,431,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[397,432,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[398,433,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[399,434,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[400,435,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[401,436,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[402,437,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[403,438,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[404,439,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[405,440,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[406,441,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[407,442,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[408,443,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[409,444,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[410,445,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[411,446,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[412,447,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[413,448,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[414,449,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[415,450,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[416,451,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[417,452,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[418,453,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[419,454,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[420,455,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[421,456,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[422,457,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[423,458,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[424,459,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[425,460,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[426,461,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[427,462,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[428,463,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[429,464,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[430,465,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[431,466,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[432,467,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[433,468,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[434,469,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[435,470,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[436,471,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[437,472,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[438,473,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[439,474,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[440,475,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[441,476,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[442,477,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[443,478,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[444,479,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[445,480,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[446,481,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[447,482,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[448,483,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[449,484,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[450,485,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[451,486,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[452,487,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[453,488,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[454,489,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[455,490,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[456,491,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[457,492,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[458,493,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[459,494,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[460,495,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[461,496,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[462,497,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[463,498,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[464,499,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[465,500,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[466,501,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[467,502,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[468,503,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[469,504,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[470,505,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[471,506,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[472,507,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[473,508,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[474,509,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[475,510,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[476,511,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[477,512,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[478,513,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[479,514,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[480,515,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[481,516,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[482,517,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[483,518,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[484,519,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[485,520,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[486,521,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[487,522,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[488,523,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[489,524,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[490,525,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[491,526,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[492,527,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[493,528,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[494,529,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[495,530,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[496,531,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[497,532,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[498,533,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[499,534,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[500,535,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[501,536,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[502,537,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[503,538,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[504,539,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[505,540,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[506,541,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[507,542,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[508,543,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[509,544,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[510,545,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[511,546,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[512,547,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[513,548,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[514,549,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[515,550,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[516,551,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[517,552,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[518,553,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[519,554,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[520,555,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[521,556,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[522,557,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[523,558,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[524,559,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[525,560,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[526,561,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[527,562,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[528,563,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[529,564,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[530,565,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[531,566,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[532,567,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[533,568,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[534,569,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[535,570,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[536,571,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[537,572,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[538,573,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[539,574,0,{"virt_text_win_col":-1,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":4096,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true}],[540,577,0,{"virt_text_win_col":-3,"virt_text_hide":false,"virt_text_pos":"win_col","ns_id":3,"priority":10,"right_gravity":true,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" [msg_a49edd87f001eOJDDoq5Vb5hra]","OpencodeHint"]],"virt_text_repeat_linebreak":false}],[541,577,0,{"virt_text_hide":false,"virt_text_pos":"right_align","ns_id":3,"priority":9,"right_gravity":true,"virt_text":[[" 2025-11-03 13:35:15","OpencodeHint"]],"virt_text_repeat_linebreak":false}]],"lines":["----","","","help me fix the file","","[`lua/opencode/core.lua`](lua/opencode/core.lua)","","**Diagnostics:**  (3)","","----","","","Let's address the three EmmyLua diagnostics at line 130 in  `lua/opencode/core.lua`:","","### 1. `param-type-not-match`: expected `string` but found `string?`","- **Location:**  `state.active_session.id` (line 130, col 20)","- **Cause:** `state.active_session` may be `nil`, so `state.active_session.id` could error or be `nil`. The function expects a `string`, not a nullable string.","- **Fix:** Add a nil check for `state.active_session` before accessing `.id`.","","### 2. `param-type-not-match`: expected `{ agent: string?, messageID: string?, model: {...}?, parts: Part[], system: string?, tools: table<...>? }` but found `{ model = table, agent = any, parts = OpencodeMessagePart[], ... }`","- **Location:** `params` argument to `:create_message` (line 130, col 45)","- **Cause:** The `model` field in `params` is `{ providerID = string?, modelID = string? }`, but the expected type is `{ modelID: string, providerID: string }?`. The order and possibly the optionality are mismatched.","- **Fix:** Ensure the `model` field matches the expected type exactly: `{ modelID: string, providerID: string }`.","","### 3. `need-check-nil`: `state.active_session may be nil`","- **Location:** Same as #1. This is a reminder to check for nil before accessing `state.active_session.id`.","","---","","## Step-by-step Fix Plan","","```markdown","- [ ] 1. Add a nil check for `state.active_session` before accessing `.id` in `M.send_message`.","- [ ] 2. Ensure the `model` field in `params` matches the expected type `{ modelID: string, providerID: string }`.","- [ ] 3. Test the changes to ensure the diagnostics are resolved and the function works as expected.","```","","Let's start with step 1: Add a nil check for `state.active_session` before accessing `.id`.","","** edit** `/home/francis/Projects/_nvim/opencode.nvim/lua/opencode/core.lua`","","`````lua"," "," params.parts = context.format_message(prompt, opts.context)"," M.before_run(opts)"," "," if not state.active_session or not state.active_session.id then"," vim.notify('No active session to send message to', vim.log.levels.ERROR)"," return"," end"," state.api_client"," :create_message(state.active_session.id, params)"," :and_then(function(response)"," if not response or not response.info or not response.parts then","","`````","","**󰻛 Created Snapshot** `8e790371`","","----","","","Step 1 is complete: nil check for `state.active_session` before accessing `.id` is added.","","Now, let's address step 2: Ensure the `model` field in `params` matches the expected type `{ modelID: string, providerID: string }`.","","Currently, the code is:","```lua","if opts.model then"," local provider, model = opts.model:match('^(.-)/(.+)$')"," params.model = { providerID = provider, modelID = model }"," state.current_model = opts.model","end","```","The expected type is `{ modelID: string, providerID: string }`, but EmmyLua expects the order to be `modelID` first, then `providerID`. Let's update the assignment to match the expected order.","","I'll fix this now.","","** edit** `/home/francis/Projects/_nvim/opencode.nvim/lua/opencode/core.lua` 1s","","`````lua"," local params = {}"," "," if opts.model then"," local provider, model = opts.model:match('^(.-)/(.+)$')"," params.model = { providerID = provider, modelID = model }"," params.model = { modelID = model, providerID = provider }"," state.current_model = opts.model"," end"," "," if opts.agent then","","`````","","**󰻛 Created Snapshot** `f33f38a7`","","----","","","Step 2 is complete: the `model` field in `params` now matches the expected type `{ modelID = model, providerID = provider }`.","","Now, let's move to step 3: Test the changes to ensure the diagnostics are resolved and the function works as expected.","","I'll run the test suite using the provided script to verify everything is working.","","** run** `Run all tests to verify code changes` 3s","","`````bash","> ./run_tests.sh","","Running tests for opencode.nvim","------------------------------------------------","Starting...Scheduling: ./tests/minimal/plugin_spec.lua","","========================================\t","Testing: \t/home/francis/Projects/_nvim/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/keymap_spec.lua","Scheduling: ./tests/unit/opencode_server_spec.lua","Scheduling: ./tests/unit/context_completion_spec.lua","Scheduling: ./tests/unit/config_file_spec.lua","Scheduling: ./tests/unit/init_spec.lua","Scheduling: ./tests/unit/state_spec.lua","Scheduling: ./tests/unit/render_state_spec.lua","Scheduling: ./tests/unit/server_job_spec.lua","Scheduling: ./tests/unit/config_spec.lua","Scheduling: ./tests/unit/context_bar_spec.lua","Scheduling: ./tests/unit/renderer_spec.lua","Scheduling: ./tests/unit/api_client_spec.lua","Scheduling: ./tests/unit/core_spec.lua","Scheduling: ./tests/unit/session_spec.lua","Scheduling: ./tests/unit/event_manager_spec.lua","Scheduling: ./tests/unit/api_spec.lua","Scheduling: ./tests/unit/context_spec.lua","Scheduling: ./tests/unit/timer_spec.lua","Scheduling: ./tests/unit/util_spec.lua","Scheduling: ./tests/unit/snapshot_spec.lua","Scheduling: ./tests/unit/id_spec.lua","","========================================\t","Testing: \t/home/francis/Projects/_nvim/opencode.nvim/tests/unit/context_completion_spec.lua\t","Success\t||\tcontext completion get_source should return a completion source\t","Success\t||\tcontext completion complete function should return empty table when trigger char does not match\t","Success\t||\tcontext completion complete function should return context items when trigger char matches\t","Success\t||\tcontext completion complete function should include selection items when selections exist\t","Success\t||\tcontext completion complete function should include mentioned files when they exist\t","Success\t||\tcontext completion complete function should include subagent items when they exist\t","Success\t||\tcontext completion complete function should filter items based on input\t","Success\t||\tcontext completion complete function should sort items with available items first\t","Success\t||\tcontext completion on_complete function should handle nil item gracefully\t","Success\t||\tcontext completion on_complete function should handle item without data gracefully\t","Success\t||\tcontext completion on_complete function should toggle context enabled state for toggleable items\t","Success\t||\tcontext completion on_complete function should remove mentioned file when selected\t","Success\t||\tcontext completion on_complete function should remove subagent when selected\t","Success\t||\tcontext completion on_complete function should remove selection when selection item selected\t","Success\t||\tcontext completion on_complete function should clean up trigger character from current line\t","Success\t||\tcontext completion formatting functions should format diagnostics correctly\t","Success\t||\tcontext completion formatting functions should format cursor data correctly\t","Success\t||\tcontext completion formatting functions should format selection correctly\t","Success\t||\tcontext completion edge cases should handle empty context gracefully\t","Success\t||\tcontext completion edge cases should handle disabled contexts correctly\t","\t","Success: \t20\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/home/francis/Projects/_nvim/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_permission_keymap sets up permission keymaps when there is a current permission\t","Success\t||\topencode.keymap setup_permission_keymap should delete existing permission keymaps if no current permission exists after being set\t","Success\t||\topencode.keymap setup_permission_keymap does not set permission keymaps when there is no current permission\t","\t","Success: \t13\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/home/francis/Projects/_nvim/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/home/francis/Projects/_nvim/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_agents respects disabled defaults\t","Success\t||\tconfig_file.setup get_opencode_project returns project\t","\t","Success: \t4\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/home/francis/Projects/_nvim/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/home/francis/Projects/_nvim/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 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","\t","Success: \t37\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/home/francis/Projects/_nvim/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/home/francis/Projects/_nvim/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/home/francis/Projects/_nvim/opencode.nvim/tests/unit/context_bar_spec.lua\t","Success\t||\topencode.ui.context_bar opencode.ui.context_bar renders minimal winbar with right aligh token only\t","Success\t||\topencode.ui.context_bar opencode.ui.context_bar renders winbar with current file when present\t","Success\t||\topencode.ui.context_bar opencode.ui.context_bar renders winbar with multiple context elements\t","Success\t||\topencode.ui.context_bar opencode.ui.context_bar renders winbar with diagnostics\t","Success\t||\topencode.ui.context_bar opencode.ui.context_bar respects context enabled settings\t","Success\t||\topencode.ui.context_bar opencode.ui.context_bar handles empty winbar gracefully\t","Success\t||\topencode.ui.context_bar opencode.ui.context_bar does nothing when window is invalid\t","Success\t||\topencode.ui.context_bar opencode.ui.context_bar uses provided windows parameter\t","Success\t||\topencode.ui.context_bar setup subscribes to state changes\t","\t","Success: \t9\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/home/francis/Projects/_nvim/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","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/home/francis/Projects/_nvim/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 send_message persist options in state when sending message\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: \t11\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/home/francis/Projects/_nvim/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/home/francis/Projects/_nvim/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/home/francis/Projects/_nvim/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","File not added to context. Could not read.","","========================================\t","Testing: \t/home/francis/Projects/_nvim/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",":OpencodeOpenInput is deprecated. Use `:Opencode open input` instead",":OpencodeStop is deprecated. Use `:Opencode cancel` instead",":OpencodeClose is deprecated. Use `:Opencode close` instead","","========================================\t","Testing: \t/home/francis/Projects/_nvim/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 the main Opencode command and legacy commands\t","Success\t||\topencode.api setup sets up legacy command functions that route to main command\t","Success\t||\topencode.api Lua API provides callable functions that match commands\t","Success\t||\topencode.api run command argument parsing parses agent prefix and passes to send_message\t","Success\t||\topencode.api run command argument parsing parses model prefix and passes to send_message\t","Success\t||\topencode.api run command argument parsing parses context prefix and passes to send_message\t","Success\t||\topencode.api run command argument parsing parses multiple prefixes and passes all to send_message\t","Success\t||\topencode.api run command argument parsing works with run_new command\t","Success\t||\topencode.api run command argument parsing requires a prompt after prefixes\t","Success\t||\topencode.api run command argument parsing Lua API accepts opts directly without parsing\t","\t","Success: \t11\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/home/francis/Projects/_nvim/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","Success\t||\tutil.parse_run_args parses no prefixes\t","Success\t||\tutil.parse_run_args parses single agent prefix\t","Success\t||\tutil.parse_run_args parses single model prefix\t","Success\t||\tutil.parse_run_args parses single context prefix\t","Success\t||\tutil.parse_run_args parses multiple prefixes in order\t","Success\t||\tutil.parse_run_args parses context with multiple comma-delimited values\t","Success\t||\tutil.parse_run_args handles empty prompt after prefixes\t","Success\t||\tutil.parse_run_args handles empty string\t","Success\t||\tutil.parse_run_args stops parsing at first non-prefix token\t","\t","Success: \t14\t","Failed : \t0\t","========================================\t","","========================================\t","Testing: \t/home/francis/Projects/_nvim/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/home/francis/Projects/_nvim/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/home/francis/Projects/_nvim/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","Two pending permissions? existing: per_9efb5b2f3001aqJAFBMiGjFjVZ new: per_9efb5bc2a001j9Bd6bFjLB7hrc","Two pending permissions? existing: per_9efb5bc2a001j9Bd6bFjLB7hrc new: per_9efb5d6d1001uwVXQ9dhlBlgfO","","========================================\t","Testing: \t/home/francis/Projects/_nvim/opencode.nvim/tests/unit/renderer_spec.lua\t","Success\t||\trenderer replays ansi-codes correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays ansi-codes correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays ansi-codes correctly (session)\t","Success\t||\trenderer replays api-abort correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays api-abort correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays api-abort correctly (session)\t","Success\t||\trenderer replays api-error correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays api-error correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays api-error correctly (session)\t","Success\t||\trenderer replays cursor_data correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays cursor_data correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays cursor_data correctly (session)\t","Success\t||\trenderer replays diff correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays diff correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays diff correctly (session)\t","Success\t||\trenderer replays markdown-codefence correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays markdown-codefence correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays markdown-codefence correctly (session)\t","Success\t||\trenderer replays mentions-with-ranges correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays mentions-with-ranges correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays mentions-with-ranges correctly (session)\t","Success\t||\trenderer replays message-removal correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays message-removal correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays perf correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays perf correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays perf correctly (session)\t","Success\t||\trenderer replays permission-denied correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays permission-denied correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays permission-denied correctly (session)\t","Success\t||\trenderer replays permission-prompt correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays permission-prompt correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays permission correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays permission correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays permission correctly (session)\t","Success\t||\trenderer replays planning correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays planning correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays planning correctly (session)\t","Success\t||\trenderer replays redo-all correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays redo-all correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays redo-all correctly (session)\t","Success\t||\trenderer replays redo-once correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays redo-once correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays redo-once correctly (session)\t","Success\t||\trenderer replays revert correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays revert correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays revert correctly (session)\t","Success\t||\trenderer replays selection correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays selection correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays selection correctly (session)\t","Success\t||\trenderer replays shifting-and-multiple-perms correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays shifting-and-multiple-perms correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays simple-session correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays simple-session correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays simple-session correctly (session)\t","Success\t||\trenderer replays tool-invalid correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays tool-invalid correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays tool-invalid correctly (session)\t","Success\t||\trenderer replays updating-text correctly (event-by-event, collapsing)\t","Success\t||\trenderer replays updating-text correctly (event-by-event, no collapsing)\t","Success\t||\trenderer replays updating-text correctly (session)\t","\t","Success: \t60\t","Failed : \t0\t","========================================\t","✓ Unit tests passed","------------------------------------------------","All tests passed successfully!","","`````","","----","","","All steps are complete and all tests pass! Here’s a summary of what was fixed:","","- ✅ Added a nil check for `state.active_session` before accessing `.id` in `M.send_message`.","- ✅ Ensured the `model` field in `params` matches the expected type `{ modelID = ..., providerID = ... }`.","- ✅ Verified the fixes by running the full test suite—no errors or failures.","","Your file is now robust and EmmyLua diagnostics at line 130 are resolved. If you need further tweaks or want to address other diagnostics, let me know!","",""],"timestamp":1773947704} \ No newline at end of file diff --git a/tests/data/markdown-codefence.expected.json b/tests/data/markdown-codefence.expected.json index ac1dd777..e42339ff 100644 --- a/tests/data/markdown-codefence.expected.json +++ b/tests/data/markdown-codefence.expected.json @@ -1,1130 +1 @@ -{ - "actions": [ - { - "args": [ - "c64ddee834f1b802020a8f880eafa689f0b99406" - ], - "type": "diff_revert_selected_file", - "text": "[R]evert file", - "key": "R", - "range": { - "from": 23, - "to": 23 - }, - "display_line": 23 - }, - { - "args": [ - "c64ddee834f1b802020a8f880eafa689f0b99406" - ], - "type": "diff_revert_all", - "text": "Revert [A]ll", - "key": "A", - "range": { - "from": 23, - "to": 23 - }, - "display_line": 23 - }, - { - "args": [ - "c64ddee834f1b802020a8f880eafa689f0b99406" - ], - "type": "diff_open", - "text": "[D]iff", - "key": "D", - "range": { - "from": 23, - "to": 23 - }, - "display_line": 23 - } - ], - "extmarks": [ - [ - 1, - 1, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " claude-sonnet-4.5", - "OpencodeHint" - ], - [ - " [msg_a2cd04588001P9plKmrFnsNH3M]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "priority": 10, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "ns_id": 3 - } - ], - [ - 2, - 1, - 0, - { - "ns_id": 3, - "virt_text_pos": "right_align", - "right_gravity": true, - "priority": 9, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " 2025-10-28 21:53:58", - "OpencodeHint" - ] - ] - } - ], - [ - 3, - 5, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 4, - 6, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 5, - 7, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 6, - 8, - 0, - { - "ns_id": 3, - "end_row": 9, - "end_right_gravity": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "382", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "end_col": 0, - "priority": 5000, - "virt_text_hide": false - } - ], - [ - 7, - 8, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 8, - 9, - 0, - { - "ns_id": 3, - "end_row": 10, - "end_right_gravity": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "383", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "end_col": 0, - "priority": 5000, - "virt_text_hide": false - } - ], - [ - 9, - 9, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 10, - 10, - 0, - { - "ns_id": 3, - "end_row": 11, - "end_right_gravity": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "384", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "end_col": 0, - "priority": 5000, - "virt_text_hide": false - } - ], - [ - 11, - 10, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 12, - 11, - 0, - { - "ns_id": 3, - "end_row": 12, - "end_right_gravity": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "385", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "end_col": 0, - "priority": 5000, - "virt_text_hide": false - } - ], - [ - 13, - 11, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 14, - 12, - 0, - { - "ns_id": 3, - "end_row": 13, - "end_right_gravity": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "hl_eol": true, - "hl_group": "OpencodeDiffDelete", - "virt_text": [ - [ - "386", - "OpencodeDiffDeleteGutter" - ], - [ - "-", - "OpencodeDiffDeleteGutter" - ], - [ - " ", - "OpencodeDiffDeleteGutter" - ] - ], - "virt_text_pos": "overlay", - "end_col": 0, - "priority": 5000, - "virt_text_hide": false - } - ], - [ - 15, - 12, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 16, - 13, - 0, - { - "ns_id": 3, - "end_row": 14, - "end_right_gravity": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "hl_eol": true, - "hl_group": "OpencodeDiffDelete", - "virt_text": [ - [ - "387", - "OpencodeDiffDeleteGutter" - ], - [ - "-", - "OpencodeDiffDeleteGutter" - ], - [ - " ", - "OpencodeDiffDeleteGutter" - ] - ], - "virt_text_pos": "overlay", - "end_col": 0, - "priority": 5000, - "virt_text_hide": false - } - ], - [ - 17, - 13, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 18, - 14, - 0, - { - "ns_id": 3, - "end_row": 15, - "end_right_gravity": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "hl_eol": true, - "hl_group": "OpencodeDiffAdd", - "virt_text": [ - [ - "386", - "OpencodeDiffAddGutter" - ], - [ - "+", - "OpencodeDiffAddGutter" - ], - [ - " ", - "OpencodeDiffAddGutter" - ] - ], - "virt_text_pos": "overlay", - "end_col": 0, - "priority": 5000, - "virt_text_hide": false - } - ], - [ - 19, - 14, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 20, - 15, - 0, - { - "ns_id": 3, - "end_row": 16, - "end_right_gravity": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "hl_eol": true, - "hl_group": "OpencodeDiffAdd", - "virt_text": [ - [ - "387", - "OpencodeDiffAddGutter" - ], - [ - "+", - "OpencodeDiffAddGutter" - ], - [ - " ", - "OpencodeDiffAddGutter" - ] - ], - "virt_text_pos": "overlay", - "end_col": 0, - "priority": 5000, - "virt_text_hide": false - } - ], - [ - 21, - 15, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 22, - 16, - 0, - { - "ns_id": 3, - "end_row": 17, - "end_right_gravity": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "388", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "end_col": 0, - "priority": 5000, - "virt_text_hide": false - } - ], - [ - 23, - 16, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 24, - 17, - 0, - { - "ns_id": 3, - "end_row": 18, - "end_right_gravity": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "389", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "end_col": 0, - "priority": 5000, - "virt_text_hide": false - } - ], - [ - 25, - 17, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 26, - 18, - 0, - { - "ns_id": 3, - "end_row": 19, - "end_right_gravity": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "390", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "end_col": 0, - "priority": 5000, - "virt_text_hide": false - } - ], - [ - 27, - 18, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 28, - 19, - 0, - { - "ns_id": 3, - "end_row": 20, - "end_right_gravity": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "391", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "end_col": 0, - "priority": 5000, - "virt_text_hide": false - } - ], - [ - 29, - 19, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 30, - 20, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 31, - 21, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 32, - 26, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " claude-sonnet-4.5", - "OpencodeHint" - ], - [ - " [msg_a2cd062fb001UA0ZzR6JxgLxDQ]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "priority": 10, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "ns_id": 3 - } - ], - [ - 33, - 26, - 0, - { - "ns_id": 3, - "virt_text_pos": "right_align", - "right_gravity": true, - "priority": 9, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " 2025-10-28 21:54:05", - "OpencodeHint" - ] - ] - } - ], - [ - 34, - 31, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌󰭻 ", - "OpencodeMessageRoleUser" - ], - [ - " " - ], - [ - "USER", - "OpencodeMessageRoleUser" - ], - [ - "", - "OpencodeHint" - ], - [ - " [msg_a2cf5ce65001YLvVsYxIboFcP4]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "priority": 10, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "ns_id": 3 - } - ], - [ - 35, - 31, - 0, - { - "ns_id": 3, - "virt_text_pos": "right_align", - "right_gravity": true, - "priority": 9, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " 2025-10-28 22:34:58", - "OpencodeHint" - ] - ] - } - ], - [ - 36, - 32, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 37, - 33, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 38, - 34, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 39, - 35, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "priority": 4096, - "virt_text_hide": false, - "virt_text_repeat_linebreak": true, - "ns_id": 3 - } - ], - [ - 40, - 38, - 0, - { - "right_gravity": true, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "PLAN", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-4.1", - "OpencodeHint" - ], - [ - " [msg_a2cf5cf0f002oBAjmnGIMGXjez]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "priority": 10, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "ns_id": 3 - } - ], - [ - 41, - 38, - 0, - { - "ns_id": 3, - "virt_text_pos": "right_align", - "right_gravity": true, - "priority": 9, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " 2025-10-28 22:34:58", - "OpencodeHint" - ] - ] - } - ] - ], - "lines": [ - "----", - "", - "", - "Now let me also update the Run opts examples to use the new command syntax:", - "", - "** edit** `/Users/cam/Dev/neovim-dev/opencode.nvim/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?", - "", - "" - ], - "timestamp": 1772803137 -} +{"timestamp":1773947679,"lines":["----","","","Now let me also update the Run opts examples to use the new command syntax:","","** edit** `/Users/cam/Dev/neovim-dev/opencode.nvim/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?","",""],"actions":[{"key":"R","type":"diff_revert_selected_file","text":"[R]evert file","args":["c64ddee834f1b802020a8f880eafa689f0b99406"],"display_line":23,"range":{"to":23,"from":23}},{"key":"A","type":"diff_revert_all","text":"Revert [A]ll","args":["c64ddee834f1b802020a8f880eafa689f0b99406"],"display_line":23,"range":{"to":23,"from":23}},{"key":"D","type":"diff_open","text":"[D]iff","args":["c64ddee834f1b802020a8f880eafa689f0b99406"],"display_line":23,"range":{"to":23,"from":23}}],"extmarks":[[1,1,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"ns_id":3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" [msg_a2cd04588001P9plKmrFnsNH3M]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"virt_text_hide":false,"priority":10}],[2,1,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text":[[" 2025-10-28 21:53:58","OpencodeHint"]],"virt_text_pos":"right_align","ns_id":3,"virt_text_hide":false,"priority":9}],[3,5,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text_hide":false,"priority":4096}],[4,6,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text_hide":false,"priority":4096}],[5,7,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text_hide":false,"priority":4096}],[6,8,0,{"virt_text_repeat_linebreak":false,"virt_text":[["382","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"end_row":9,"end_right_gravity":false,"virt_text_hide":false,"end_col":0,"right_gravity":true,"ns_id":3,"virt_text_pos":"overlay","priority":5000}],[7,8,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text_hide":false,"priority":4096}],[8,9,0,{"virt_text_repeat_linebreak":false,"virt_text":[["383","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"end_row":10,"end_right_gravity":false,"virt_text_hide":false,"end_col":0,"right_gravity":true,"ns_id":3,"virt_text_pos":"overlay","priority":5000}],[9,9,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text_hide":false,"priority":4096}],[10,10,0,{"virt_text_repeat_linebreak":false,"virt_text":[["384","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"end_row":11,"end_right_gravity":false,"virt_text_hide":false,"end_col":0,"right_gravity":true,"ns_id":3,"virt_text_pos":"overlay","priority":5000}],[11,10,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text_hide":false,"priority":4096}],[12,11,0,{"virt_text_repeat_linebreak":false,"virt_text":[["385","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"end_row":12,"end_right_gravity":false,"virt_text_hide":false,"end_col":0,"right_gravity":true,"ns_id":3,"virt_text_pos":"overlay","priority":5000}],[13,11,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text_hide":false,"priority":4096}],[14,12,0,{"virt_text_repeat_linebreak":false,"hl_group":"OpencodeDiffDelete","virt_text":[["386","OpencodeDiffDeleteGutter"],["-","OpencodeDiffDeleteGutter"],[" ","OpencodeDiffDeleteGutter"]],"end_row":13,"end_right_gravity":false,"ns_id":3,"end_col":0,"right_gravity":true,"hl_eol":true,"priority":5000,"virt_text_pos":"overlay","virt_text_hide":false}],[15,12,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text_hide":false,"priority":4096}],[16,13,0,{"virt_text_repeat_linebreak":false,"hl_group":"OpencodeDiffDelete","virt_text":[["387","OpencodeDiffDeleteGutter"],["-","OpencodeDiffDeleteGutter"],[" ","OpencodeDiffDeleteGutter"]],"end_row":14,"end_right_gravity":false,"ns_id":3,"end_col":0,"right_gravity":true,"hl_eol":true,"priority":5000,"virt_text_pos":"overlay","virt_text_hide":false}],[17,13,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text_hide":false,"priority":4096}],[18,14,0,{"virt_text_repeat_linebreak":false,"hl_group":"OpencodeDiffAdd","virt_text":[["386","OpencodeDiffAddGutter"],["+","OpencodeDiffAddGutter"],[" ","OpencodeDiffAddGutter"]],"end_row":15,"end_right_gravity":false,"ns_id":3,"end_col":0,"right_gravity":true,"hl_eol":true,"priority":5000,"virt_text_pos":"overlay","virt_text_hide":false}],[19,14,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text_hide":false,"priority":4096}],[20,15,0,{"virt_text_repeat_linebreak":false,"hl_group":"OpencodeDiffAdd","virt_text":[["387","OpencodeDiffAddGutter"],["+","OpencodeDiffAddGutter"],[" ","OpencodeDiffAddGutter"]],"end_row":16,"end_right_gravity":false,"ns_id":3,"end_col":0,"right_gravity":true,"hl_eol":true,"priority":5000,"virt_text_pos":"overlay","virt_text_hide":false}],[21,15,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text_hide":false,"priority":4096}],[22,16,0,{"virt_text_repeat_linebreak":false,"virt_text":[["388","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"end_row":17,"end_right_gravity":false,"virt_text_hide":false,"end_col":0,"right_gravity":true,"ns_id":3,"virt_text_pos":"overlay","priority":5000}],[23,16,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text_hide":false,"priority":4096}],[24,17,0,{"virt_text_repeat_linebreak":false,"virt_text":[["389","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"end_row":18,"end_right_gravity":false,"virt_text_hide":false,"end_col":0,"right_gravity":true,"ns_id":3,"virt_text_pos":"overlay","priority":5000}],[25,17,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text_hide":false,"priority":4096}],[26,18,0,{"virt_text_repeat_linebreak":false,"virt_text":[["390","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"end_row":19,"end_right_gravity":false,"virt_text_hide":false,"end_col":0,"right_gravity":true,"ns_id":3,"virt_text_pos":"overlay","priority":5000}],[27,18,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text_hide":false,"priority":4096}],[28,19,0,{"virt_text_repeat_linebreak":false,"virt_text":[["391","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"end_row":20,"end_right_gravity":false,"virt_text_hide":false,"end_col":0,"right_gravity":true,"ns_id":3,"virt_text_pos":"overlay","priority":5000}],[29,19,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text_hide":false,"priority":4096}],[30,20,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text_hide":false,"priority":4096}],[31,21,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"virt_text_hide":false,"priority":4096}],[32,26,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"ns_id":3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" [msg_a2cd062fb001UA0ZzR6JxgLxDQ]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"virt_text_hide":false,"priority":10}],[33,26,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text":[[" 2025-10-28 21:54:05","OpencodeHint"]],"virt_text_pos":"right_align","ns_id":3,"virt_text_hide":false,"priority":9}],[34,31,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"ns_id":3,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" [msg_a2cf5ce65001YLvVsYxIboFcP4]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"virt_text_hide":false,"priority":10}],[35,31,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text":[[" 2025-10-28 22:34:58","OpencodeHint"]],"virt_text_pos":"right_align","ns_id":3,"virt_text_hide":false,"priority":9}],[36,32,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"virt_text_hide":false,"priority":4096}],[37,33,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"virt_text_hide":false,"priority":4096}],[38,34,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"virt_text_hide":false,"priority":4096}],[39,35,0,{"virt_text_repeat_linebreak":true,"right_gravity":true,"ns_id":3,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"virt_text_hide":false,"priority":4096}],[40,38,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"ns_id":3,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" [msg_a2cf5cf0f002oBAjmnGIMGXjez]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"virt_text_hide":false,"priority":10}],[41,38,0,{"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text":[[" 2025-10-28 22:34:58","OpencodeHint"]],"virt_text_pos":"right_align","ns_id":3,"virt_text_hide":false,"priority":9}]]} \ No newline at end of file diff --git a/tests/data/multiple-question-ask-reply-all.expected.json b/tests/data/multiple-question-ask-reply-all.expected.json index 3c296b29..dcf97b67 100644 --- a/tests/data/multiple-question-ask-reply-all.expected.json +++ b/tests/data/multiple-question-ask-reply-all.expected.json @@ -1,586 +1 @@ -{ - "actions": [ - { - "args": [ - "be64b6205f0da4c9240df2476dc35495429161b5" - ], - "display_line": 23, - "key": "R", - "range": { - "from": 23, - "to": 23 - }, - "text": "[R]evert file", - "type": "diff_revert_selected_file" - }, - { - "args": [ - "be64b6205f0da4c9240df2476dc35495429161b5" - ], - "display_line": 23, - "key": "A", - "range": { - "from": 23, - "to": 23 - }, - "text": "Revert [A]ll", - "type": "diff_revert_all" - }, - { - "args": [ - "be64b6205f0da4c9240df2476dc35495429161b5" - ], - "display_line": 23, - "key": "D", - "range": { - "from": 23, - "to": 23 - }, - "text": "[D]iff", - "type": "diff_open" - } - ], - "extmarks": [ - [ - 1, - 1, - 0, - { - "ns_id": 3, - "priority": 10, - "right_gravity": true, - "virt_text": [ - [ - "▌󰭻 ", - "OpencodeMessageRoleUser" - ], - [ - " " - ], - [ - "USER", - "OpencodeMessageRoleUser" - ], - [ - "", - "OpencodeHint" - ], - [ - " [msg_bfab6dbf3001ZOVHTFKR1CMUE5]", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_win_col": -3 - } - ], - [ - 2, - 1, - 0, - { - "ns_id": 3, - "priority": 9, - "right_gravity": true, - "virt_text": [ - [ - " 2026-01-26 14:30:46", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false - } - ], - [ - 3, - 2, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 4, - 3, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 5, - 4, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 6, - 5, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 7, - 6, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 8, - 8, - 0, - { - "ns_id": 3, - "priority": 10, - "right_gravity": true, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-4.1", - "OpencodeHint" - ], - [ - " [msg_bfab6dc80001FueCN7E2691J2R]", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_win_col": -3 - } - ], - [ - 9, - 8, - 0, - { - "ns_id": 3, - "priority": 9, - "right_gravity": true, - "virt_text": [ - [ - " 2026-01-26 14:30:46", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false - } - ], - [ - 10, - 10, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 11, - 11, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 12, - 12, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 13, - 13, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 14, - 14, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 15, - 15, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 16, - 16, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 17, - 17, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 18, - 18, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 19, - 19, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 20, - 20, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 21, - 21, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 22, - 26, - 0, - { - "ns_id": 3, - "priority": 10, - "right_gravity": true, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-4.1", - "OpencodeHint" - ], - [ - " [msg_bfab7e7fd0018kA9yLHMkJM3fA]", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_win_col": -3 - } - ], - [ - 23, - 26, - 0, - { - "ns_id": 3, - "priority": 9, - "right_gravity": true, - "virt_text": [ - [ - " 2026-01-26 14:31:55", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false - } - ] - ], - "lines": [ - "----", - "", - "", - "[`tests/replay/renderer_spec.lua`](tests/replay/renderer_spec.lua)", - "", - "can you use the question tool and ask me a couple of questions", - "", - "----", - "", - "", - "** question** ", - "", - "**Q1:** Which Lua testing framework do you use or prefer for your Neovim Lua plugins?", - "**A1:** busted", - "", - "**Q2:** How do you usually run your tests in this codebase?", - "**A2:** run_tests.sh (Recommended)", - "", - "**Q3:** multi-line question", - "The most important question of all:", - "Which team are you on?", - "**A3:** Coffee", - "", - "**󰻛 Created Snapshot** `be64b620`", - "", - "----", - "", - "", - "Thanks for your answers! You've indicated:", - "", - "- Preferred testing framework: **busted**", - "- Typical test running method: ** run_tests.sh (Recommended)**", - "", - "I have this in mind for any future testing, troubleshooting, or automation tasks you request for this Neovim Lua codebase. If you have any follow-up questions or tasks (such as test writing, modification, running, debugging, or reporting), let me know—I'll tailor my workflow to these preferences for maximal compatibility and consistency!", - "", - "" - ], - "timestamp": 1770935237 -} \ No newline at end of file +{"actions":[{"text":"[R]evert file","type":"diff_revert_selected_file","range":{"from":23,"to":23},"display_line":23,"args":["be64b6205f0da4c9240df2476dc35495429161b5"],"key":"R"},{"text":"Revert [A]ll","type":"diff_revert_all","range":{"from":23,"to":23},"display_line":23,"args":["be64b6205f0da4c9240df2476dc35495429161b5"],"key":"A"},{"text":"[D]iff","type":"diff_open","range":{"from":23,"to":23},"display_line":23,"args":["be64b6205f0da4c9240df2476dc35495429161b5"],"key":"D"}],"extmarks":[[1,1,0,{"virt_text_repeat_linebreak":false,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" [msg_bfab6dbf3001ZOVHTFKR1CMUE5]","OpencodeHint"]],"right_gravity":true,"virt_text_win_col":-3,"priority":10,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[2,1,0,{"virt_text_repeat_linebreak":false,"virt_text":[[" 2026-01-26 14:30:46","OpencodeHint"]],"right_gravity":true,"priority":9,"ns_id":3,"virt_text_pos":"right_align","virt_text_hide":false}],[3,2,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[4,3,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[5,4,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[6,5,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[7,6,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"right_gravity":true,"virt_text_win_col":-3,"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[8,8,0,{"virt_text_repeat_linebreak":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" [msg_bfab6dc80001FueCN7E2691J2R]","OpencodeHint"]],"right_gravity":true,"virt_text_win_col":-3,"priority":10,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[9,8,0,{"virt_text_repeat_linebreak":false,"virt_text":[[" 2026-01-26 14:30:46","OpencodeHint"]],"right_gravity":true,"priority":9,"ns_id":3,"virt_text_pos":"right_align","virt_text_hide":false}],[10,10,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[11,11,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[12,12,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[13,13,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[14,14,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[15,15,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[16,16,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[17,17,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[18,18,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[19,19,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[20,20,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[21,21,0,{"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"right_gravity":true,"virt_text_win_col":-1,"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[22,26,0,{"virt_text_repeat_linebreak":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" [msg_bfab7e7fd0018kA9yLHMkJM3fA]","OpencodeHint"]],"right_gravity":true,"virt_text_win_col":-3,"priority":10,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false}],[23,26,0,{"virt_text_repeat_linebreak":false,"virt_text":[[" 2026-01-26 14:31:55","OpencodeHint"]],"right_gravity":true,"priority":9,"ns_id":3,"virt_text_pos":"right_align","virt_text_hide":false}]],"lines":["----","","","[`tests/replay/renderer_spec.lua`](tests/replay/renderer_spec.lua)","","can you use the question tool and ask me a couple of questions","","----","","","** question** ","","**Q1:** Which Lua testing framework do you use or prefer for your Neovim Lua plugins?","**A1:** busted","","**Q2:** How do you usually run your tests in this codebase?","**A2:** run_tests.sh (Recommended)","","**Q3:** multi-line question","The most important question of all:","Which team are you on?","**A3:** Coffee","","**󰻛 Created Snapshot** `be64b620`","","----","","","Thanks for your answers! You've indicated:","","- Preferred testing framework: **busted**","- Typical test running method: **run_tests.sh (Recommended)**","","I have this in mind for any future testing, troubleshooting, or automation tasks you request for this Neovim Lua codebase. If you have any follow-up questions or tasks (such as test writing, modification, running, debugging, or reporting), let me know—I'll tailor my workflow to these preferences for maximal compatibility and consistency!","",""],"timestamp":1773947664} \ No newline at end of file diff --git a/tests/data/perf.expected.json b/tests/data/perf.expected.json index 5fbf2c46..2107b961 100644 --- a/tests/data/perf.expected.json +++ b/tests/data/perf.expected.json @@ -1,513 +1 @@ -{ - "actions": [], - "extmarks": [ - [ - 1, - 1, - 0, - { - "ns_id": 3, - "priority": 10, - "right_gravity": true, - "virt_text": [ - [ - "▌󰭻 ", - "OpencodeMessageRoleUser" - ], - [ - " " - ], - [ - "USER", - "OpencodeMessageRoleUser" - ], - [ - "", - "OpencodeHint" - ], - [ - " [msg_a17b4dc4c001x19oFZANB8CsEB]", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_win_col": -3 - } - ], - [ - 2, - 1, - 0, - { - "ns_id": 3, - "priority": 9, - "right_gravity": true, - "virt_text": [ - [ - " 2025-10-24 19:32:00", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false - } - ], - [ - 3, - 2, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 4, - 3, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 5, - 4, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 6, - 5, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 7, - 8, - 0, - { - "ns_id": 3, - "priority": 10, - "right_gravity": true, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-5-mini", - "OpencodeHint" - ], - [ - " [msg_a17b4e166001vCnLczdZXvqLL6]", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_win_col": -3 - } - ], - [ - 8, - 8, - 0, - { - "ns_id": 3, - "priority": 9, - "right_gravity": true, - "virt_text": [ - [ - " 2025-10-24 19:32:01", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false - } - ] - ], - "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.", - "", - "" - ], - "timestamp": 1770935238 -} \ No newline at end of file +{"actions":[],"extmarks":[[1,1,0,{"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" [msg_a17b4dc4c001x19oFZANB8CsEB]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"priority":10,"right_gravity":true,"virt_text_pos":"win_col","virt_text_hide":false,"ns_id":3}],[2,1,0,{"virt_text":[[" 2025-10-24 19:32:00","OpencodeHint"]],"virt_text_repeat_linebreak":false,"priority":9,"right_gravity":true,"virt_text_pos":"right_align","virt_text_hide":false,"ns_id":3}],[3,2,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"right_gravity":true,"virt_text_pos":"win_col","virt_text_hide":false,"ns_id":3}],[4,3,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"right_gravity":true,"virt_text_pos":"win_col","virt_text_hide":false,"ns_id":3}],[5,4,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"right_gravity":true,"virt_text_pos":"win_col","virt_text_hide":false,"ns_id":3}],[6,5,0,{"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"right_gravity":true,"virt_text_pos":"win_col","virt_text_hide":false,"ns_id":3}],[7,8,0,{"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" [msg_a17b4e166001vCnLczdZXvqLL6]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"priority":10,"right_gravity":true,"virt_text_pos":"win_col","virt_text_hide":false,"ns_id":3}],[8,8,0,{"virt_text":[[" 2025-10-24 19:32:01","OpencodeHint"]],"virt_text_repeat_linebreak":false,"priority":9,"right_gravity":true,"virt_text_pos":"right_align","virt_text_hide":false,"ns_id":3}]],"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.","",""],"timestamp":1773947644} \ No newline at end of file diff --git a/tests/data/permission-ask-new-approve.expected.json b/tests/data/permission-ask-new-approve.expected.json index 150f0546..510ec993 100644 --- a/tests/data/permission-ask-new-approve.expected.json +++ b/tests/data/permission-ask-new-approve.expected.json @@ -1,865 +1 @@ -{ - "actions": [ - { - "args": [ - "5ba6e95774829e7f501299039b72b72dc32c6620" - ], - "display_line": 36, - "key": "R", - "range": { - "from": 36, - "to": 36 - }, - "text": "[R]evert file", - "type": "diff_revert_selected_file" - }, - { - "args": [ - "5ba6e95774829e7f501299039b72b72dc32c6620" - ], - "display_line": 36, - "key": "A", - "range": { - "from": 36, - "to": 36 - }, - "text": "Revert [A]ll", - "type": "diff_revert_all" - }, - { - "args": [ - "5ba6e95774829e7f501299039b72b72dc32c6620" - ], - "display_line": 36, - "key": "D", - "range": { - "from": 36, - "to": 36 - }, - "text": "[D]iff", - "type": "diff_open" - } - ], - "extmarks": [ - [ - 1, - 1, - 0, - { - "ns_id": 3, - "priority": 10, - "right_gravity": true, - "virt_text": [ - [ - "▌󰭻 ", - "OpencodeMessageRoleUser" - ], - [ - " " - ], - [ - "USER", - "OpencodeMessageRoleUser" - ], - [ - "", - "OpencodeHint" - ], - [ - " [msg_b8e7c60a2001Kisjwk2mVB4dye]", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_win_col": -3 - } - ], - [ - 2, - 1, - 0, - { - "ns_id": 3, - "priority": 9, - "right_gravity": true, - "virt_text": [ - [ - " 2026-01-05 14:07:54", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false - } - ], - [ - 3, - 2, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 4, - 3, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 5, - 4, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 6, - 5, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 7, - 6, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 8, - 7, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 9, - 8, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 10, - 10, - 0, - { - "ns_id": 3, - "priority": 10, - "right_gravity": true, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-4.1", - "OpencodeHint" - ], - [ - " [msg_b8e7c60f1001aEWYlAaDRXQ4aJ]", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_win_col": -3 - } - ], - [ - 11, - 10, - 0, - { - "ns_id": 3, - "priority": 9, - "right_gravity": true, - "virt_text": [ - [ - " 2026-01-05 14:07:54", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false - } - ], - [ - 12, - 12, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 13, - 13, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 14, - 14, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 15, - 15, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 16, - 16, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 17, - 17, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 18, - 18, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 19, - 19, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 20, - 20, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 21, - 21, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 22, - 22, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 23, - 23, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 24, - 24, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 25, - 25, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 26, - 26, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 27, - 27, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 28, - 28, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 29, - 29, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 30, - 30, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 31, - 31, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 32, - 32, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 33, - 33, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 34, - 34, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -1 - } - ], - [ - 35, - 39, - 0, - { - "ns_id": 3, - "priority": 10, - "right_gravity": true, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-4.1", - "OpencodeHint" - ], - [ - " [msg_b8e7cde9e0013hRkUyt0X2yMil]", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_win_col": -3 - } - ], - [ - 36, - 39, - 0, - { - "ns_id": 3, - "priority": 9, - "right_gravity": true, - "virt_text": [ - [ - " 2026-01-05 14:08:26", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false - } - ] - ], - "lines": [ - "----", - "", - "", - "@no-trust run a git status and tell me what files are changed", - "", - "[`lua/opencode/ui/formatter.lua`](lua/opencode/ui/formatter.lua)", - "", - "**Diagnostics:**  (11)", - "", - "----", - "", - "", - "** run** `Shows working tree status` 30s", - "", - "`````bash", - "> git status", - "", - "On branch main", - "Your branch is up to date with 'origin/main'.", - "", - "Changes not staged for commit:", - " (use \"git add ...\" to update what will be committed)", - " (use \"git restore ...\" to discard changes in working directory)", - "\tmodified: lua/opencode/event_manager.lua", - "\tmodified: lua/opencode/ui/formatter.lua", - "\tmodified: lua/opencode/ui/renderer.lua", - "", - "Untracked files:", - " (use \"git add ...\" to include in what will be committed)", - "\ttest.lua", - "\ttests/data/permission_ask_new.json", - "", - "no changes added to commit (use \"git add\" and/or \"git commit -a\")", - "", - "`````", - "", - "**󰻛 Created Snapshot** `5ba6e957`", - "", - "----", - "", - "", - "Here are the files that have been changed according to git status:", - "", - "- Modified (but not staged):", - " -  `lua/opencode/event_manager.lua`", - " -  `lua/opencode/ui/formatter.lua`", - " -  `lua/opencode/ui/renderer.lua`", - "", - "- Untracked files:", - " - `test.lua`", - " - `tests/data/permission_ask_new.json`", - "", - "No files are currently staged for commit. Let me know if you want more details (like the diff), want to stage/commit, or need help with anything else!", - "", - "" - ], - "timestamp": 1770935238 -} \ No newline at end of file +{"timestamp":1773947621,"lines":["----","","","@no-trust run a git status and tell me what files are changed","","[`lua/opencode/ui/formatter.lua`](lua/opencode/ui/formatter.lua)","","**Diagnostics:**  (11)","","----","","","** run** `Shows working tree status` 30s","","`````bash","> git status","","On branch main","Your branch is up to date with 'origin/main'.","","Changes not staged for commit:"," (use \"git add ...\" to update what will be committed)"," (use \"git restore ...\" to discard changes in working directory)","\tmodified: lua/opencode/event_manager.lua","\tmodified: lua/opencode/ui/formatter.lua","\tmodified: lua/opencode/ui/renderer.lua","","Untracked files:"," (use \"git add ...\" to include in what will be committed)","\ttest.lua","\ttests/data/permission_ask_new.json","","no changes added to commit (use \"git add\" and/or \"git commit -a\")","","`````","","**󰻛 Created Snapshot** `5ba6e957`","","----","","","Here are the files that have been changed according to git status:","","- Modified (but not staged):"," -  `lua/opencode/event_manager.lua`"," -  `lua/opencode/ui/formatter.lua`"," -  `lua/opencode/ui/renderer.lua`","","- Untracked files:"," -  `test.lua`"," -  `tests/data/permission_ask_new.json`","","No files are currently staged for commit. Let me know if you want more details (like the diff), want to stage/commit, or need help with anything else!","",""],"extmarks":[[1,1,0,{"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" [msg_b8e7c60a2001Kisjwk2mVB4dye]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"ns_id":3,"right_gravity":true}],[2,1,0,{"virt_text_pos":"right_align","priority":9,"virt_text_hide":false,"virt_text":[[" 2026-01-05 14:07:54","OpencodeHint"]],"virt_text_repeat_linebreak":false,"ns_id":3,"right_gravity":true}],[3,2,0,{"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[4,3,0,{"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[5,4,0,{"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[6,5,0,{"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[7,6,0,{"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[8,7,0,{"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[9,8,0,{"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[10,10,0,{"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" [msg_b8e7c60f1001aEWYlAaDRXQ4aJ]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"ns_id":3,"right_gravity":true}],[11,10,0,{"virt_text_pos":"right_align","priority":9,"virt_text_hide":false,"virt_text":[[" 2026-01-05 14:07:54","OpencodeHint"]],"virt_text_repeat_linebreak":false,"ns_id":3,"right_gravity":true}],[12,12,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[13,13,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[14,14,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[15,15,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[16,16,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[17,17,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[18,18,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[19,19,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[20,20,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[21,21,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[22,22,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[23,23,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[24,24,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[25,25,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[26,26,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[27,27,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[28,28,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[29,29,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[30,30,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[31,31,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[32,32,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[33,33,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[34,34,0,{"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_repeat_linebreak":true,"ns_id":3,"right_gravity":true}],[35,39,0,{"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" [msg_b8e7cde9e0013hRkUyt0X2yMil]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"ns_id":3,"right_gravity":true}],[36,39,0,{"virt_text_pos":"right_align","priority":9,"virt_text_hide":false,"virt_text":[[" 2026-01-05 14:08:26","OpencodeHint"]],"virt_text_repeat_linebreak":false,"ns_id":3,"right_gravity":true}]],"actions":[{"type":"diff_revert_selected_file","text":"[R]evert file","display_line":36,"key":"R","args":["5ba6e95774829e7f501299039b72b72dc32c6620"],"range":{"to":36,"from":36}},{"type":"diff_revert_all","text":"Revert [A]ll","display_line":36,"key":"A","args":["5ba6e95774829e7f501299039b72b72dc32c6620"],"range":{"to":36,"from":36}},{"type":"diff_open","text":"[D]iff","display_line":36,"key":"D","args":["5ba6e95774829e7f501299039b72b72dc32c6620"],"range":{"to":36,"from":36}}]} \ No newline at end of file diff --git a/tests/data/redo-all.expected.json b/tests/data/redo-all.expected.json index cf7c37b7..5c7f07fe 100644 --- a/tests/data/redo-all.expected.json +++ b/tests/data/redo-all.expected.json @@ -1,1890 +1 @@ -{ - "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** `/home/francis/Projects/_nvim/opencode.nvim/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** `/home/francis/Projects/_nvim/opencode.nvim/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** `/home/francis/Projects/_nvim/opencode.nvim/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** `/home/francis/Projects/_nvim/opencode.nvim/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** `/home/francis/Projects/_nvim/opencode.nvim/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": [ - { - "key": "R", - "args": [ - "d988cc85565b99017d40ad8baea20225165be9d5" - ], - "display_line": 90, - "text": "[R]evert file", - "range": { - "to": 90, - "from": 90 - }, - "type": "diff_revert_selected_file" - }, - { - "key": "A", - "args": [ - "d988cc85565b99017d40ad8baea20225165be9d5" - ], - "display_line": 90, - "text": "Revert [A]ll", - "range": { - "to": 90, - "from": 90 - }, - "type": "diff_revert_all" - }, - { - "key": "D", - "args": [ - "d988cc85565b99017d40ad8baea20225165be9d5" - ], - "display_line": 90, - "text": "[D]iff", - "range": { - "to": 90, - "from": 90 - }, - "type": "diff_open" - }, - { - "key": "R", - "args": [ - "1b6ba655c6c0d899965adff278ac6320d5fc3b12" - ], - "display_line": 22, - "text": "[R]evert file", - "range": { - "to": 22, - "from": 22 - }, - "type": "diff_revert_selected_file" - }, - { - "key": "A", - "args": [ - "1b6ba655c6c0d899965adff278ac6320d5fc3b12" - ], - "display_line": 22, - "text": "Revert [A]ll", - "range": { - "to": 22, - "from": 22 - }, - "type": "diff_revert_all" - }, - { - "key": "D", - "args": [ - "1b6ba655c6c0d899965adff278ac6320d5fc3b12" - ], - "display_line": 22, - "text": "[D]iff", - "range": { - "to": 22, - "from": 22 - }, - "type": "diff_open" - }, - { - "key": "R", - "args": [ - "57d83f5596cb1f142fbc681d3d93b7184f7f73cd" - ], - "display_line": 56, - "text": "[R]evert file", - "range": { - "to": 56, - "from": 56 - }, - "type": "diff_revert_selected_file" - }, - { - "key": "A", - "args": [ - "57d83f5596cb1f142fbc681d3d93b7184f7f73cd" - ], - "display_line": 56, - "text": "Revert [A]ll", - "range": { - "to": 56, - "from": 56 - }, - "type": "diff_revert_all" - }, - { - "key": "D", - "args": [ - "57d83f5596cb1f142fbc681d3d93b7184f7f73cd" - ], - "display_line": 56, - "text": "[D]iff", - "range": { - "to": 56, - "from": 56 - }, - "type": "diff_open" - } - ], - "extmarks": [ - [ - 1, - 1, - 0, - { - "virt_text_win_col": -3, - "priority": 10, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "▌󰭻 ", - "OpencodeMessageRoleUser" - ], - [ - " " - ], - [ - "USER", - "OpencodeMessageRoleUser" - ], - [ - "", - "OpencodeHint" - ], - [ - " [msg_a0234c0b7001y2o9S1jMaNVZar]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 2, - 1, - 0, - { - "priority": 9, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " 2025-10-20 15:20:02", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align" - } - ], - [ - 3, - 2, - 0, - { - "virt_text_win_col": -3, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 4, - 3, - 0, - { - "virt_text_win_col": -3, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 5, - 4, - 0, - { - "virt_text_win_col": -3, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 6, - 5, - 0, - { - "virt_text_win_col": -3, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 7, - 8, - 0, - { - "virt_text_win_col": -3, - "priority": 10, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-5-mini", - "OpencodeHint" - ], - [ - " [msg_a0234c7960011LTxTvD94hfWCi]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 8, - 8, - 0, - { - "priority": 9, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " 2025-10-20 15:20:04", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align" - } - ], - [ - 9, - 12, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 10, - 13, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 11, - 14, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 12, - 15, - 0, - { - "end_row": 16, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "hl_group": "OpencodeDiffDelete", - "hl_eol": true, - "virt_text_pos": "overlay", - "priority": 5000, - "end_col": 0, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "1", - "OpencodeDiffDeleteGutter" - ], - [ - "-", - "OpencodeDiffDeleteGutter" - ], - [ - " ", - "OpencodeDiffDeleteGutter" - ] - ], - "end_right_gravity": false - } - ], - [ - 13, - 15, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 14, - 16, - 0, - { - "end_row": 17, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "hl_group": "OpencodeDiffAdd", - "hl_eol": true, - "virt_text_pos": "overlay", - "priority": 5000, - "end_col": 0, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "1", - "OpencodeDiffAddGutter" - ], - [ - "+", - "OpencodeDiffAddGutter" - ], - [ - " ", - "OpencodeDiffAddGutter" - ] - ], - "end_right_gravity": false - } - ], - [ - 15, - 16, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 16, - 17, - 0, - { - "end_row": 18, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "2", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "priority": 5000, - "end_col": 0, - "end_right_gravity": false - } - ], - [ - 17, - 17, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 18, - 18, - 0, - { - "end_row": 19, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "3", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "priority": 5000, - "end_col": 0, - "end_right_gravity": false - } - ], - [ - 19, - 18, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 20, - 19, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 21, - 20, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 22, - 25, - 0, - { - "virt_text_win_col": -3, - "priority": 10, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-5-mini", - "OpencodeHint" - ], - [ - " [msg_a0234d8fb001SXyngLjuKSuxOY]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 23, - 25, - 0, - { - "priority": 9, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " 2025-10-20 15:20:09", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align" - } - ], - [ - 24, - 30, - 0, - { - "virt_text_win_col": -3, - "priority": 10, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "▌󰭻 ", - "OpencodeMessageRoleUser" - ], - [ - " " - ], - [ - "USER", - "OpencodeMessageRoleUser" - ], - [ - "", - "OpencodeHint" - ], - [ - " [msg_a0234e308001SKl5bQUibp5gtI]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 25, - 30, - 0, - { - "priority": 9, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " 2025-10-20 15:20:11", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align" - } - ], - [ - 26, - 31, - 0, - { - "virt_text_win_col": -3, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 27, - 32, - 0, - { - "virt_text_win_col": -3, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 28, - 35, - 0, - { - "virt_text_win_col": -3, - "priority": 10, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-5-mini", - "OpencodeHint" - ], - [ - " [msg_a0234e31f001m4EsQdPmY3PTtS]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 29, - 35, - 0, - { - "priority": 9, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " 2025-10-20 15:20:11", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align" - } - ], - [ - 30, - 42, - 0, - { - "virt_text_win_col": -3, - "priority": 10, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-5-mini", - "OpencodeHint" - ], - [ - " [msg_a0234f482001PQbMjWc6W8s0eF]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 31, - 42, - 0, - { - "priority": 9, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " 2025-10-20 15:20:16", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align" - } - ], - [ - 32, - 46, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 33, - 47, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 34, - 48, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 35, - 49, - 0, - { - "end_row": 50, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "hl_group": "OpencodeDiffDelete", - "hl_eol": true, - "virt_text_pos": "overlay", - "priority": 5000, - "end_col": 0, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "1", - "OpencodeDiffDeleteGutter" - ], - [ - "-", - "OpencodeDiffDeleteGutter" - ], - [ - " ", - "OpencodeDiffDeleteGutter" - ] - ], - "end_right_gravity": false - } - ], - [ - 36, - 49, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 37, - 50, - 0, - { - "end_row": 51, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "hl_group": "OpencodeDiffAdd", - "hl_eol": true, - "virt_text_pos": "overlay", - "priority": 5000, - "end_col": 0, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "1", - "OpencodeDiffAddGutter" - ], - [ - "+", - "OpencodeDiffAddGutter" - ], - [ - " ", - "OpencodeDiffAddGutter" - ] - ], - "end_right_gravity": false - } - ], - [ - 38, - 50, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 39, - 51, - 0, - { - "end_row": 52, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "2", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "priority": 5000, - "end_col": 0, - "end_right_gravity": false - } - ], - [ - 40, - 51, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 41, - 52, - 0, - { - "end_row": 53, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "3", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "priority": 5000, - "end_col": 0, - "end_right_gravity": false - } - ], - [ - 42, - 52, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 43, - 53, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 44, - 54, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 45, - 59, - 0, - { - "virt_text_win_col": -3, - "priority": 10, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-5-mini", - "OpencodeHint" - ], - [ - " [msg_a0234f9c6001JCKYaca1HHwwx6]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 46, - 59, - 0, - { - "priority": 9, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " 2025-10-20 15:20:17", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align" - } - ], - [ - 47, - 64, - 0, - { - "virt_text_win_col": -3, - "priority": 10, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "▌󰭻 ", - "OpencodeMessageRoleUser" - ], - [ - " " - ], - [ - "USER", - "OpencodeMessageRoleUser" - ], - [ - "", - "OpencodeHint" - ], - [ - " [msg_a0236fd1c001TlwqL8fwvq529i]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 48, - 64, - 0, - { - "priority": 9, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " 2025-10-20 15:22:29", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align" - } - ], - [ - 49, - 65, - 0, - { - "virt_text_win_col": -3, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 50, - 66, - 0, - { - "virt_text_win_col": -3, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 51, - 69, - 0, - { - "virt_text_win_col": -3, - "priority": 10, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-5-mini", - "OpencodeHint" - ], - [ - " [msg_a0236fd57001pTnTjSBdFlleCb]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 52, - 69, - 0, - { - "priority": 9, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " 2025-10-20 15:22:29", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align" - } - ], - [ - 53, - 76, - 0, - { - "virt_text_win_col": -3, - "priority": 10, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-5-mini", - "OpencodeHint" - ], - [ - " [msg_a02371241001PBQAsr8Oc9hqNI]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 54, - 76, - 0, - { - "priority": 9, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " 2025-10-20 15:22:34", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align" - } - ], - [ - 55, - 80, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 56, - 81, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 57, - 82, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 58, - 83, - 0, - { - "end_row": 84, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "hl_group": "OpencodeDiffDelete", - "hl_eol": true, - "virt_text_pos": "overlay", - "priority": 5000, - "end_col": 0, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "1", - "OpencodeDiffDeleteGutter" - ], - [ - "-", - "OpencodeDiffDeleteGutter" - ], - [ - " ", - "OpencodeDiffDeleteGutter" - ] - ], - "end_right_gravity": false - } - ], - [ - 59, - 83, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 60, - 84, - 0, - { - "end_row": 85, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "hl_group": "OpencodeDiffAdd", - "hl_eol": true, - "virt_text_pos": "overlay", - "priority": 5000, - "end_col": 0, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "1", - "OpencodeDiffAddGutter" - ], - [ - "+", - "OpencodeDiffAddGutter" - ], - [ - " ", - "OpencodeDiffAddGutter" - ] - ], - "end_right_gravity": false - } - ], - [ - 61, - 84, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 62, - 85, - 0, - { - "end_row": 86, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "2", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "priority": 5000, - "end_col": 0, - "end_right_gravity": false - } - ], - [ - 63, - 85, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 64, - 86, - 0, - { - "end_row": 87, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - "3", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "virt_text_pos": "overlay", - "priority": 5000, - "end_col": 0, - "end_right_gravity": false - } - ], - [ - 65, - 86, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 66, - 87, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 67, - 88, - 0, - { - "virt_text_win_col": -1, - "priority": 4096, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": true, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 68, - 93, - 0, - { - "virt_text_win_col": -3, - "priority": 10, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-5-mini", - "OpencodeHint" - ], - [ - " [msg_a023723d0001r87MaJThFssUw1]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col" - } - ], - [ - 69, - 93, - 0, - { - "priority": 9, - "ns_id": 3, - "virt_text_hide": false, - "right_gravity": true, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [ - " 2025-10-20 15:22:39", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align" - } - ] - ], - "timestamp": 1772803147 -} +{"extmarks":[[1,1,0,{"virt_text_pos":"win_col","virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" [msg_a0234c0b7001y2o9S1jMaNVZar]","OpencodeHint"]],"ns_id":3,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[2,1,0,{"virt_text":[[" 2025-10-20 15:20:02","OpencodeHint"]],"ns_id":3,"virt_text_pos":"right_align","priority":9,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[3,2,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]],"ns_id":3,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[4,3,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]],"ns_id":3,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[5,4,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]],"ns_id":3,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[6,5,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]],"ns_id":3,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[7,8,0,{"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" [msg_a0234c7960011LTxTvD94hfWCi]","OpencodeHint"]],"ns_id":3,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[8,8,0,{"virt_text":[[" 2025-10-20 15:20:04","OpencodeHint"]],"ns_id":3,"virt_text_pos":"right_align","priority":9,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[9,12,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[10,13,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[11,14,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[12,15,0,{"hl_group":"OpencodeDiffDelete","virt_text":[["1","OpencodeDiffDeleteGutter"],["-","OpencodeDiffDeleteGutter"],[" ","OpencodeDiffDeleteGutter"]],"end_col":0,"priority":5000,"right_gravity":true,"virt_text_pos":"overlay","ns_id":3,"end_row":16,"end_right_gravity":false,"virt_text_hide":false,"hl_eol":true,"virt_text_repeat_linebreak":false}],[13,15,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[14,16,0,{"hl_group":"OpencodeDiffAdd","virt_text":[["1","OpencodeDiffAddGutter"],["+","OpencodeDiffAddGutter"],[" ","OpencodeDiffAddGutter"]],"end_col":0,"priority":5000,"right_gravity":true,"virt_text_pos":"overlay","ns_id":3,"end_row":17,"end_right_gravity":false,"virt_text_hide":false,"hl_eol":true,"virt_text_repeat_linebreak":false}],[15,16,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[16,17,0,{"virt_text":[["2","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"end_col":0,"priority":5000,"right_gravity":true,"ns_id":3,"end_row":18,"end_right_gravity":false,"virt_text_hide":false,"virt_text_pos":"overlay","virt_text_repeat_linebreak":false}],[17,17,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[18,18,0,{"virt_text":[["3","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"end_col":0,"priority":5000,"right_gravity":true,"ns_id":3,"end_row":19,"end_right_gravity":false,"virt_text_hide":false,"virt_text_pos":"overlay","virt_text_repeat_linebreak":false}],[19,18,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[20,19,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[21,20,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[22,25,0,{"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" [msg_a0234d8fb001SXyngLjuKSuxOY]","OpencodeHint"]],"ns_id":3,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[23,25,0,{"virt_text":[[" 2025-10-20 15:20:09","OpencodeHint"]],"ns_id":3,"virt_text_pos":"right_align","priority":9,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[24,30,0,{"virt_text_pos":"win_col","virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" [msg_a0234e308001SKl5bQUibp5gtI]","OpencodeHint"]],"ns_id":3,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[25,30,0,{"virt_text":[[" 2025-10-20 15:20:11","OpencodeHint"]],"ns_id":3,"virt_text_pos":"right_align","priority":9,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[26,31,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]],"ns_id":3,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[27,32,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]],"ns_id":3,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[28,35,0,{"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" [msg_a0234e31f001m4EsQdPmY3PTtS]","OpencodeHint"]],"ns_id":3,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[29,35,0,{"virt_text":[[" 2025-10-20 15:20:11","OpencodeHint"]],"ns_id":3,"virt_text_pos":"right_align","priority":9,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[30,42,0,{"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" [msg_a0234f482001PQbMjWc6W8s0eF]","OpencodeHint"]],"ns_id":3,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[31,42,0,{"virt_text":[[" 2025-10-20 15:20:16","OpencodeHint"]],"ns_id":3,"virt_text_pos":"right_align","priority":9,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[32,46,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[33,47,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[34,48,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[35,49,0,{"hl_group":"OpencodeDiffDelete","virt_text":[["1","OpencodeDiffDeleteGutter"],["-","OpencodeDiffDeleteGutter"],[" ","OpencodeDiffDeleteGutter"]],"end_col":0,"priority":5000,"right_gravity":true,"virt_text_pos":"overlay","ns_id":3,"end_row":50,"end_right_gravity":false,"virt_text_hide":false,"hl_eol":true,"virt_text_repeat_linebreak":false}],[36,49,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[37,50,0,{"hl_group":"OpencodeDiffAdd","virt_text":[["1","OpencodeDiffAddGutter"],["+","OpencodeDiffAddGutter"],[" ","OpencodeDiffAddGutter"]],"end_col":0,"priority":5000,"right_gravity":true,"virt_text_pos":"overlay","ns_id":3,"end_row":51,"end_right_gravity":false,"virt_text_hide":false,"hl_eol":true,"virt_text_repeat_linebreak":false}],[38,50,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[39,51,0,{"virt_text":[["2","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"end_col":0,"priority":5000,"right_gravity":true,"ns_id":3,"end_row":52,"end_right_gravity":false,"virt_text_hide":false,"virt_text_pos":"overlay","virt_text_repeat_linebreak":false}],[40,51,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[41,52,0,{"virt_text":[["3","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"end_col":0,"priority":5000,"right_gravity":true,"ns_id":3,"end_row":53,"end_right_gravity":false,"virt_text_hide":false,"virt_text_pos":"overlay","virt_text_repeat_linebreak":false}],[42,52,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[43,53,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[44,54,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[45,59,0,{"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" [msg_a0234f9c6001JCKYaca1HHwwx6]","OpencodeHint"]],"ns_id":3,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[46,59,0,{"virt_text":[[" 2025-10-20 15:20:17","OpencodeHint"]],"ns_id":3,"virt_text_pos":"right_align","priority":9,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[47,64,0,{"virt_text_pos":"win_col","virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" [msg_a0236fd1c001TlwqL8fwvq529i]","OpencodeHint"]],"ns_id":3,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[48,64,0,{"virt_text":[[" 2025-10-20 15:22:29","OpencodeHint"]],"ns_id":3,"virt_text_pos":"right_align","priority":9,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[49,65,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]],"ns_id":3,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[50,66,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]],"ns_id":3,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[51,69,0,{"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" [msg_a0236fd57001pTnTjSBdFlleCb]","OpencodeHint"]],"ns_id":3,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[52,69,0,{"virt_text":[[" 2025-10-20 15:22:29","OpencodeHint"]],"ns_id":3,"virt_text_pos":"right_align","priority":9,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[53,76,0,{"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" [msg_a02371241001PBQAsr8Oc9hqNI]","OpencodeHint"]],"ns_id":3,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[54,76,0,{"virt_text":[[" 2025-10-20 15:22:34","OpencodeHint"]],"ns_id":3,"virt_text_pos":"right_align","priority":9,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[55,80,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[56,81,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[57,82,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[58,83,0,{"hl_group":"OpencodeDiffDelete","virt_text":[["1","OpencodeDiffDeleteGutter"],["-","OpencodeDiffDeleteGutter"],[" ","OpencodeDiffDeleteGutter"]],"end_col":0,"priority":5000,"right_gravity":true,"virt_text_pos":"overlay","ns_id":3,"end_row":84,"end_right_gravity":false,"virt_text_hide":false,"hl_eol":true,"virt_text_repeat_linebreak":false}],[59,83,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[60,84,0,{"hl_group":"OpencodeDiffAdd","virt_text":[["1","OpencodeDiffAddGutter"],["+","OpencodeDiffAddGutter"],[" ","OpencodeDiffAddGutter"]],"end_col":0,"priority":5000,"right_gravity":true,"virt_text_pos":"overlay","ns_id":3,"end_row":85,"end_right_gravity":false,"virt_text_hide":false,"hl_eol":true,"virt_text_repeat_linebreak":false}],[61,84,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[62,85,0,{"virt_text":[["2","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"end_col":0,"priority":5000,"right_gravity":true,"ns_id":3,"end_row":86,"end_right_gravity":false,"virt_text_hide":false,"virt_text_pos":"overlay","virt_text_repeat_linebreak":false}],[63,85,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[64,86,0,{"virt_text":[["3","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"end_col":0,"priority":5000,"right_gravity":true,"ns_id":3,"end_row":87,"end_right_gravity":false,"virt_text_hide":false,"virt_text_pos":"overlay","virt_text_repeat_linebreak":false}],[65,86,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[66,87,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[67,88,0,{"virt_text_pos":"win_col","virt_text":[["▌","OpencodeToolBorder"]],"ns_id":3,"virt_text_win_col":-1,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true}],[68,93,0,{"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" [msg_a023723d0001r87MaJThFssUw1]","OpencodeHint"]],"ns_id":3,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}],[69,93,0,{"virt_text":[[" 2025-10-20 15:22:39","OpencodeHint"]],"ns_id":3,"virt_text_pos":"right_align","priority":9,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true}]],"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** `/home/francis/Projects/_nvim/opencode.nvim/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** `/home/francis/Projects/_nvim/opencode.nvim/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** `/home/francis/Projects/_nvim/opencode.nvim/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** `/home/francis/Projects/_nvim/opencode.nvim/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** `/home/francis/Projects/_nvim/opencode.nvim/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":1773947607,"actions":[{"display_line":90,"args":["d988cc85565b99017d40ad8baea20225165be9d5"],"type":"diff_revert_selected_file","text":"[R]evert file","range":{"to":90,"from":90},"key":"R"},{"display_line":90,"args":["d988cc85565b99017d40ad8baea20225165be9d5"],"type":"diff_revert_all","text":"Revert [A]ll","range":{"to":90,"from":90},"key":"A"},{"display_line":90,"args":["d988cc85565b99017d40ad8baea20225165be9d5"],"type":"diff_open","text":"[D]iff","range":{"to":90,"from":90},"key":"D"},{"display_line":56,"args":["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"],"type":"diff_revert_selected_file","text":"[R]evert file","range":{"to":56,"from":56},"key":"R"},{"display_line":56,"args":["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"],"type":"diff_revert_all","text":"Revert [A]ll","range":{"to":56,"from":56},"key":"A"},{"display_line":56,"args":["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"],"type":"diff_open","text":"[D]iff","range":{"to":56,"from":56},"key":"D"},{"display_line":22,"args":["1b6ba655c6c0d899965adff278ac6320d5fc3b12"],"type":"diff_revert_selected_file","text":"[R]evert file","range":{"to":22,"from":22},"key":"R"},{"display_line":22,"args":["1b6ba655c6c0d899965adff278ac6320d5fc3b12"],"type":"diff_revert_all","text":"Revert [A]ll","range":{"to":22,"from":22},"key":"A"},{"display_line":22,"args":["1b6ba655c6c0d899965adff278ac6320d5fc3b12"],"type":"diff_open","text":"[D]iff","range":{"to":22,"from":22},"key":"D"}]} \ No newline at end of file diff --git a/tests/data/redo-once.expected.json b/tests/data/redo-once.expected.json index 484fcd98..70ca72fc 100644 --- a/tests/data/redo-once.expected.json +++ b/tests/data/redo-once.expected.json @@ -1,1304 +1 @@ -{ - "extmarks": [ - [ - 1, - 1, - 0, - { - "priority": 10, - "virt_text": [ - [ - "▌󰭻 ", - "OpencodeMessageRoleUser" - ], - [ - " " - ], - [ - "USER", - "OpencodeMessageRoleUser" - ], - [ - "", - "OpencodeHint" - ], - [ - " [msg_a0234c0b7001y2o9S1jMaNVZar]", - "OpencodeHint" - ] - ], - "virt_text_win_col": -3, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 2, - 1, - 0, - { - "virt_text": [ - [ - " 2025-10-20 15:20:02", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align", - "virt_text_hide": false, - "priority": 9, - "virt_text_repeat_linebreak": false, - "ns_id": 3, - "right_gravity": true - } - ], - [ - 3, - 2, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_win_col": -3, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 4, - 3, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_win_col": -3, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 5, - 4, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_win_col": -3, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 6, - 5, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_win_col": -3, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 7, - 8, - 0, - { - "priority": 10, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-5-mini", - "OpencodeHint" - ], - [ - " [msg_a0234c7960011LTxTvD94hfWCi]", - "OpencodeHint" - ] - ], - "virt_text_win_col": -3, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 8, - 8, - 0, - { - "virt_text": [ - [ - " 2025-10-20 15:20:04", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align", - "virt_text_hide": false, - "priority": 9, - "virt_text_repeat_linebreak": false, - "ns_id": 3, - "right_gravity": true - } - ], - [ - 9, - 12, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_win_col": -1, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 10, - 13, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_win_col": -1, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 11, - 14, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_win_col": -1, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 12, - 15, - 0, - { - "hl_group": "OpencodeDiffDelete", - "end_row": 16, - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "hl_eol": true, - "right_gravity": true, - "end_col": 0, - "ns_id": 3, - "priority": 5000, - "virt_text_pos": "overlay", - "virt_text": [ - [ - "1", - "OpencodeDiffDeleteGutter" - ], - [ - "-", - "OpencodeDiffDeleteGutter" - ], - [ - " ", - "OpencodeDiffDeleteGutter" - ] - ] - } - ], - [ - 13, - 15, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_win_col": -1, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 14, - 16, - 0, - { - "hl_group": "OpencodeDiffAdd", - "end_row": 17, - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "hl_eol": true, - "right_gravity": true, - "end_col": 0, - "ns_id": 3, - "priority": 5000, - "virt_text_pos": "overlay", - "virt_text": [ - [ - "1", - "OpencodeDiffAddGutter" - ], - [ - "+", - "OpencodeDiffAddGutter" - ], - [ - " ", - "OpencodeDiffAddGutter" - ] - ] - } - ], - [ - 15, - 16, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_win_col": -1, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 16, - 17, - 0, - { - "virt_text": [ - [ - "2", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "end_col": 0, - "priority": 5000, - "ns_id": 3, - "virt_text_pos": "overlay", - "end_row": 18 - } - ], - [ - 17, - 17, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_win_col": -1, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 18, - 18, - 0, - { - "virt_text": [ - [ - "3", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "end_col": 0, - "priority": 5000, - "ns_id": 3, - "virt_text_pos": "overlay", - "end_row": 19 - } - ], - [ - 19, - 18, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_win_col": -1, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 20, - 19, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_win_col": -1, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 21, - 20, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_win_col": -1, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 22, - 25, - 0, - { - "priority": 10, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-5-mini", - "OpencodeHint" - ], - [ - " [msg_a0234d8fb001SXyngLjuKSuxOY]", - "OpencodeHint" - ] - ], - "virt_text_win_col": -3, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 23, - 25, - 0, - { - "virt_text": [ - [ - " 2025-10-20 15:20:09", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align", - "virt_text_hide": false, - "priority": 9, - "virt_text_repeat_linebreak": false, - "ns_id": 3, - "right_gravity": true - } - ], - [ - 24, - 30, - 0, - { - "priority": 10, - "virt_text": [ - [ - "▌󰭻 ", - "OpencodeMessageRoleUser" - ], - [ - " " - ], - [ - "USER", - "OpencodeMessageRoleUser" - ], - [ - "", - "OpencodeHint" - ], - [ - " [msg_a0234e308001SKl5bQUibp5gtI]", - "OpencodeHint" - ] - ], - "virt_text_win_col": -3, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 25, - 30, - 0, - { - "virt_text": [ - [ - " 2025-10-20 15:20:11", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align", - "virt_text_hide": false, - "priority": 9, - "virt_text_repeat_linebreak": false, - "ns_id": 3, - "right_gravity": true - } - ], - [ - 26, - 31, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_win_col": -3, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 27, - 32, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_win_col": -3, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 28, - 35, - 0, - { - "priority": 10, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-5-mini", - "OpencodeHint" - ], - [ - " [msg_a0234e31f001m4EsQdPmY3PTtS]", - "OpencodeHint" - ] - ], - "virt_text_win_col": -3, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 29, - 35, - 0, - { - "virt_text": [ - [ - " 2025-10-20 15:20:11", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align", - "virt_text_hide": false, - "priority": 9, - "virt_text_repeat_linebreak": false, - "ns_id": 3, - "right_gravity": true - } - ], - [ - 30, - 42, - 0, - { - "priority": 10, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-5-mini", - "OpencodeHint" - ], - [ - " [msg_a0234f482001PQbMjWc6W8s0eF]", - "OpencodeHint" - ] - ], - "virt_text_win_col": -3, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 31, - 42, - 0, - { - "virt_text": [ - [ - " 2025-10-20 15:20:16", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align", - "virt_text_hide": false, - "priority": 9, - "virt_text_repeat_linebreak": false, - "ns_id": 3, - "right_gravity": true - } - ], - [ - 32, - 46, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_win_col": -1, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 33, - 47, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_win_col": -1, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 34, - 48, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_win_col": -1, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 35, - 49, - 0, - { - "hl_group": "OpencodeDiffDelete", - "end_row": 50, - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "hl_eol": true, - "right_gravity": true, - "end_col": 0, - "ns_id": 3, - "priority": 5000, - "virt_text_pos": "overlay", - "virt_text": [ - [ - "1", - "OpencodeDiffDeleteGutter" - ], - [ - "-", - "OpencodeDiffDeleteGutter" - ], - [ - " ", - "OpencodeDiffDeleteGutter" - ] - ] - } - ], - [ - 36, - 49, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_win_col": -1, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 37, - 50, - 0, - { - "hl_group": "OpencodeDiffAdd", - "end_row": 51, - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "hl_eol": true, - "right_gravity": true, - "end_col": 0, - "ns_id": 3, - "priority": 5000, - "virt_text_pos": "overlay", - "virt_text": [ - [ - "1", - "OpencodeDiffAddGutter" - ], - [ - "+", - "OpencodeDiffAddGutter" - ], - [ - " ", - "OpencodeDiffAddGutter" - ] - ] - } - ], - [ - 38, - 50, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_win_col": -1, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 39, - 51, - 0, - { - "virt_text": [ - [ - "2", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "end_col": 0, - "priority": 5000, - "ns_id": 3, - "virt_text_pos": "overlay", - "end_row": 52 - } - ], - [ - 40, - 51, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_win_col": -1, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 41, - 52, - 0, - { - "virt_text": [ - [ - "3", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "end_col": 0, - "priority": 5000, - "ns_id": 3, - "virt_text_pos": "overlay", - "end_row": 53 - } - ], - [ - 42, - 52, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_win_col": -1, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 43, - 53, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_win_col": -1, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 44, - 54, - 0, - { - "priority": 4096, - "virt_text": [ - [ - "▌", - "OpencodeToolBorder" - ] - ], - "virt_text_win_col": -1, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 45, - 59, - 0, - { - "priority": 10, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "BUILD", - "OpencodeMessageRoleAssistant" - ], - [ - " gpt-5-mini", - "OpencodeHint" - ], - [ - " [msg_a0234f9c6001JCKYaca1HHwwx6]", - "OpencodeHint" - ] - ], - "virt_text_win_col": -3, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 46, - 59, - 0, - { - "virt_text": [ - [ - " 2025-10-20 15:20:17", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align", - "virt_text_hide": false, - "priority": 9, - "virt_text_repeat_linebreak": false, - "ns_id": 3, - "right_gravity": true - } - ], - [ - 47, - 69, - 0, - { - "priority": 1000, - "virt_text": [ - [ - "+1", - "OpencodeDiffAddText" - ] - ], - "virt_text_win_col": 12, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_hide": false, - "right_gravity": true - } - ], - [ - 48, - 69, - 0, - { - "priority": 1000, - "virt_text": [ - [ - "-1", - "OpencodeDiffDeleteText" - ] - ], - "virt_text_win_col": 15, - "ns_id": 3, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_hide": false, - "right_gravity": true - } - ] - ], - "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** `/home/francis/Projects/_nvim/opencode.nvim/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** `/home/francis/Projects/_nvim/opencode.nvim/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** `/home/francis/Projects/_nvim/opencode.nvim/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", - "" - ], - "actions": [ - { - "range": { - "to": 56, - "from": 56 - }, - "text": "[R]evert file", - "key": "R", - "type": "diff_revert_selected_file", - "display_line": 56, - "args": [ - "57d83f5596cb1f142fbc681d3d93b7184f7f73cd" - ] - }, - { - "range": { - "to": 56, - "from": 56 - }, - "text": "Revert [A]ll", - "key": "A", - "type": "diff_revert_all", - "display_line": 56, - "args": [ - "57d83f5596cb1f142fbc681d3d93b7184f7f73cd" - ] - }, - { - "range": { - "to": 56, - "from": 56 - }, - "text": "[D]iff", - "key": "D", - "type": "diff_open", - "display_line": 56, - "args": [ - "57d83f5596cb1f142fbc681d3d93b7184f7f73cd" - ] - }, - { - "range": { - "to": 22, - "from": 22 - }, - "text": "[R]evert file", - "key": "R", - "type": "diff_revert_selected_file", - "display_line": 22, - "args": [ - "1b6ba655c6c0d899965adff278ac6320d5fc3b12" - ] - }, - { - "range": { - "to": 22, - "from": 22 - }, - "text": "Revert [A]ll", - "key": "A", - "type": "diff_revert_all", - "display_line": 22, - "args": [ - "1b6ba655c6c0d899965adff278ac6320d5fc3b12" - ] - }, - { - "range": { - "to": 22, - "from": 22 - }, - "text": "[D]iff", - "key": "D", - "type": "diff_open", - "display_line": 22, - "args": [ - "1b6ba655c6c0d899965adff278ac6320d5fc3b12" - ] - } - ], - "timestamp": 1772803148 -} +{"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** `/home/francis/Projects/_nvim/opencode.nvim/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** `/home/francis/Projects/_nvim/opencode.nvim/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** `/home/francis/Projects/_nvim/opencode.nvim/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",""],"extmarks":[[1,1,0,{"right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" [msg_a0234c0b7001y2o9S1jMaNVZar]","OpencodeHint"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10}],[2,1,0,{"right_gravity":true,"virt_text":[[" 2025-10-20 15:20:02","OpencodeHint"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"right_align","virt_text_repeat_linebreak":false,"priority":9}],[3,2,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096}],[4,3,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096}],[5,4,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096}],[6,5,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096}],[7,8,0,{"right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" [msg_a0234c7960011LTxTvD94hfWCi]","OpencodeHint"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10}],[8,8,0,{"right_gravity":true,"virt_text":[[" 2025-10-20 15:20:04","OpencodeHint"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"right_align","virt_text_repeat_linebreak":false,"priority":9}],[9,12,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096}],[10,13,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096}],[11,14,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096}],[12,15,0,{"right_gravity":true,"end_row":16,"end_col":0,"virt_text_hide":false,"ns_id":3,"hl_eol":true,"end_right_gravity":false,"hl_group":"OpencodeDiffDelete","virt_text":[["1","OpencodeDiffDeleteGutter"],["-","OpencodeDiffDeleteGutter"],[" ","OpencodeDiffDeleteGutter"]],"virt_text_pos":"overlay","virt_text_repeat_linebreak":false,"priority":5000}],[13,15,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096}],[14,16,0,{"right_gravity":true,"end_row":17,"end_col":0,"virt_text_hide":false,"ns_id":3,"hl_eol":true,"end_right_gravity":false,"hl_group":"OpencodeDiffAdd","virt_text":[["1","OpencodeDiffAddGutter"],["+","OpencodeDiffAddGutter"],[" ","OpencodeDiffAddGutter"]],"virt_text_pos":"overlay","virt_text_repeat_linebreak":false,"priority":5000}],[15,16,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096}],[16,17,0,{"right_gravity":true,"end_row":18,"end_col":0,"virt_text_hide":false,"ns_id":3,"end_right_gravity":false,"virt_text":[["2","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_pos":"overlay","virt_text_repeat_linebreak":false,"priority":5000}],[17,17,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096}],[18,18,0,{"right_gravity":true,"end_row":19,"end_col":0,"virt_text_hide":false,"ns_id":3,"end_right_gravity":false,"virt_text":[["3","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_pos":"overlay","virt_text_repeat_linebreak":false,"priority":5000}],[19,18,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096}],[20,19,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096}],[21,20,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096}],[22,25,0,{"right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" [msg_a0234d8fb001SXyngLjuKSuxOY]","OpencodeHint"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10}],[23,25,0,{"right_gravity":true,"virt_text":[[" 2025-10-20 15:20:09","OpencodeHint"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"right_align","virt_text_repeat_linebreak":false,"priority":9}],[24,30,0,{"right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" [msg_a0234e308001SKl5bQUibp5gtI]","OpencodeHint"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10}],[25,30,0,{"right_gravity":true,"virt_text":[[" 2025-10-20 15:20:11","OpencodeHint"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"right_align","virt_text_repeat_linebreak":false,"priority":9}],[26,31,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096}],[27,32,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096}],[28,35,0,{"right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" [msg_a0234e31f001m4EsQdPmY3PTtS]","OpencodeHint"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10}],[29,35,0,{"right_gravity":true,"virt_text":[[" 2025-10-20 15:20:11","OpencodeHint"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"right_align","virt_text_repeat_linebreak":false,"priority":9}],[30,42,0,{"right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" [msg_a0234f482001PQbMjWc6W8s0eF]","OpencodeHint"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10}],[31,42,0,{"right_gravity":true,"virt_text":[[" 2025-10-20 15:20:16","OpencodeHint"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"right_align","virt_text_repeat_linebreak":false,"priority":9}],[32,46,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096}],[33,47,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096}],[34,48,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096}],[35,49,0,{"right_gravity":true,"end_row":50,"end_col":0,"virt_text_hide":false,"ns_id":3,"hl_eol":true,"end_right_gravity":false,"hl_group":"OpencodeDiffDelete","virt_text":[["1","OpencodeDiffDeleteGutter"],["-","OpencodeDiffDeleteGutter"],[" ","OpencodeDiffDeleteGutter"]],"virt_text_pos":"overlay","virt_text_repeat_linebreak":false,"priority":5000}],[36,49,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096}],[37,50,0,{"right_gravity":true,"end_row":51,"end_col":0,"virt_text_hide":false,"ns_id":3,"hl_eol":true,"end_right_gravity":false,"hl_group":"OpencodeDiffAdd","virt_text":[["1","OpencodeDiffAddGutter"],["+","OpencodeDiffAddGutter"],[" ","OpencodeDiffAddGutter"]],"virt_text_pos":"overlay","virt_text_repeat_linebreak":false,"priority":5000}],[38,50,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096}],[39,51,0,{"right_gravity":true,"end_row":52,"end_col":0,"virt_text_hide":false,"ns_id":3,"end_right_gravity":false,"virt_text":[["2","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_pos":"overlay","virt_text_repeat_linebreak":false,"priority":5000}],[40,51,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096}],[41,52,0,{"right_gravity":true,"end_row":53,"end_col":0,"virt_text_hide":false,"ns_id":3,"end_right_gravity":false,"virt_text":[["3","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]],"virt_text_pos":"overlay","virt_text_repeat_linebreak":false,"priority":5000}],[42,52,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096}],[43,53,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096}],[44,54,0,{"right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096}],[45,59,0,{"right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" [msg_a0234f9c6001JCKYaca1HHwwx6]","OpencodeHint"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10}],[46,59,0,{"right_gravity":true,"virt_text":[[" 2025-10-20 15:20:17","OpencodeHint"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"right_align","virt_text_repeat_linebreak":false,"priority":9}],[47,69,0,{"right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text":[["+1","OpencodeDiffAddText"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":12,"priority":1000}],[48,69,0,{"right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text":[["-1","OpencodeDiffDeleteText"]],"virt_text_hide":false,"ns_id":3,"virt_text_pos":"win_col","virt_text_win_col":15,"priority":1000}]],"actions":[{"type":"diff_revert_selected_file","key":"R","text":"[R]evert file","range":{"from":56,"to":56},"args":["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"],"display_line":56},{"type":"diff_revert_all","key":"A","text":"Revert [A]ll","range":{"from":56,"to":56},"args":["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"],"display_line":56},{"type":"diff_open","key":"D","text":"[D]iff","range":{"from":56,"to":56},"args":["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"],"display_line":56},{"type":"diff_revert_selected_file","key":"R","text":"[R]evert file","range":{"from":22,"to":22},"args":["1b6ba655c6c0d899965adff278ac6320d5fc3b12"],"display_line":22},{"type":"diff_revert_all","key":"A","text":"Revert [A]ll","range":{"from":22,"to":22},"args":["1b6ba655c6c0d899965adff278ac6320d5fc3b12"],"display_line":22},{"type":"diff_open","key":"D","text":"[D]iff","range":{"from":22,"to":22},"args":["1b6ba655c6c0d899965adff278ac6320d5fc3b12"],"display_line":22}],"timestamp":1773947601} \ No newline at end of file diff --git a/tests/data/selection.expected.json b/tests/data/selection.expected.json index f33c1ddb..17eaf541 100644 --- a/tests/data/selection.expected.json +++ b/tests/data/selection.expected.json @@ -1,423 +1 @@ -{ - "actions": [], - "extmarks": [ - [ - 1, - 1, - 0, - { - "ns_id": 3, - "priority": 10, - "right_gravity": true, - "virt_text": [ - [ - "▌󰭻 ", - "OpencodeMessageRoleUser" - ], - [ - " " - ], - [ - "USER", - "OpencodeMessageRoleUser" - ], - [ - "", - "OpencodeHint" - ], - [ - " [msg_9f5b29fea001z6jYXF7CG9omHa]", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_win_col": -3 - } - ], - [ - 2, - 1, - 0, - { - "ns_id": 3, - "priority": 9, - "right_gravity": true, - "virt_text": [ - [ - " 2025-10-18 05:02:28", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false - } - ], - [ - 3, - 2, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 4, - 3, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 5, - 4, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 6, - 5, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 7, - 6, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 8, - 7, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 9, - 8, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 10, - 8, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 11, - 9, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 12, - 10, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 13, - 11, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 14, - 12, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 15, - 12, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 16, - 13, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 17, - 16, - 0, - { - "ns_id": 3, - "priority": 10, - "right_gravity": true, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "PLAN", - "OpencodeMessageRoleAssistant" - ], - [ - " claude-sonnet-4.5", - "OpencodeHint" - ], - [ - " [msg_9f5b2a039001xop8ITmXQq0Gjh]", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_win_col": -3 - } - ], - [ - 18, - 16, - 0, - { - "ns_id": 3, - "priority": 9, - "right_gravity": true, - "virt_text": [ - [ - " 2025-10-18 05:02:28", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false - } - ] - ], - "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.", - "", - "" - ], - "timestamp": 1770935242 -} \ No newline at end of file +{"extmarks":[[1,1,0,{"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"priority":10,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" [msg_9f5b29fea001z6jYXF7CG9omHa]","OpencodeHint"]]}],[2,1,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text_pos":"right_align","priority":9,"virt_text":[[" 2025-10-18 05:02:28","OpencodeHint"]]}],[3,2,0,{"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]]}],[4,3,0,{"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]]}],[5,4,0,{"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]]}],[6,5,0,{"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]]}],[7,6,0,{"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]]}],[8,7,0,{"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]]}],[9,8,0,{"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]]}],[10,8,0,{"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]]}],[11,9,0,{"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]]}],[12,10,0,{"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]]}],[13,11,0,{"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]]}],[14,12,0,{"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]]}],[15,12,0,{"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]]}],[16,13,0,{"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]]}],[17,16,0,{"ns_id":3,"virt_text_hide":false,"virt_text_pos":"win_col","right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"priority":10,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" [msg_9f5b2a039001xop8ITmXQq0Gjh]","OpencodeHint"]]}],[18,16,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text_pos":"right_align","priority":9,"virt_text":[[" 2025-10-18 05:02:28","OpencodeHint"]]}]],"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.","",""],"timestamp":1773947587,"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 59fc1e59..c7d60a84 100644 --- a/tests/data/shifting-and-multiple-perms.expected.json +++ b/tests/data/shifting-and-multiple-perms.expected.json @@ -1,1452 +1 @@ -{ - "timestamp": 1772803149, - "extmarks": [ - [ - 1, - 1, - 0, - { - "priority": 10, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌󰭻 ", - "OpencodeMessageRoleUser" - ], - [ - " " - ], - [ - "USER", - "OpencodeMessageRoleUser" - ], - [ - "", - "OpencodeHint" - ], - [ - " [msg_9efb39d68001J2h30a50B2774b]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "virt_text_hide": false - } - ], - [ - 2, - 1, - 0, - { - "virt_text_repeat_linebreak": false, - "priority": 9, - "ns_id": 3, - "virt_text": [ - [ - " 2025-10-17 01:05:49", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align", - "right_gravity": true, - "virt_text_hide": false - } - ], - [ - 3, - 2, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "virt_text_hide": false - } - ], - [ - 4, - 3, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "virt_text_hide": false - } - ], - [ - 5, - 4, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "virt_text_hide": false - } - ], - [ - 6, - 5, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "virt_text_hide": false - } - ], - [ - 7, - 8, - 0, - { - "priority": 10, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "PLAN", - "OpencodeMessageRoleAssistant" - ], - [ - " claude-sonnet-4.5", - "OpencodeHint" - ], - [ - " [msg_9efb39dc3002f81rMRqF2WO1UU]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "virt_text_hide": false - } - ], - [ - 8, - 8, - 0, - { - "virt_text_repeat_linebreak": false, - "priority": 9, - "ns_id": 3, - "virt_text": [ - [ - " 2025-10-17 01:05:50", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align", - "right_gravity": true, - "virt_text_hide": false - } - ], - [ - 9, - 83, - 0, - { - "priority": 10, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌󰭻 ", - "OpencodeMessageRoleUser" - ], - [ - " " - ], - [ - "USER", - "OpencodeMessageRoleUser" - ], - [ - "", - "OpencodeHint" - ], - [ - " [msg_9efb50a0b001WFK7AMDV45cF8Z]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "virt_text_hide": false - } - ], - [ - 10, - 83, - 0, - { - "virt_text_repeat_linebreak": false, - "priority": 9, - "ns_id": 3, - "virt_text": [ - [ - " 2025-10-17 01:07:23", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align", - "right_gravity": true, - "virt_text_hide": false - } - ], - [ - 11, - 84, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "virt_text_hide": false - } - ], - [ - 12, - 85, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "virt_text_hide": false - } - ], - [ - 13, - 88, - 0, - { - "priority": 10, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "PLAN", - "OpencodeMessageRoleAssistant" - ], - [ - " claude-sonnet-4.5", - "OpencodeHint" - ], - [ - " [msg_9efb50a2a002dzMgbQnasd86o1]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "virt_text_hide": false - } - ], - [ - 14, - 88, - 0, - { - "virt_text_repeat_linebreak": false, - "priority": 9, - "ns_id": 3, - "virt_text": [ - [ - " 2025-10-17 01:07:23", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align", - "right_gravity": true, - "virt_text_hide": false - } - ], - [ - 15, - 111, - 0, - { - "priority": 10, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌󰭻 ", - "OpencodeMessageRoleUser" - ], - [ - " " - ], - [ - "USER", - "OpencodeMessageRoleUser" - ], - [ - "", - "OpencodeHint" - ], - [ - " [msg_9efb59d93001LSm9y0DS9p8cP6]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "virt_text_hide": false - } - ], - [ - 16, - 111, - 0, - { - "virt_text_repeat_linebreak": false, - "priority": 9, - "ns_id": 3, - "virt_text": [ - [ - " 2025-10-17 01:08:01", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align", - "right_gravity": true, - "virt_text_hide": false - } - ], - [ - 17, - 112, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "virt_text_hide": false - } - ], - [ - 18, - 113, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "virt_text_hide": false - } - ], - [ - 19, - 116, - 0, - { - "priority": 10, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "PLAN", - "OpencodeMessageRoleAssistant" - ], - [ - " claude-sonnet-4.5", - "OpencodeHint" - ], - [ - " [msg_9efb59db4002uWmyFRTjRIhIaQ]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "virt_text_hide": false - } - ], - [ - 20, - 116, - 0, - { - "virt_text_repeat_linebreak": false, - "priority": 9, - "ns_id": 3, - "virt_text": [ - [ - " 2025-10-17 01:08:01", - "OpencodeHint" - ] - ], - "virt_text_pos": "right_align", - "right_gravity": true, - "virt_text_hide": false - } - ], - [ - 21, - 125, - 0, - { - "priority": 10, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleSystem" - ], - [ - " " - ], - [ - "SYSTEM", - "OpencodeMessageRoleSystem" - ], - [ - "", - "OpencodeHint" - ], - [ - " [permission-display-message]", - "OpencodeHint" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "virt_text_hide": false - } - ], - [ - 22, - 127, - 0, - { - "right_gravity": true, - "ns_id": 3, - "line_hl_group": "OpencodePermissionTitle", - "priority": 4096 - } - ], - [ - 23, - 127, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 24, - 128, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 25, - 129, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 26, - 130, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 27, - 131, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 28, - 132, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 29, - 133, - 0, - { - "ns_id": 3, - "virt_text": [ - [ - "11", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "end_row": 134, - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "end_col": 0, - "priority": 5000, - "virt_text_pos": "overlay" - } - ], - [ - 30, - 133, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 31, - 134, - 0, - { - "ns_id": 3, - "virt_text": [ - [ - "12", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "end_row": 135, - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "end_col": 0, - "priority": 5000, - "virt_text_pos": "overlay" - } - ], - [ - 32, - 134, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 33, - 135, - 0, - { - "ns_id": 3, - "virt_text": [ - [ - "13", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "end_row": 136, - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "end_col": 0, - "priority": 5000, - "virt_text_pos": "overlay" - } - ], - [ - 34, - 135, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 35, - 136, - 0, - { - "ns_id": 3, - "virt_text": [ - [ - "14", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "end_row": 137, - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "end_col": 0, - "priority": 5000, - "virt_text_pos": "overlay" - } - ], - [ - 36, - 136, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 37, - 137, - 0, - { - "ns_id": 3, - "virt_text": [ - [ - "15", - "OpencodeDiffAddGutter" - ], - [ - "+", - "OpencodeDiffAddGutter" - ], - [ - " ", - "OpencodeDiffAddGutter" - ] - ], - "end_row": 138, - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "hl_eol": true, - "right_gravity": true, - "end_col": 0, - "priority": 5000, - "virt_text_pos": "overlay", - "hl_group": "OpencodeDiffAdd" - } - ], - [ - 38, - 137, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 39, - 138, - 0, - { - "ns_id": 3, - "virt_text": [ - [ - "16", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "end_row": 139, - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "end_col": 0, - "priority": 5000, - "virt_text_pos": "overlay" - } - ], - [ - 40, - 138, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 41, - 139, - 0, - { - "ns_id": 3, - "virt_text": [ - [ - "17", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "end_row": 140, - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "end_col": 0, - "priority": 5000, - "virt_text_pos": "overlay" - } - ], - [ - 42, - 139, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 43, - 140, - 0, - { - "ns_id": 3, - "virt_text": [ - [ - "18", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "end_row": 141, - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "end_col": 0, - "priority": 5000, - "virt_text_pos": "overlay" - } - ], - [ - 44, - 140, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 45, - 141, - 0, - { - "ns_id": 3, - "virt_text": [ - [ - "19", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ], - [ - " ", - "OpencodeDiffGutter" - ] - ], - "end_row": 142, - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text_repeat_linebreak": false, - "right_gravity": true, - "end_col": 0, - "priority": 5000, - "virt_text_pos": "overlay" - } - ], - [ - 46, - 141, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 47, - 142, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 48, - 143, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 49, - 144, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 50, - 145, - 0, - { - "right_gravity": true, - "ns_id": 3, - "line_hl_group": "OpencodeDialogOptionHover", - "priority": 4096 - } - ], - [ - 51, - 145, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 52, - 145, - 2, - { - "virt_text_repeat_linebreak": false, - "priority": 4096, - "ns_id": 3, - "virt_text": [ - [ - "› ", - "OpencodeDialogOptionHover" - ] - ], - "virt_text_pos": "overlay", - "right_gravity": true, - "virt_text_hide": false - } - ], - [ - 53, - 146, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 54, - 147, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 55, - 148, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ], - [ - 56, - 149, - 0, - { - "priority": 4096, - "virt_text_repeat_linebreak": true, - "right_gravity": true, - "ns_id": 3, - "virt_text": [ - [ - "▌", - "OpencodePermissionBorder" - ] - ], - "virt_text_pos": "win_col", - "virt_text_win_col": -2, - "virt_text_hide": false - } - ] - ], - "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** `/Users/cam/Dev/neovim-dev/opencode.nvim/lua/opencode/ui/renderer.lua`", - "", - "** edit** `/Users/cam/Dev/neovim-dev/opencode.nvim/lua/opencode/ui/renderer.lua`", - "", - "** edit** `/Users/cam/Dev/neovim-dev/opencode.nvim/lua/opencode/ui/renderer.lua`", - "", - "----", - "", - "", - " Permission Required (1/3)", - "", - " *edit* `Edit this file: /Users/cam/Dev/neovim-dev/opencode.nvim/lua/opencode/ui/renderer.lua`", - "", - "", - "`````", - " M._part_cache = {}", - " M._prev_line_count = 0", - " M._message_map = MessageMap.new()", - " M._actions = {}", - " M._has_trailing_line = false", - " ", - " ---Reset renderer state", - " function M.reset()", - " M._part_cache = {}", - "", - "`````", - "", - " 1. Allow once ", - " 2. Reject", - " 3. Allow always", - "", - "Navigate: `j`/`k` or `↑`/`↓` Select: `` or `1-3`", - "", - "" - ], - "actions": [] -} +{"extmarks":[[1,1,0,{"ns_id":3,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" [msg_9efb39d68001J2h30a50B2774b]","OpencodeHint"]]}],[2,1,0,{"ns_id":3,"priority":9,"virt_text_hide":false,"virt_text_pos":"right_align","right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text":[[" 2025-10-17 01:05:49","OpencodeHint"]]}],[3,2,0,{"ns_id":3,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]]}],[4,3,0,{"ns_id":3,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]]}],[5,4,0,{"ns_id":3,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]]}],[6,5,0,{"ns_id":3,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]]}],[7,8,0,{"ns_id":3,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" [msg_9efb39dc3002f81rMRqF2WO1UU]","OpencodeHint"]]}],[8,8,0,{"ns_id":3,"priority":9,"virt_text_hide":false,"virt_text_pos":"right_align","right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text":[[" 2025-10-17 01:05:50","OpencodeHint"]]}],[9,83,0,{"ns_id":3,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" [msg_9efb50a0b001WFK7AMDV45cF8Z]","OpencodeHint"]]}],[10,83,0,{"ns_id":3,"priority":9,"virt_text_hide":false,"virt_text_pos":"right_align","right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text":[[" 2025-10-17 01:07:23","OpencodeHint"]]}],[11,84,0,{"ns_id":3,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]]}],[12,85,0,{"ns_id":3,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]]}],[13,88,0,{"ns_id":3,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" [msg_9efb50a2a002dzMgbQnasd86o1]","OpencodeHint"]]}],[14,88,0,{"ns_id":3,"priority":9,"virt_text_hide":false,"virt_text_pos":"right_align","right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text":[[" 2025-10-17 01:07:23","OpencodeHint"]]}],[15,111,0,{"ns_id":3,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" [msg_9efb59d93001LSm9y0DS9p8cP6]","OpencodeHint"]]}],[16,111,0,{"ns_id":3,"priority":9,"virt_text_hide":false,"virt_text_pos":"right_align","right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text":[[" 2025-10-17 01:08:01","OpencodeHint"]]}],[17,112,0,{"ns_id":3,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]]}],[18,113,0,{"ns_id":3,"virt_text_win_col":-3,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodeMessageRoleUser"]]}],[19,116,0,{"ns_id":3,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4.5","OpencodeHint"],[" [msg_9efb59db4002uWmyFRTjRIhIaQ]","OpencodeHint"]]}],[20,116,0,{"ns_id":3,"priority":9,"virt_text_hide":false,"virt_text_pos":"right_align","right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text":[[" 2025-10-17 01:08:01","OpencodeHint"]]}],[21,125,0,{"ns_id":3,"virt_text_win_col":-3,"priority":10,"virt_text_hide":false,"virt_text_repeat_linebreak":false,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[[" ","OpencodeMessageRoleSystem"],[" "],["SYSTEM","OpencodeMessageRoleSystem"],["","OpencodeHint"],[" [permission-display-message]","OpencodeHint"]]}],[22,127,0,{"ns_id":3,"right_gravity":true,"line_hl_group":"OpencodePermissionTitle","priority":4096}],[23,127,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[24,128,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[25,129,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[26,130,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[27,131,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[28,132,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[29,133,0,{"virt_text_repeat_linebreak":false,"priority":5000,"end_col":0,"ns_id":3,"virt_text_hide":false,"end_row":134,"virt_text_pos":"overlay","right_gravity":true,"end_right_gravity":false,"virt_text":[["11","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]]}],[30,133,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[31,134,0,{"virt_text_repeat_linebreak":false,"priority":5000,"end_col":0,"ns_id":3,"virt_text_hide":false,"end_row":135,"virt_text_pos":"overlay","right_gravity":true,"end_right_gravity":false,"virt_text":[["12","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]]}],[32,134,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[33,135,0,{"virt_text_repeat_linebreak":false,"priority":5000,"end_col":0,"ns_id":3,"virt_text_hide":false,"end_row":136,"virt_text_pos":"overlay","right_gravity":true,"end_right_gravity":false,"virt_text":[["13","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]]}],[34,135,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[35,136,0,{"virt_text_repeat_linebreak":false,"priority":5000,"end_col":0,"ns_id":3,"virt_text_hide":false,"end_row":137,"virt_text_pos":"overlay","right_gravity":true,"end_right_gravity":false,"virt_text":[["14","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]]}],[36,136,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[37,137,0,{"hl_eol":true,"priority":5000,"end_col":0,"virt_text_hide":false,"ns_id":3,"hl_group":"OpencodeDiffAdd","end_row":138,"virt_text_repeat_linebreak":false,"virt_text_pos":"overlay","right_gravity":true,"end_right_gravity":false,"virt_text":[["15","OpencodeDiffAddGutter"],["+","OpencodeDiffAddGutter"],[" ","OpencodeDiffAddGutter"]]}],[38,137,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[39,138,0,{"virt_text_repeat_linebreak":false,"priority":5000,"end_col":0,"ns_id":3,"virt_text_hide":false,"end_row":139,"virt_text_pos":"overlay","right_gravity":true,"end_right_gravity":false,"virt_text":[["16","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]]}],[40,138,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[41,139,0,{"virt_text_repeat_linebreak":false,"priority":5000,"end_col":0,"ns_id":3,"virt_text_hide":false,"end_row":140,"virt_text_pos":"overlay","right_gravity":true,"end_right_gravity":false,"virt_text":[["17","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]]}],[42,139,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[43,140,0,{"virt_text_repeat_linebreak":false,"priority":5000,"end_col":0,"ns_id":3,"virt_text_hide":false,"end_row":141,"virt_text_pos":"overlay","right_gravity":true,"end_right_gravity":false,"virt_text":[["18","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]]}],[44,140,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[45,141,0,{"virt_text_repeat_linebreak":false,"priority":5000,"end_col":0,"ns_id":3,"virt_text_hide":false,"end_row":142,"virt_text_pos":"overlay","right_gravity":true,"end_right_gravity":false,"virt_text":[["19","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"],[" ","OpencodeDiffGutter"]]}],[46,141,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[47,142,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[48,143,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[49,144,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[50,145,0,{"ns_id":3,"right_gravity":true,"line_hl_group":"OpencodeDialogOptionHover","priority":4096}],[51,145,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[52,145,2,{"ns_id":3,"priority":4096,"virt_text_hide":false,"virt_text_pos":"overlay","right_gravity":true,"virt_text_repeat_linebreak":false,"virt_text":[["› ","OpencodeDialogOptionHover"]]}],[53,146,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[54,147,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[55,148,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}],[56,149,0,{"ns_id":3,"virt_text_win_col":-2,"priority":4096,"virt_text_hide":false,"virt_text_repeat_linebreak":true,"right_gravity":true,"virt_text_pos":"win_col","virt_text":[["▌","OpencodePermissionBorder"]]}]],"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** `/Users/cam/Dev/neovim-dev/opencode.nvim/lua/opencode/ui/renderer.lua`","","** edit** `/Users/cam/Dev/neovim-dev/opencode.nvim/lua/opencode/ui/renderer.lua`","","** edit** `/Users/cam/Dev/neovim-dev/opencode.nvim/lua/opencode/ui/renderer.lua`","","----","",""," Permission Required (1/3)",""," *edit* `Edit this file: /Users/cam/Dev/neovim-dev/opencode.nvim/lua/opencode/ui/renderer.lua`","","","`````"," M._part_cache = {}"," M._prev_line_count = 0"," M._message_map = MessageMap.new()"," M._actions = {}"," M._has_trailing_line = false"," "," ---Reset renderer state"," function M.reset()"," M._part_cache = {}","","`````",""," 1. Allow once "," 2. Reject"," 3. Allow always","","Navigate: `j`/`k` or `↑`/`↓` Select: `` or `1-3`","",""],"timestamp":1773947569,"actions":[]} \ No newline at end of file diff --git a/tests/data/updating-text.expected.json b/tests/data/updating-text.expected.json index c60a7024..c3e8b20d 100644 --- a/tests/data/updating-text.expected.json +++ b/tests/data/updating-text.expected.json @@ -1,258 +1 @@ -{ - "actions": [], - "extmarks": [ - [ - 1, - 1, - 0, - { - "ns_id": 3, - "priority": 10, - "right_gravity": true, - "virt_text": [ - [ - "▌󰭻 ", - "OpencodeMessageRoleUser" - ], - [ - " " - ], - [ - "USER", - "OpencodeMessageRoleUser" - ], - [ - "", - "OpencodeHint" - ], - [ - " [msg_9d0297a630014CA5ly3Vvw8Kt5]", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_win_col": -3 - } - ], - [ - 2, - 1, - 0, - { - "ns_id": 3, - "priority": 9, - "right_gravity": true, - "virt_text": [ - [ - " 2025-10-10 22:06:43", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false - } - ], - [ - 3, - 2, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 4, - 3, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 5, - 4, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 6, - 5, - 0, - { - "ns_id": 3, - "priority": 4096, - "right_gravity": true, - "virt_text": [ - [ - "▌", - "OpencodeMessageRoleUser" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": true, - "virt_text_win_col": -3 - } - ], - [ - 7, - 8, - 0, - { - "ns_id": 3, - "priority": 10, - "right_gravity": true, - "virt_text": [ - [ - " ", - "OpencodeMessageRoleAssistant" - ], - [ - " " - ], - [ - "PLAN", - "OpencodeMessageRoleAssistant" - ], - [ - " claude-sonnet-4", - "OpencodeHint" - ], - [ - " [msg_9d0297ab3001UGZU9fDJM4Y75w]", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "win_col", - "virt_text_repeat_linebreak": false, - "virt_text_win_col": -3 - } - ], - [ - 8, - 8, - 0, - { - "ns_id": 3, - "priority": 9, - "right_gravity": true, - "virt_text": [ - [ - " 2025-10-10 22:06:43", - "OpencodeHint" - ] - ], - "virt_text_hide": false, - "virt_text_pos": "right_align", - "virt_text_repeat_linebreak": false - } - ] - ], - "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": 1770935243 -} \ No newline at end of file +{"extmarks":[[1,1,0,{"priority":10,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" [msg_9d0297a630014CA5ly3Vvw8Kt5]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"right_gravity":true}],[2,1,0,{"ns_id":3,"priority":9,"virt_text_hide":false,"virt_text":[[" 2025-10-10 22:06:43","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"right_align","right_gravity":true}],[3,2,0,{"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"right_gravity":true}],[4,3,0,{"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"right_gravity":true}],[5,4,0,{"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"right_gravity":true}],[6,5,0,{"priority":4096,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"right_gravity":true}],[7,8,0,{"priority":10,"ns_id":3,"virt_text_pos":"win_col","virt_text_hide":false,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["PLAN","OpencodeMessageRoleAssistant"],[" claude-sonnet-4","OpencodeHint"],[" [msg_9d0297ab3001UGZU9fDJM4Y75w]","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"right_gravity":true}],[8,8,0,{"ns_id":3,"priority":9,"virt_text_hide":false,"virt_text":[[" 2025-10-10 22:06:43","OpencodeHint"]],"virt_text_repeat_linebreak":false,"virt_text_pos":"right_align","right_gravity":true}]],"timestamp":1773947559,"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":[]} \ No newline at end of file diff --git a/tests/unit/reference_picker_spec.lua b/tests/unit/reference_picker_spec.lua index 769d483d..5b8df616 100644 --- a/tests/unit/reference_picker_spec.lua +++ b/tests/unit/reference_picker_spec.lua @@ -114,6 +114,7 @@ describe('opencode.ui.reference_picker', function() assert.equal(1, #refs) assert.equal('src/main.lua', refs[1].file_path) assert.is_nil(refs[1].line) + assert.is_nil(refs[1].col) end) it('parses backtick-wrapped file references with line numbers', function() @@ -123,7 +124,7 @@ describe('opencode.ui.reference_picker', function() assert.equal(1, #refs) assert.equal('src/utils.lua', refs[1].file_path) assert.equal(42, refs[1].line) - assert.is_nil(refs[1].column) + assert.is_nil(refs[1].col) end) it('parses backtick-wrapped file references with line and column', function() @@ -133,17 +134,17 @@ describe('opencode.ui.reference_picker', function() assert.equal(1, #refs) assert.equal('src/handler.lua', refs[1].file_path) assert.equal(10, refs[1].line) - assert.equal(5, refs[1].column) + assert.equal(5, refs[1].col) end) - it('parses backtick-wrapped file references with line ranges', function() + it('parses backtick-wrapped file references with line ranges (only start line captured)', function() local text = 'Review lines `src/test.lua:10-20` for context.' local refs = reference_picker.parse_references(text, 'msg1') assert.equal(1, #refs) assert.equal('src/test.lua', refs[1].file_path) assert.equal(10, refs[1].line) - assert.equal(20, refs[1].end_pos[1]) + -- end of range is not represented in the ref struct end) it('parses file:// URI references', function() @@ -172,7 +173,7 @@ describe('opencode.ui.reference_picker', function() assert.equal(25, refs[1].line) end) - it('parses top-level file references', function() + it('parses top-level file references when file exists', function() local text = 'Check README.md for documentation.' local refs = reference_picker.parse_references(text, 'msg1') @@ -183,7 +184,7 @@ describe('opencode.ui.reference_picker', function() it('parses multiple references in one text', function() local text = [[ The main logic is in `src/main.lua:50` and helper - functions are in `lib/utils.lua:10-30`. Also see + functions are in `lib/utils.lua:10`. Also see the configuration in config.txt. ]] local refs = reference_picker.parse_references(text, 'msg1') @@ -193,7 +194,6 @@ describe('opencode.ui.reference_picker', function() assert.equal(50, refs[1].line) assert.equal('lib/utils.lua', refs[2].file_path) assert.equal(10, refs[2].line) - assert.equal(30, refs[2].end_pos[1]) assert.equal('config.txt', refs[3].file_path) end) @@ -218,65 +218,76 @@ describe('opencode.ui.reference_picker', function() assert.equal(0, #refs) end) - it('rejects non-existent files', function() - local text = 'See `nonexistent.xyz:10` for details.' + it('rejects top-level files that do not exist (check_exists pattern)', function() + -- Unquoted top-level filenames require the file to be readable + local text = 'See nonexistent.xyz for details.' local refs = reference_picker.parse_references(text, 'msg1') assert.equal(0, #refs) end) - it('deduplicates overlapping matches', function() - -- When different patterns match the same text at same position, only keep one - -- This happens rarely but the logic protects against it - local text = 'Check file://src/main.lua for details.' - - -- Mock to make the plain pattern also match (though normally file:// would be caught first) + it('includes backtick-wrapped files regardless of existence', function() + -- Backtick pattern has check_exists=false; useful for referencing new files + local text = 'Create `newfile.xyz` with the following content.' local refs = reference_picker.parse_references(text, 'msg1') - -- Should only have 1 reference since they all refer to same location - assert.is_true(#refs >= 1, 'Should have at least one reference') + assert.equal(1, #refs) + assert.equal('newfile.xyz', refs[1].file_path) end) - it('tracks message_id for each reference', function() - local text = 'See `src/test.lua` for details.' - local refs = reference_picker.parse_references(text, 'test_msg_123') + it('deduplicates overlapping matches across patterns', function() + local text = 'Check file://src/main.lua for details.' + local refs = reference_picker.parse_references(text, 'msg1') - assert.equal(1, #refs) - assert.equal('test_msg_123', refs[1].message_id) + -- file:// and plain-slash patterns both see this, but only the first match wins + assert.is_true(#refs >= 1) + assert.equal('src/main.lua', refs[1].file_path) end) - it('creates correct absolute paths from relative paths', function() - local text = 'Check `src/main.lua` for details.' + it('keeps later top-level references with the same basename', function() + local text = 'See `src/main.lua:10` first, then check main.lua:42 too.' local refs = reference_picker.parse_references(text, 'msg1') - assert.equal(1, #refs) - assert.equal('/test/project/src/main.lua', refs[1].file) + assert.equal(2, #refs) + assert.equal('src/main.lua', refs[1].file_path) + assert.equal(10, refs[1].line) + assert.equal('main.lua', refs[2].file_path) + assert.equal(42, refs[2].line) end) - it('preserves absolute paths', function() - local text = 'Check `/absolute/path/file.lua` for details.' - - vim.fn.filereadable = function(path) - if path == '/absolute/path/file.lua' then - return 1 - end - return 0 - end - + it('ref struct contains file_path, line, col, match_start, match_end', function() + local text = 'See `src/test.lua:5:3` for details.' local refs = reference_picker.parse_references(text, 'msg1') assert.equal(1, #refs) - assert.equal('/absolute/path/file.lua', refs[1].file) + local ref = refs[1] + assert.equal('src/test.lua', ref.file_path) + assert.equal(5, ref.line) + assert.equal(3, ref.col) + assert.is_number(ref.match_start) + assert.is_number(ref.match_end) end) - it('creates correct pos array for Snacks picker', function() - local text = 'Error at `src/main.lua:42:10` needs fixing.' - local refs = reference_picker.parse_references(text, 'msg1') + it('returns same cached refs when called again with identical text', function() + local text = 'Check `src/main.lua` for details.' + local refs1 = reference_picker.parse_references(text, 'msg1') + local refs2 = reference_picker.parse_references(text, 'msg1') - assert.equal(1, #refs) - assert.is_not_nil(refs[1].pos) - assert.equal(42, refs[1].pos[1]) - assert.equal(9, refs[1].pos[2]) -- column is 0-indexed + assert.equal(#refs1, #refs2) + assert.equal(refs1[1].file_path, refs2[1].file_path) + end) + + it('extends refs incrementally as text grows', function() + local text1 = 'Check `src/main.lua`.' + local text2 = text1 .. ' Also `lib/util.lua`.' + + -- Capture count before second call: parse_references returns the live c.refs + -- table, so refs1 would mutate if stored and then text2 is parsed + local count1 = #reference_picker.parse_references(text1, 'msg1') + local count2 = #reference_picker.parse_references(text2, 'msg1') + + assert.equal(1, count1) + assert.equal(2, count2) end) it('handles files with hyphens and underscores', function() @@ -298,220 +309,14 @@ describe('opencode.ui.reference_picker', function() end) end) - describe('collect_references', function() - it('returns empty array when no messages', function() - mock_state.messages = nil - local refs = reference_picker.collect_references() - - assert.equal(0, #refs) - end) - - it('returns empty array when messages is empty', function() - mock_state.messages = {} - local refs = reference_picker.collect_references() - - assert.equal(0, #refs) - end) - - it('collects references from assistant messages', function() - mock_state.messages = { - { - info = { role = 'assistant', id = 'msg1' }, - parts = { - { type = 'text', text = 'Check `src/main.lua:10` for details.' }, - }, - }, - } - - local refs = reference_picker.collect_references() - - assert.equal(1, #refs) - assert.equal('src/main.lua', refs[1].file_path) - assert.equal(10, refs[1].line) - end) - - it('ignores user messages', function() - mock_state.messages = { - { - info = { role = 'user', id = 'msg1' }, - parts = { - { type = 'text', text = 'Check `src/main.lua:10` for details.' }, - }, - }, - } - - local refs = reference_picker.collect_references() - - assert.equal(0, #refs) - end) - - it('collects references from multiple messages', function() - mock_state.messages = { - { - info = { role = 'assistant', id = 'msg1' }, - parts = { - { type = 'text', text = 'Check `src/main.lua:10`.' }, - }, - }, - { - info = { role = 'assistant', id = 'msg2' }, - parts = { - { type = 'text', text = 'Also see `lib/utils.lua:20`.' }, - }, - }, - } - - local refs = reference_picker.collect_references() - - assert.equal(2, #refs) - end) - - it('returns references in reverse message order (most recent first)', function() - mock_state.messages = { - { - info = { role = 'assistant', id = 'msg1' }, - parts = { - { type = 'text', text = 'Check `old.lua:1`.' }, - }, - }, - { - info = { role = 'assistant', id = 'msg2' }, - parts = { - { type = 'text', text = 'See `new.lua:2`.' }, - }, - }, - } - - local refs = reference_picker.collect_references() - - assert.equal(2, #refs) - assert.equal('new.lua', refs[1].file_path) - assert.equal('old.lua', refs[2].file_path) - end) - - it('deduplicates references with same file and line', function() - mock_state.messages = { - { - info = { role = 'assistant', id = 'msg1' }, - parts = { - { type = 'text', text = 'Check `src/main.lua:10`.' }, - }, - }, - { - info = { role = 'assistant', id = 'msg2' }, - parts = { - { type = 'text', text = 'Also check `src/main.lua:10`.' }, - }, - }, - } - - local refs = reference_picker.collect_references() - - assert.equal(1, #refs) - end) - - it('keeps most recent reference when deduplicating', function() - mock_state.messages = { - { - info = { role = 'assistant', id = 'msg1' }, - parts = { - { type = 'text', text = 'Check `src/main.lua:10`.' }, - }, - }, - { - info = { role = 'assistant', id = 'msg2' }, - parts = { - { type = 'text', text = 'Also check `src/main.lua:10`.' }, - }, - }, - } - - local refs = reference_picker.collect_references() - - assert.equal(1, #refs) - assert.equal('msg2', refs[1].message_id) - end) - - it('uses cached references when available', function() - local cached_ref = { - file_path = 'cached.lua', - line = 42, - message_id = 'msg1', - file = '/test/project/cached.lua', - } - - mock_state.messages = { - { - info = { role = 'assistant', id = 'msg1' }, - references = { cached_ref }, - }, - } - - local refs = reference_picker.collect_references() - - assert.equal(1, #refs) - assert.equal('cached.lua', refs[1].file_path) - assert.equal(42, refs[1].line) - end) - - it('extracts file paths from tool parts', function() - mock_state.messages = { - { - info = { role = 'assistant', id = 'msg1' }, - parts = { - { - type = 'tool', - state = { - input = { - filePath = '/test/project/src/file.lua', - }, - }, - }, - }, - }, - } - - local refs = reference_picker.collect_references() - - assert.equal(1, #refs) - assert.equal('src/file.lua', refs[1].file_path) - end) - - it('ignores non-existent files in tool parts', function() - mock_state.messages = { - { - info = { role = 'assistant', id = 'msg1' }, - parts = { - { - type = 'tool', - state = { - input = { - filePath = '/test/project/nonexistent.xyz', - }, - }, - }, - }, - }, - } - - local refs = reference_picker.collect_references() - - assert.equal(0, #refs) - end) - end) - describe('navigate_to', function() - it('opens file in new tab', function() + it('opens file in new tab using absolute path', function() local cmd_calls = {} vim.cmd = function(cmd) table.insert(cmd_calls, cmd) end - local ref = { - file_path = 'src/main.lua', - file = '/test/project/src/main.lua', - } - + local ref = { file_path = 'src/main.lua' } reference_picker.navigate_to(ref) assert.equal(1, #cmd_calls) @@ -524,12 +329,7 @@ describe('opencode.ui.reference_picker', function() table.insert(cursor_calls, { win = win, pos = pos }) end - local ref = { - file_path = 'src/main.lua', - file = '/test/project/src/main.lua', - line = 42, - } - + local ref = { file_path = 'src/main.lua', line = 42 } reference_picker.navigate_to(ref) assert.equal(1, #cursor_calls) @@ -537,42 +337,30 @@ describe('opencode.ui.reference_picker', function() assert.equal(0, cursor_calls[1].pos[2]) end) - it('navigates to specific line and column', function() + it('navigates to specific line and column (col is 0-indexed)', function() local cursor_calls = {} vim.api.nvim_win_set_cursor = function(win, pos) table.insert(cursor_calls, { win = win, pos = pos }) end - local ref = { - file_path = 'src/main.lua', - file = '/test/project/src/main.lua', - line = 42, - column = 10, - } - + local ref = { file_path = 'src/main.lua', line = 42, col = 10 } reference_picker.navigate_to(ref) assert.equal(1, #cursor_calls) assert.equal(42, cursor_calls[1].pos[1]) - assert.equal(9, cursor_calls[1].pos[2]) -- 0-indexed + assert.equal(9, cursor_calls[1].pos[2]) -- col - 1 end) - it('clamps line to valid range', function() + it('clamps line to buffer length', function() local cursor_calls = {} vim.api.nvim_win_set_cursor = function(win, pos) table.insert(cursor_calls, { win = win, pos = pos }) end - vim.api.nvim_buf_line_count = function() return 50 end - local ref = { - file_path = 'src/main.lua', - file = '/test/project/src/main.lua', - line = 999, - } - + local ref = { file_path = 'src/main.lua', line = 999 } reference_picker.navigate_to(ref) assert.equal(1, #cursor_calls) @@ -585,54 +373,98 @@ describe('opencode.ui.reference_picker', function() table.insert(cmd_calls, cmd) end - local ref = { - file_path = 'src/my file.lua', - file = '/test/project/src/my file.lua', - } - + local ref = { file_path = 'src/my file.lua' } reference_picker.navigate_to(ref) assert.equal(1, #cmd_calls) assert.equal('tabedit /test/project/src/my\\ file.lua', cmd_calls[1]) end) + + it('shows warning and returns when file does not exist', function() + local notify_calls = {} + local original_notify = vim.notify + vim.notify = function(msg, level) + table.insert(notify_calls, { msg = msg, level = level }) + end + + local ref = { file_path = 'nonexistent.xyz' } + reference_picker.navigate_to(ref) + + assert.equal(1, #notify_calls) + assert.equal(vim.log.levels.WARN, notify_calls[1].level) + vim.notify = original_notify + end) + + it('accepts absolute file paths', function() + local cmd_calls = {} + vim.cmd = function(cmd) + table.insert(cmd_calls, cmd) + end + vim.fn.filereadable = function(path) + if path == '/absolute/path/file.lua' then + return 1 + end + return 0 + end + + local ref = { file_path = '/absolute/path/file.lua' } + reference_picker.navigate_to(ref) + + assert.equal(1, #cmd_calls) + assert.equal('tabedit /absolute/path/file.lua', cmd_calls[1]) + end) end) + -- Helper: populate parse cache then expose items via pick() + local function pick_items(messages_and_texts) + -- messages_and_texts: list of { id, role, text, parts } + local state_msgs = {} + for _, m in ipairs(messages_and_texts) do + if m.text then + reference_picker.parse_references(m.text, m.id) + end + table.insert(state_msgs, { + info = { role = m.role or 'assistant', id = m.id }, + parts = m.parts, + }) + end + mock_state.messages = state_msgs + + local captured + mock_base_picker.pick = function(opts) + captured = opts + return {} + end + reference_picker.pick() + return captured and captured.items or nil + end + describe('pick', function() it('shows notification when no references found', function() local notify_calls = {} local original_notify = vim.notify - vim.notify = function(msg, level) table.insert(notify_calls, { msg = msg, level = level }) end mock_state.messages = {} - reference_picker.pick() assert.equal(1, #notify_calls) assert.equal('No code references found in the conversation', notify_calls[1].msg) assert.equal(vim.log.levels.INFO, notify_calls[1].level) - vim.notify = original_notify end) - it('calls base_picker.pick with correct parameters', function() + it('passes correct options to base_picker.pick', function() local pick_calls = {} mock_base_picker.pick = function(opts) table.insert(pick_calls, opts) return {} end - mock_state.messages = { - { - info = { role = 'assistant', id = 'msg1' }, - parts = { - { type = 'text', text = 'Check `src/main.lua:10`.' }, - }, - }, - } - + reference_picker.parse_references('Check `src/main.lua:10`.', 'msg1') + mock_state.messages = { { info = { role = 'assistant', id = 'msg1' } } } reference_picker.pick() assert.equal(1, #pick_calls) @@ -643,109 +475,192 @@ describe('opencode.ui.reference_picker', function() assert.equal(100, pick_calls[1].width) assert.equal('file', pick_calls[1].preview) end) - end) - describe('setup', function() - it('can be called without errors', function() - -- Simply test that setup doesn't throw errors - assert.has_no.errors(function() - reference_picker.setup() - end) + it('collects references from cached assistant message text', function() + local items = pick_items({ + { id = 'msg1', text = 'Check `src/main.lua:10` for details.' }, + }) + + assert.is_not_nil(items) + assert.equal(1, #items) + assert.equal('src/main.lua', items[1].file_path) + assert.equal(10, items[1].line) end) - it('subscribes to messages state changes', function() - local subscriptions = {} - mock_state.store.subscribe = function(key, handler) - table.insert(subscriptions, { key = key, handler = handler }) + it('ignores user messages when collecting refs', function() + reference_picker.parse_references('Check `src/main.lua:10`.', 'msg1') + mock_state.messages = { { info = { role = 'user', id = 'msg1' } } } + + local notify_calls = {} + local original_notify = vim.notify + vim.notify = function(msg, level) + table.insert(notify_calls, { msg = msg, level = level }) end - reference_picker.setup() + reference_picker.pick() - assert.equal(1, #subscriptions) - assert.equal('messages', subscriptions[1].key) - assert.is_function(subscriptions[1].handler) + assert.equal(1, #notify_calls) -- "No code references found" + vim.notify = original_notify end) - end) - - describe('_parse_message_references', function() - it('returns empty array when no parts', function() - local msg = { - info = { id = 'msg1' }, - } - local refs = reference_picker._parse_message_references(msg) + it('returns refs in reverse message order (most recent first)', function() + local items = pick_items({ + { id = 'msg1', text = 'Check `old.lua:1`.' }, + { id = 'msg2', text = 'See `new.lua:2`.' }, + }) - assert.equal(0, #refs) + assert.is_not_nil(items) + assert.equal(2, #items) + assert.equal('new.lua', items[1].file_path) + assert.equal('old.lua', items[2].file_path) end) - it('parses text parts', function() - local msg = { - info = { id = 'msg1' }, - parts = { - { type = 'text', text = 'Check `src/main.lua:10`.' }, - }, - } + it('deduplicates refs with same file and line across messages', function() + local items = pick_items({ + { id = 'msg1', text = 'Check `src/main.lua:10`.' }, + { id = 'msg2', text = 'Also check `src/main.lua:10`.' }, + }) - local refs = reference_picker._parse_message_references(msg) + assert.is_not_nil(items) + assert.equal(1, #items) + end) - assert.equal(1, #refs) - assert.equal('src/main.lua', refs[1].file_path) + it('keeps most recent ref when deduplicating (reverse order wins)', function() + -- msg2 is processed first (reverse order), so it wins deduplication + local items = pick_items({ + { id = 'msg1', text = 'Check `src/main.lua:10`.' }, + { id = 'msg2', text = 'Also check `src/main.lua:10`.' }, + }) + + assert.is_not_nil(items) + assert.equal(1, #items) + -- The kept ref came from the cache for msg2 + assert.equal('src/main.lua', items[1].file_path) end) - it('parses multiple text parts', function() - local msg = { - info = { id = 'msg1' }, - parts = { - { type = 'text', text = 'Check `file1.lua:10`.' }, - { type = 'text', text = 'Also `file2.lua:20`.' }, + it('collects file paths from tool parts', function() + local items = pick_items({ + { + id = 'msg1', + parts = { + { + type = 'tool', + state = { input = { filePath = '/test/project/src/file.lua' } }, + }, + }, }, - } - - local refs = reference_picker._parse_message_references(msg) + }) - assert.equal(2, #refs) + assert.is_not_nil(items) + assert.equal(1, #items) + assert.equal('src/file.lua', items[1].file_path) end) - it('parses tool parts with file paths', function() - local msg = { - info = { id = 'msg1' }, - parts = { - { - type = 'tool', - state = { - input = { - filePath = '/test/project/tool_file.lua', - }, + it('deduplicates matching text refs and tool-part refs', function() + local items = pick_items({ + { + id = 'msg1', + text = 'Check `src/file.lua` for details.', + parts = { + { + type = 'tool', + state = { input = { filePath = '/test/project/src/file.lua' } }, }, }, }, - } + }) - local refs = reference_picker._parse_message_references(msg) + assert.is_not_nil(items) + assert.equal(1, #items) + assert.equal('src/file.lua', items[1].file_path) + end) - assert.equal(1, #refs) - assert.equal('tool_file.lua', refs[1].file_path) - end) - - it('combines text and tool references', function() - local msg = { - info = { id = 'msg1' }, - parts = { - { type = 'text', text = 'Check `text_ref.lua:10`.' }, - { - type = 'tool', - state = { - input = { - filePath = '/test/project/tool_ref.lua', - }, + it('ignores non-existent files in tool parts', function() + local notify_calls = {} + local original_notify = vim.notify + vim.notify = function(msg, level) + table.insert(notify_calls, { msg = msg, level = level }) + end + + pick_items({ + { + id = 'msg1', + parts = { + { + type = 'tool', + state = { input = { filePath = '/test/project/nonexistent.xyz' } }, }, }, }, - } + }) - local refs = reference_picker._parse_message_references(msg) + assert.equal(1, #notify_calls) -- "No code references found" + vim.notify = original_notify + end) - assert.equal(2, #refs) + it('collects refs from nil messages gracefully', function() + mock_state.messages = nil + + local notify_calls = {} + local original_notify = vim.notify + vim.notify = function(msg, level) + table.insert(notify_calls, { msg = msg, level = level }) + end + + reference_picker.pick() + + assert.equal(1, #notify_calls) + assert.equal('No code references found in the conversation', notify_calls[1].msg) + vim.notify = original_notify + end) + end) + + describe('setup', function() + it('can be called without errors', function() + assert.has_no.errors(function() + reference_picker.setup() + end) + end) + + it('subscribes to messages state changes', function() + local subscriptions = {} + mock_state.store.subscribe = function(key, handler) + table.insert(subscriptions, { key = key, handler = handler }) + end + + reference_picker.setup() + + assert.equal(1, #subscriptions) + assert.equal('messages', subscriptions[1].key) + assert.is_function(subscriptions[1].handler) + end) + + it('clears the parse cache when messages state changes', function() + reference_picker.parse_references('See `src/main.lua`.', 'msg1') + + local handler + mock_state.store.subscribe = function(key, h) + handler = h + end + reference_picker.setup() + + -- Simulate a messages state change + handler() + + -- Cache is now cleared; pick() finds no refs for msg1 + mock_state.messages = { { info = { role = 'assistant', id = 'msg1' } } } + + local notify_calls = {} + local original_notify = vim.notify + vim.notify = function(msg, level) + table.insert(notify_calls, { msg = msg, level = level }) + end + + reference_picker.pick() + + assert.equal(1, #notify_calls) + assert.equal('No code references found in the conversation', notify_calls[1].msg) + vim.notify = original_notify end) end) end)