diff --git a/README.md b/README.md index 0f7c407a..65294e15 100644 --- a/README.md +++ b/README.md @@ -112,8 +112,6 @@ Install the plugin with your favorite package manager. See the [Configuration](# ## ⚙️ Configuration -> **Note**: The keymap configuration structure has been updated. Old keymaps (`keymap.global` and `keymap.window`) will be mapped to the new format (`keymap.editor`, `keymap.input_window`, `keymap.output_window`) but you should update your config to the new format. See [Keymap Configuration](#keymap-configuration) below for details. - ```lua -- Default configuration with all available options require('opencode').setup({ @@ -298,7 +296,7 @@ require('opencode').setup({ }, diagnostics = { info = false, -- Include diagnostics info in the context (default to false - warn = true, -- Include diagnostics warnings in the context + warning = true, -- Include diagnostics warnings in the context error = true, -- Include diagnostics errors in the context only_closest = false, -- If true, only diagnostics for cursor/selection }, @@ -345,7 +343,7 @@ require('opencode').setup({ }, quick_chat = { default_model = nil, -- works better with a fast model like gpt-4.1 - default_agent = 'plan', -- plan ensure no file modifications by default + default_agent = nil, -- Uses the current mode when nil instructions = nil, -- Use built-in instructions if nil }, }) @@ -360,7 +358,7 @@ The keymap configuration has been restructured for better organization and clari - **`output_window`**: Keymaps specific to the output window - **`permission`**: Special keymaps for responding to permission requests (available in input/output windows when there's a pending permission) -**Backward Compatibility**: The plugin automatically maps configurations that use `keymap.global` and `keymap.window` to the new structure. A deprecation warning will be shown during migration. Update your configuration to use the new structure to remove the warning. +Configure keymaps with the current nested tables directly: `keymap.editor`, `keymap.input_window`, and `keymap.output_window`. Each keymap entry is a table consising of: @@ -670,7 +668,7 @@ You can pass additional options when running a prompt via command or API: - `current_file` - `selection` - `diagnostics.info` - - `diagnostics.warn` + - `diagnostics.warning` - `diagnostics.error` - `cursor_data` @@ -680,7 +678,7 @@ Run a prompt in a new session using the Plan agent and disabling current file co ```vim :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 +:Opencode run "Fix the bug in the current file" model=github-copilot/claude-sonnet-4 ``` ## 👮 Permissions @@ -694,8 +692,8 @@ Opencode can issue permission requests for potentially destructive operations (f ### Responding to Permission Requests -- **Respond via keys:** In the input window press `a` to accept once, `A` to accept and remember (accept all), or `d` to deny. These window keys are configurable in `ui.keymap.window.permission_*`. -- **Global keymaps:** There are also global keymaps to respond outside the input window: `opa` (accept once), `opA` (accept all), `opd` (deny). These are configurable in `keymap.global.permission_*`. +- **Respond via the dialog:** Focus the Opencode window, move with `j`/`k` or arrow keys, then confirm with ``. Number shortcuts `1-3` also work for the visible options. +- **Command:** Use `:Opencode permission accept`, `:Opencode permission accept_all`, or `:Opencode permission deny`. You can pass an index to target a specific queued permission. - **API:** Programmatic responses are available: `require('opencode.api').permission_accept()`, `require('opencode.api').permission_accept_all()`, `require('opencode.api').permission_deny()` which map to responses `"once"`, `"always"`, and `"reject"` respectively. - **Behavior:** `accept once` allows the single requested action, `accept all` grants persistent permission for similar requests in the current session, and `deny` rejects the request. @@ -722,7 +720,7 @@ Supported pickers include [`fzf-lua`](https://github.com/ibhagwan/fzf-lua), [`te ### Context bar -You can quiclkly see the current context items in the context bar at the top of the input window: +You can quickly see the current context items in the context bar at the top of the input window:
Opencode.nvim context bar @@ -772,7 +770,7 @@ Press `` (Alt+M) in the input window to switch between agents during a sess You can create custom agents through your opencode config file. Each agent can have its own: -- Agentl configuration +- Agent configuration - Custom prompt - Enabled/disabled tools - And more diff --git a/lua/opencode/ui/formatter.lua b/lua/opencode/ui/formatter.lua index 4928d6fb..56a22351 100644 --- a/lua/opencode/ui/formatter.lua +++ b/lua/opencode/ui/formatter.lua @@ -7,11 +7,11 @@ local config = require('opencode.config') local snapshot = require('opencode.snapshot') local mention = require('opencode.ui.mention') local permission_window = require('opencode.ui.permission_window') +local tool_formatters = require('opencode.ui.formatter.tools') +local format_utils = require('opencode.ui.formatter.utils') local M = {} ----@note child-session parts are requested from the renderer at format time - M.separator = { '----', '', @@ -33,7 +33,7 @@ function M._format_reasoning(output, part) end end - M.format_action(output, 'reasoning', title, '') + format_utils.format_action(output, icons.get('reasoning'), title, '') if config.ui.output.tools.show_reasoning_output and text ~= '' then output:add_empty_line() @@ -51,69 +51,13 @@ function M._format_reasoning(output, part) end end ----Calculate statistics for reverted messages and tool calls ----@param messages {info: MessageInfo, parts: OpencodeMessagePart[]}[] All messages in the session ----@param revert_index number Index of the message where revert occurred ----@param revert_info SessionRevertInfo Revert information ----@return {messages: number, tool_calls: number, files: table} -function M._calculate_revert_stats(messages, revert_index, revert_info) - local stats = { - messages = 0, - tool_calls = 0, - files = {}, -- { [filename] = { additions = n, deletions = m } } - } - - for i = revert_index, #messages do - local msg = messages[i] - if msg.info.role == 'user' then - stats.messages = stats.messages + 1 - end - if msg.parts then - for _, part in ipairs(msg.parts) do - if part.type == 'tool' then - stats.tool_calls = stats.tool_calls + 1 - end - end - end - end - - if revert_info.diff then - local current_file = nil - for line in revert_info.diff:gmatch('[^\r\n]+') do - local file_a = line:match('^%-%-%- ([ab]/.+)') - local file_b = line:match('^%+%+%+ ([ab]/.+)') - if file_b then - current_file = file_b:gsub('^[ab]/', '') - if not stats.files[current_file] then - stats.files[current_file] = { additions = 0, deletions = 0 } - end - elseif file_a then - current_file = file_a:gsub('^[ab]/', '') - if not stats.files[current_file] then - stats.files[current_file] = { additions = 0, deletions = 0 } - end - elseif line:sub(1, 1) == '+' and not line:match('^%+%+%+') then - if current_file then - stats.files[current_file].additions = stats.files[current_file].additions + 1 - end - elseif line:sub(1, 1) == '-' and not line:match('^%-%-%-') then - if current_file then - stats.files[current_file].deletions = stats.files[current_file].deletions + 1 - end - end - end - end - - return stats -end - ---Format the revert callout with statistics ---@param session_data OpencodeMessage[] All messages in the session ---@param start_idx number Index of the message where revert occurred ---@return Output output object representing the lines, extmarks, and actions function M._format_revert_message(session_data, start_idx) local output = Output.new() - local stats = M._calculate_revert_stats(session_data, start_idx, state.active_session.revert) + local stats = format_utils.calculate_revert_stats(session_data, start_idx, state.active_session.revert) local message_text = stats.messages == 1 and 'message' or 'messages' local tool_text = stats.tool_calls == 1 and 'tool call' or 'tool calls' @@ -175,7 +119,7 @@ function M._format_patch(output, part) end local restore_points = snapshot.get_restore_points_by_parent(part.hash) or {} - M.format_action(output, 'snapshot', 'Created Snapshot', vim.trim(part.hash:sub(1, 8))) + format_utils.format_action(output, icons.get('snapshot'), 'Created Snapshot', vim.trim(part.hash:sub(1, 8))) -- Anchor all snapshot-level actions to the snapshot header line add_action(output, '[R]evert file', 'diff_revert_selected_file', { part.hash }, 'R') @@ -467,329 +411,19 @@ function M._format_assistant_message(output, text) output:add_lines(vim.split(result, '\n')) end ----Build the formatted action line string without writing to output ----@param icon_name string Name of the icon to fetch with `icons.get` ----@param tool_type string Tool type (e.g., 'run', 'read', 'edit', etc.) ----@param value string Value associated with the action (e.g., filename, command) ----@param duration_text? string ----@return string -function M._build_action_line(icon_name, tool_type, value, duration_text) - local icon = icons.get(icon_name) - local detail = value and #value > 0 and ('`' .. value .. '`') or '' - local duration_suffix = duration_text and (' ' .. duration_text) or '' - return string.format('**%s %s** %s%s', icon, tool_type, detail, duration_suffix) -end - ----@param output Output Output object to write to ----@param tool_type string Tool type (e.g., 'run', 'read', 'edit', etc.) ----@param value string Value associated with the action (e.g., filename, command) ----@param duration_text? string -function M.format_action(output, icon_name, tool_type, value, duration_text) - if not icon_name or not tool_type then - return - end - output:add_line(M._build_action_line(icon_name, tool_type, value, duration_text)) -end - ----@param output Output Output object to write to ----@param input BashToolInput data for the tool ----@param metadata BashToolMetadata Metadata for the tool use ----@param duration_text? string -function M._format_bash_tool(output, input, metadata, duration_text) - M.format_action(output, 'run', 'run', input and input.description, duration_text) - - if not config.ui.output.tools.show_output then - return - end - - if metadata.output or metadata.command or input.command then - local command = input.command or metadata.command or '' - local command_output = metadata.output and metadata.output ~= '' and ('\n' .. metadata.output) or '' - M._format_code(output, vim.split('> ' .. command .. '\n' .. command_output, '\n'), 'bash') - end -end - ----@param output Output Output object to write to ----@param tool_type string Tool type (e.g., 'read', 'edit', 'write') ----@param input FileToolInput data for the tool ----@param metadata FileToolMetadata Metadata for the tool use ----@param tool_output? string Tool output payload for detecting directory reads ----@param duration_text? string -function M._format_file_tool(output, tool_type, input, metadata, tool_output, duration_text) - local file_name = tool_type == 'read' and M._resolve_display_file_name(input and input.filePath or '', tool_output) - or M._resolve_file_name(input and input.filePath or '') - - local file_type = input and util.get_markdown_filetype(input.filePath) or '' - - M.format_action(output, tool_type, tool_type, file_name, duration_text) - - if not config.ui.output.tools.show_output then - return - end - - if tool_type == 'edit' and metadata.diff then - M.format_diff(output, metadata.diff, file_type) - elseif tool_type == 'write' and input and input.content then - M._format_code(output, vim.split(input.content, '\n'), file_type) - end -end - ----@param output Output Output object to write to ----@param metadata ApplyPatchToolMetadata Metadata for the tool use ----@param duration_text? string -function M._format_apply_patch_tool(output, metadata, duration_text) - for _, file in ipairs(metadata.files or {}) do - M.format_action(output, 'edit', 'apply patch', file.relativePath or file.filePath, duration_text) - if config.ui.output.tools.show_output and file.diff then - local file_type = file and util.get_markdown_filetype(file.filePath) or '' - M.format_diff(output, file.diff, file_type) - end - end -end - ----@param output Output Output object to write to ----@param title string ----@param input TodoToolInput ----@param duration_text? string -function M._format_todo_tool(output, title, input, duration_text) - M.format_action(output, 'plan', 'plan', (title or ''), duration_text) - if not config.ui.output.tools.show_output then - return - end - - local todos = input and input.todos or {} - - for _, item in ipairs(todos) do - local statuses = { in_progress = '-', completed = 'x', pending = ' ' } - output:add_line(string.format('- [%s] %s ', statuses[item.status], item.content)) - end -end - ----@param output Output Output object to write to ----@param input GlobToolInput data for the tool ----@param metadata GlobToolMetadata Metadata for the tool use ----@param duration_text? string -function M._format_glob_tool(output, input, metadata, duration_text) - M.format_action(output, 'search', 'glob', input and input.pattern, duration_text) - if not config.ui.output.tools.show_output then - return - end - local prefix = metadata.truncated and ' more than' or '' - output:add_line(string.format('Found%s `%d` file(s):', prefix, metadata.count or 0)) -end - ----@param output Output Output object to write to ----@param input GrepToolInput data for the tool ----@param metadata GrepToolMetadata Metadata for the tool use ----@param duration_text? string -function M._format_grep_tool(output, input, metadata, duration_text) - local grep_str = M._resolve_grep_string(input) - M.format_action(output, 'search', 'grep', grep_str, duration_text) - if not config.ui.output.tools.show_output then - return - end - local prefix = metadata.truncated and ' more than' or '' - output:add_line( - string.format('Found%s `%d` match' .. (metadata.matches ~= 1 and 'es' or ''), prefix, metadata.matches or 0) - ) -end - ----@param output Output Output object to write to ----@param input WebFetchToolInput data for the tool ----@param duration_text? string -function M._format_webfetch_tool(output, input, duration_text) - M.format_action(output, 'web', 'fetch', input and input.url, duration_text) -end - ----@param output Output Output object to write to ----@param input ListToolInput ----@param metadata ListToolMetadata ----@param tool_output string ----@param duration_text? string -function M._format_list_tool(output, input, metadata, tool_output, duration_text) - M.format_action(output, 'list', 'list', input and input.path or '', duration_text) - if not config.ui.output.tools.show_output then - return - end - local lines = vim.split(vim.trim(tool_output or ''), '\n') - if #lines < 1 or metadata.count == 0 then - output:add_line('No files found.') - return - end - if #lines > 1 then - output:add_line('Files:') - for i = 2, #lines do - local file = vim.trim(lines[i]) - if file ~= '' then - output:add_line(' • ' .. file) - end - end - end - if metadata.truncated then - output:add_line(string.format('Results truncated, showing first %d files', metadata.count or '?')) - end -end - ----@param output Output Output object to write to ----@param input QuestionToolInput Question tool input data ----@param metadata QuestionToolMetadata Question tool metadata ----@param status string Status of the tool execution ----@param duration_text? string -function M._format_question_tool(output, input, metadata, status, duration_text) - M.format_action(output, 'question', 'question', '', duration_text) - output:add_empty_line() - if not config.ui.output.tools.show_output or status ~= 'completed' then - return - end - - local questions = input and input.questions or {} - local answers = metadata and metadata.answers or {} - - for i, question in ipairs(questions) do - local question_lines = vim.split(question.question, '\n') - if #question_lines > 1 then - output:add_line(string.format('**Q%d:** %s', i, question.header)) - for _, line in ipairs(question_lines) do - output:add_line(line) - end - else - output:add_line(string.format('**Q%d:** %s', i, question_lines[1])) - end - local answer = answers[i] and answers[i][1] or 'No answer' - local answer_lines = vim.split(answer, '\n', { plain = true }) - - output:add_line(string.format('**A%d:** %s', i, answer_lines[1])) - for line_idx = 2, #answer_lines do - output:add_line(answer_lines[line_idx]) - end - - if i < #questions then - output:add_line('') - end - end -end - -function M._resolve_file_name(file_path) - if not file_path or file_path == '' then - return '' - end - local cwd = vim.fn.getcwd() - local absolute = vim.fn.fnamemodify(file_path, ':p') - if vim.startswith(absolute, cwd .. '/') then - return absolute:sub(#cwd + 2) - end - return absolute -end - ----@param file_path string ----@param tool_output? string ----@return boolean -function M._is_directory_path(file_path, tool_output) - if not file_path or file_path == '' then - return false - end - - if vim.endswith(file_path, '/') then - return true - end - - return type(tool_output) == 'string' and tool_output:match('directory') ~= nil -end - ----@param file_path string ----@param tool_output? string ----@return string -function M._resolve_display_file_name(file_path, tool_output) - local resolved = M._resolve_file_name(file_path) - - if resolved ~= '' and M._is_directory_path(file_path, tool_output) and not vim.endswith(resolved, '/') then - resolved = resolved .. '/' - end - - return resolved -end - -function M._resolve_grep_string(input) - if not input then - return '' - end - local path_part = input.path or input.include or '' - local pattern_part = input.pattern or '' - return table.concat( - vim.tbl_filter(function(p) - return p ~= nil and p ~= '' - end, { path_part, pattern_part }), - ' ' - ) -end - ---@param output Output Output object to write to ---@param part OpencodeMessagePart ---@param get_child_parts? fun(session_id: string): OpencodeMessagePart[]? -function M._format_tool(output, part, get_child_parts) +function M.format_tool(output, part, get_child_parts) local tool = part.tool if not tool or not part.state then return end local start_line = output:get_line_count() + 1 - local input = part.state.input or {} - local metadata = part.state.metadata or {} - local tool_output = part.state.output or '' - local tool_time = part.state.time or {} - local tool_status = part.state.status - local should_show_duration = tool ~= 'question' and tool_status ~= 'pending' - local duration_text = should_show_duration and util.format_duration_seconds(tool_time.start, tool_time['end']) or nil - - if tool == 'bash' then - M._format_bash_tool(output, input --[[@as BashToolInput]], metadata --[[@as BashToolMetadata]], duration_text) - elseif tool == 'read' or tool == 'edit' or tool == 'write' then - M._format_file_tool( - output, - tool, - input --[[@as FileToolInput]], - metadata --[[@as FileToolMetadata]], - tool_output, - duration_text - ) - elseif tool == 'todowrite' then - M._format_todo_tool(output, part.state.title, input --[[@as TodoToolInput]], duration_text) - elseif tool == 'glob' then - M._format_glob_tool(output, input --[[@as GlobToolInput]], metadata --[[@as GlobToolMetadata]], duration_text) - elseif tool == 'apply_patch' then - M._format_apply_patch_tool(output, metadata --[[@as ApplyPatchToolMetadata]], duration_text) - elseif tool == 'list' then - M._format_list_tool( - output, - input --[[@as ListToolInput]], - metadata --[[@as ListToolMetadata]], - tool_output, - duration_text - ) - elseif tool == 'grep' then - M._format_grep_tool(output, input --[[@as GrepToolInput]], metadata --[[@as GrepToolMetadata]], duration_text) - elseif tool == 'webfetch' then - M._format_webfetch_tool(output, input --[[@as WebFetchToolInput]], duration_text) - elseif tool == 'task' then - M._format_task_tool( - output, - input --[[@as TaskToolInput]], - metadata --[[@as TaskToolMetadata]], - tool_output, - duration_text, - get_child_parts - ) - elseif tool == 'question' then - M._format_question_tool( - output, - input --[[@as QuestionToolInput]], - metadata --[[@as QuestionToolMetadata]], - part.state.status, - duration_text - ) - else - M.format_action(output, 'tool', 'tool', tool, duration_text) - end + + local formatter = tool_formatters[tool] or tool_formatters.tool + formatter.format(output, part, get_child_parts) if part.state.status == 'error' and part.state.error then output:add_line('') @@ -808,236 +442,6 @@ function M._format_tool(output, part, get_child_parts) end end -local tool_summary_handlers = { - bash = function(_, input) - return 'run', 'run', input.description or '' - end, - read = function(part, input) - local tool_output = part.state and part.state.output or nil - return 'read', 'read', M._resolve_display_file_name(input.filePath, tool_output) - end, - edit = function(_, input) - return 'edit', 'edit', M._resolve_file_name(input.filePath) - end, - write = function(_, input) - return 'write', 'write', M._resolve_file_name(input.filePath) - end, - apply_patch = function(_, metadata) - local file = metadata.files and metadata.files[1] - local others_count = metadata.files and #metadata.files - 1 or 0 - local suffix = others_count > 0 and string.format(' (+%d more)', others_count) or '' - - return 'edit', 'apply patch', file and M._resolve_file_name(file.filePath) .. suffix or '' - end, - todowrite = function(part, _) - return 'plan', 'plan', part.state and part.state.title or '' - end, - glob = function(_, input) - return 'search', 'glob', input.pattern or '' - end, - webfetch = function(_, input) - return 'web', 'fetch', input.url or '' - end, - list = function(_, input) - return 'list', 'list', input.path or '' - end, - task = function(_, input) - return 'task', 'task', input.description or '' - end, - grep = function(_, input) - return 'search', 'grep', M._resolve_grep_string(input) - end, - tool = function(_, input) - return 'tool', 'tool', input.description or '' - end, -} - ----Build the action line string for a part (icon + meaningful value, no duration) ----Used to show per-tool icon+label in child session activity lists. ----@param part OpencodeMessagePart ----@param status string icon name to use for the status (e.g., 'running', 'completed', 'error'). If not provided, will use the default icon for the tool. ----@return string -function M._tool_action_line(part, status) - local tool = part.tool - local input = part.state and part.state.input or {} - local handler = tool_summary_handlers[tool] or tool_summary_handlers['tool'] - local icon_name, tool_label, tool_value = handler(part, input) - if status ~= 'completed' then - icon_name = status - end - - return M._build_action_line(icon_name, tool_label or tool or 'tool', tool_value) -end - ----@param output Output Output object to write to ----@param input TaskToolInput data for the tool ----@param metadata TaskToolMetadata Metadata for the tool use ----@param tool_output string ----@param duration_text? string ----@param get_child_parts? fun(session_id: string): OpencodeMessagePart[]? -function M._format_task_tool(output, input, metadata, tool_output, duration_text, get_child_parts) - local start_line = output:get_line_count() + 1 - - -- Show agent type if available - local description = input and input.description or '' - local agent_type = input and input.subagent_type - if agent_type then - description = string.format('%s (@%s)', description, agent_type) - end - - M.format_action(output, 'task', 'task', description, duration_text) - - if config.ui.output.tools.show_output then - -- Show live tool activity from the child session - local child_session_id = metadata and metadata.sessionId - local child_parts = child_session_id and get_child_parts and get_child_parts(child_session_id) - - if child_parts and #child_parts > 0 then - output:add_empty_line() - - for _, item in ipairs(child_parts) do - if item.tool then - local status = item.state and item.state.status or 'pending' - output:add_line(' ' .. M._tool_action_line(item, status)) - end - end - - output:add_empty_line() - end - - -- Show tool output text (usually the final summary from the subagent) - if tool_output and tool_output ~= '' then - -- remove the task_result tag, only get the inner content, since the tool output is already visually separated and the tag doesn't add much value in that case - local clean_output = tool_output:gsub('', ''):gsub('', '') - if clean_output ~= '' then - output:add_empty_line() - output:add_lines(vim.split(clean_output, '\n')) - output:add_empty_line() - end - end - end - - local end_line = output:get_line_count() - output:add_action({ - text = '[S]elect Child Session', - type = 'select_child_session', - args = {}, - key = 'S', - display_line = start_line - 1, - range = { from = start_line, to = end_line }, - }) -end - ----@param output Output Output object to write to ----@param lines string[] ----@param language string -function M._format_code(output, lines, language) - output:add_empty_line() - --- NOTE: use longer code fence because lines could contain ``` - output:add_line('`````' .. (language or '')) - output:add_lines(util.sanitize_lines(lines)) - output:add_line('`````') -end - ----@param lines string[] -local function parse_diff_line_numbers(lines) - local numbered_lines = {} - local old_line - local new_line - local max_line_number = 0 - - for idx, line in ipairs(lines) do - local old_start, new_start = line:match('^@@ %-(%d+),?%d* %+(%d+),?%d* @@') - - if old_start and new_start then - old_line = tonumber(old_start) - new_line = tonumber(new_start) - elseif old_line and new_line then - local first_char = line:sub(1, 1) - - if first_char == ' ' then - numbered_lines[idx] = { old = old_line, new = new_line } - max_line_number = math.max(max_line_number, old_line, new_line) - old_line = old_line + 1 - new_line = new_line + 1 - elseif first_char == '+' and not line:match('^%+%+%+%s') then - numbered_lines[idx] = { old = nil, new = new_line } - max_line_number = math.max(max_line_number, new_line) - new_line = new_line + 1 - elseif first_char == '-' and not line:match('^%-%-%-%s') then - numbered_lines[idx] = { old = old_line, new = nil } - max_line_number = math.max(max_line_number, old_line) - old_line = old_line + 1 - end - end - end - - return numbered_lines, #tostring(max_line_number) -end - -local function build_diff_gutter(line_numbers, width) - local line_number = line_numbers.new or line_numbers.old - return string.format('%-' .. width .. 's', line_number and tostring(line_number) or '') -end - -local function add_diff_line(output, line, line_numbers, width) - local first_char = line:sub(1, 1) - local line_hl = first_char == '+' and 'OpencodeDiffAdd' or first_char == '-' and 'OpencodeDiffDelete' or nil - local gutter_hl = first_char == '+' and 'OpencodeDiffAddGutter' - or first_char == '-' and 'OpencodeDiffDeleteGutter' - or 'OpencodeDiffGutter' - local sign_hl = gutter_hl - local gutter = build_diff_gutter(line_numbers, width) - local gutter_width = #gutter + 2 - - output:add_line(string.rep(' ', gutter_width) .. line:sub(2)) - - local line_idx = output:get_line_count() - local extmark = { - end_col = 0, - end_row = line_idx, - virt_text = { - { gutter, gutter_hl }, - { first_char, sign_hl }, - { ' ', gutter_hl }, - }, - priority = 5000, - right_gravity = true, - end_right_gravity = false, - virt_text_hide = false, - virt_text_pos = 'overlay', - virt_text_repeat_linebreak = false, - } - - if line_hl then - extmark.hl_group = line_hl - extmark.hl_eol = true - end - - output:add_extmark(line_idx - 1, extmark --[[@as OutputExtmark]]) -end - -function M.format_diff(output, code, file_type) - output:add_empty_line() - - --- NOTE: use longer code fence because code could contain ``` - output:add_line('`````' .. file_type) - local full_lines = vim.split(code, '\n') - local numbered_lines, line_number_width = parse_diff_line_numbers(full_lines) - local first_visible_line = #full_lines > 5 and 6 or 1 - local lines = first_visible_line > 1 and vim.list_slice(full_lines, first_visible_line) or full_lines - - for idx, line in ipairs(lines) do - local source_idx = first_visible_line + idx - 1 - if numbered_lines[source_idx] then - add_diff_line(output, line, numbered_lines[source_idx], line_number_width) - else - output:add_line(line) - end - end - output:add_line('`````') -end - ---@param output Output Output object to write to ---@param start_line number ---@param end_line number @@ -1103,7 +507,7 @@ function M.format_part(part, message, is_last_part, get_child_parts) M._format_reasoning(output, part) content_added = true elseif part.type == 'tool' then - M._format_tool(output, part, get_child_parts) + M.format_tool(output, part, get_child_parts) content_added = true elseif part.type == 'patch' and part.hash then M._format_patch(output, part) diff --git a/lua/opencode/ui/formatter/tools/apply_patch.lua b/lua/opencode/ui/formatter/tools/apply_patch.lua new file mode 100644 index 00000000..a46848b7 --- /dev/null +++ b/lua/opencode/ui/formatter/tools/apply_patch.lua @@ -0,0 +1,57 @@ +local util = require('opencode.util') + +local M = {} + +---@param file_path string +---@return string +local function resolve_file_name(file_path) + if not file_path or file_path == '' then + return '' + end + + local cwd = vim.fn.getcwd() + local absolute = vim.fn.fnamemodify(file_path, ':p') + if vim.startswith(absolute, cwd .. '/') then + return absolute:sub(#cwd + 2) + end + return absolute +end + +---@param output Output +---@param part OpencodeMessagePart +function M.format(output, part) + if part.tool ~= 'apply_patch' then + return + end + local formatter_utils = require('opencode.ui.formatter.utils') + local config = require('opencode.config') + local icons = require('opencode.ui.icons') + + local metadata = part.state and part.state.metadata or {} + for _, file in ipairs(metadata.files or {}) do + formatter_utils.format_action( + output, + icons.get('edit'), + 'apply patch', + file.relativePath or file.filePath, + formatter_utils.get_duration_text(part) + ) + if config.ui.output.tools.show_output and file.diff then + local file_type = file and util.get_markdown_filetype(file.filePath) or '' + formatter_utils.format_diff(output, file.diff, file_type) + end + end +end + +---@param _ OpencodeMessagePart +---@param _ table +---@param metadata ApplyPatchToolMetadata +---@return string, string, string +function M.summary(_, _, metadata) + local file = metadata.files and metadata.files[1] + local others_count = metadata.files and #metadata.files - 1 or 0 + local suffix = others_count > 0 and string.format(' (+%d more)', others_count) or '' + return icons.get('edit'), 'apply patch', file and resolve_file_name(file.filePath) .. suffix or '' +end + +return M diff --git a/lua/opencode/ui/formatter/tools/bash.lua b/lua/opencode/ui/formatter/tools/bash.lua new file mode 100644 index 00000000..e5b3416a --- /dev/null +++ b/lua/opencode/ui/formatter/tools/bash.lua @@ -0,0 +1,41 @@ +local icons = require('opencode.ui.icons') +local M = {} + +---@param output Output +---@param part OpencodeMessagePart +function M.format(output, part) + if part.tool ~= 'bash' then + return + end + + local utils = require('opencode.ui.formatter.utils') + local config = require('opencode.config') + + ---@type BashToolInput + local input = part.state and part.state.input or {} + + ---@type BashToolMetadata + local metadata = part.state and part.state.metadata or {} + + local icons = require('opencode.ui.icons') + utils.format_action(output, icons.get('run'), 'run', input.description, utils.get_duration_text(part)) + + if not config.ui.output.tools.show_output then + return + end + + if metadata.output or metadata.command or input.command then + local command = input.command or metadata.command or '' + local command_output = metadata.output and metadata.output ~= '' and ('\n' .. metadata.output) or '' + utils.format_code(output, vim.split('> ' .. command .. '\n' .. command_output, '\n'), 'bash') + end +end + +---@param _ OpencodeMessagePart +---@param input BashToolInput +---@return string, string, string +function M.summary(_, input) + return icons.get('run'), 'run', input.description or '' +end + +return M diff --git a/lua/opencode/ui/formatter/tools/file.lua b/lua/opencode/ui/formatter/tools/file.lua new file mode 100644 index 00000000..1e74d99b --- /dev/null +++ b/lua/opencode/ui/formatter/tools/file.lua @@ -0,0 +1,91 @@ +local util = require('opencode.util') +local icons = require('opencode.ui.icons') + +local M = {} + +---@param file_path string +---@return string +local function resolve_file_name(file_path) + if not file_path or file_path == '' then + return '' + end + + local cwd = vim.fn.getcwd() + local absolute = vim.fn.fnamemodify(file_path, ':p') + if vim.startswith(absolute, cwd .. '/') then + return absolute:sub(#cwd + 2) + end + return absolute +end + +---@param file_path string +---@param tool_output? string +---@return boolean +local function is_directory_path(file_path, tool_output) + if not file_path or file_path == '' then + return false + end + + if vim.endswith(file_path, '/') then + return true + end + + return type(tool_output) == 'string' and tool_output:match('directory') ~= nil +end + +---@param file_path string +---@param tool_output? string +---@return string +local function resolve_display_file_name(file_path, tool_output) + local resolved = resolve_file_name(file_path) + + if resolved ~= '' and is_directory_path(file_path, tool_output) and not vim.endswith(resolved, '/') then + resolved = resolved .. '/' + end + + return resolved +end + +---@param output Output +---@param part OpencodeMessagePart +function M.format(output, part) + local input = part.state and part.state.input or {} + local metadata = part.state and part.state.metadata or {} + local tool_output = part.state and part.state.output or '' + local tool_type = part.tool + + local file_name = tool_type == 'read' and resolve_display_file_name(input.filePath or '', tool_output) + or resolve_file_name(input.filePath or '') + + local file_type = input.filePath and util.get_markdown_filetype(input.filePath) or '' + + local utils = require('opencode.ui.formatter.utils') + local config = require('opencode.config') + + local icons = require('opencode.ui.icons') + utils.format_action(output, icons.get(tool_type), tool_type, file_name, utils.get_duration_text(part)) + + if not config.ui.output.tools.show_output then + return + end + + if tool_type == 'edit' and metadata.diff then + utils.format_diff(output, metadata.diff, file_type) + elseif tool_type == 'write' and input.content then + utils.format_code(output, vim.split(input.content, '\n'), file_type) + end +end + +---@param part OpencodeMessagePart +---@param input FileToolInput +---@return string, string, string +function M.summary(part, input) + local tool = part.tool + if tool == 'read' then + local tool_output = part.state and part.state.output or nil + return icons.get('read'), 'read', resolve_display_file_name(input.filePath, tool_output) + end + return icons.get(tool), tool, resolve_file_name(input.filePath) +end + +return M diff --git a/lua/opencode/ui/formatter/tools/glob.lua b/lua/opencode/ui/formatter/tools/glob.lua new file mode 100644 index 00000000..c6544f2c --- /dev/null +++ b/lua/opencode/ui/formatter/tools/glob.lua @@ -0,0 +1,34 @@ +local icons = require('opencode.ui.icons') +local M = {} + +---@param output Output +---@param part OpencodeMessagePart +function M.format(output, part) + if part.tool ~= 'glob' then + return + end + + local input = part.state and part.state.input or {} + local metadata = part.state and part.state.metadata or {} + + local utils = require('opencode.ui.formatter.utils') + local config = require('opencode.config') + + local icons = require('opencode.ui.icons') + utils.format_action(output, icons.get('search'), 'glob', input.pattern, utils.get_duration_text(part)) + if not config.ui.output.tools.show_output then + return + end + + local prefix = metadata.truncated and ' more than' or '' + output:add_line(string.format('Found%s `%d` file(s):', prefix, metadata.count or 0)) +end + +---@param _ OpencodeMessagePart +---@param input GlobToolInput +---@return string, string, string +function M.summary(_, input) + return icons.get('search'), 'glob', input.pattern or '' +end + +return M diff --git a/lua/opencode/ui/formatter/tools/grep.lua b/lua/opencode/ui/formatter/tools/grep.lua new file mode 100644 index 00000000..2dcc4338 --- /dev/null +++ b/lua/opencode/ui/formatter/tools/grep.lua @@ -0,0 +1,52 @@ +local icons = require('opencode.ui.icons') +local M = {} + +---@param input GrepToolInput|nil +---@return string +local function resolve_grep_string(input) + if not input then + return '' + end + local path_part = input.path or input.include or '' + local pattern_part = input.pattern or '' + return table.concat( + vim.tbl_filter(function(p) + return p ~= nil and p ~= '' + end, { path_part, pattern_part }), + ' ' + ) +end + +---@param output Output +---@param part OpencodeMessagePart +function M.format(output, part) + if part.tool ~= 'grep' then + return + end + + local metadata = part.state and part.state.metadata or {} + local input = part.state and part.state.input or nil + + local utils = require('opencode.ui.formatter.utils') + local config = require('opencode.config') + + local icons = require('opencode.ui.icons') + utils.format_action(output, icons.get('search'), 'grep', resolve_grep_string(input), utils.get_duration_text(part)) + if not config.ui.output.tools.show_output then + return + end + + local prefix = metadata.truncated and ' more than' or '' + output:add_line( + string.format('Found%s `%d` match' .. (metadata.matches ~= 1 and 'es' or ''), prefix, metadata.matches or 0) + ) +end + +---@param _ OpencodeMessagePart +---@param input GrepToolInput +---@return string, string, string +function M.summary(_, input) + return icons.get('search'), 'grep', resolve_grep_string(input) +end + +return M diff --git a/lua/opencode/ui/formatter/tools/init.lua b/lua/opencode/ui/formatter/tools/init.lua new file mode 100644 index 00000000..91d786ff --- /dev/null +++ b/lua/opencode/ui/formatter/tools/init.lua @@ -0,0 +1,15 @@ +return { + bash = require('opencode.ui.formatter.tools.bash'), + read = require('opencode.ui.formatter.tools.file'), + edit = require('opencode.ui.formatter.tools.file'), + write = require('opencode.ui.formatter.tools.file'), + apply_patch = require('opencode.ui.formatter.tools.apply_patch'), + todowrite = require('opencode.ui.formatter.tools.todowrite'), + glob = require('opencode.ui.formatter.tools.glob'), + grep = require('opencode.ui.formatter.tools.grep'), + webfetch = require('opencode.ui.formatter.tools.webfetch'), + list = require('opencode.ui.formatter.tools.list'), + question = require('opencode.ui.formatter.tools.question'), + task = require('opencode.ui.formatter.tools.task'), + tool = require('opencode.ui.formatter.tools.tool'), +} diff --git a/lua/opencode/ui/formatter/tools/list.lua b/lua/opencode/ui/formatter/tools/list.lua new file mode 100644 index 00000000..d49e1e3d --- /dev/null +++ b/lua/opencode/ui/formatter/tools/list.lua @@ -0,0 +1,48 @@ +local M = {} + +---@param output Output +---@param part OpencodeMessagePart +function M.format(output, part) + if part.tool ~= 'list' then + return + end + local input = part.state and part.state.input or {} + local metadata = part.state and part.state.metadata or {} + local tool_output = part.state and part.state.output or '' + + local utils = require('opencode.ui.formatter.utils') + local config = require('opencode.config') + + local icons = require('opencode.ui.icons') + utils.format_action(output, icons.get('list'), 'list', input.path or '', utils.get_duration_text(part)) + if not config.ui.output.tools.show_output then + return + end + + local lines = vim.split(vim.trim(tool_output), '\n') + if #lines < 1 or metadata.count == 0 then + output:add_line('No files found.') + return + end + if #lines > 1 then + output:add_line('Files:') + for i = 2, #lines do + local file = vim.trim(lines[i]) + if file ~= '' then + output:add_line(' • ' .. file) + end + end + end + if metadata.truncated then + output:add_line(string.format('Results truncated, showing first %d files', metadata.count or '?')) + end +end + +---@param _ OpencodeMessagePart +---@param input ListToolInput +---@return string, string, string +function M.summary(_, input) + return icons.get('list'), 'list', input.path or '' +end + +return M diff --git a/lua/opencode/ui/formatter/tools/question.lua b/lua/opencode/ui/formatter/tools/question.lua new file mode 100644 index 00000000..174819cf --- /dev/null +++ b/lua/opencode/ui/formatter/tools/question.lua @@ -0,0 +1,51 @@ +local M = {} + +---@param output Output +---@param part OpencodeMessagePart +function M.format(output, part) + if part.tool ~= 'question' then + return + end + + local input = part.state and part.state.input or {} + local metadata = part.state and part.state.metadata or {} + + local utils = require('opencode.ui.formatter.utils') + local config = require('opencode.config') + + -- question tool never shows duration + local icons = require('opencode.ui.icons') + utils.format_action(output, icons.get('question'), 'question', '', nil) + output:add_empty_line() + if not config.ui.output.tools.show_output or (part.state and part.state.status) ~= 'completed' then + return + end + + local questions = input.questions or {} + local answers = metadata.answers or {} + + for i, question in ipairs(questions) do + local question_lines = vim.split(question.question, '\n') + if #question_lines > 1 then + output:add_line(string.format('**Q%d:** %s', i, question.header)) + for _, line in ipairs(question_lines) do + output:add_line(line) + end + else + output:add_line(string.format('**Q%d:** %s', i, question_lines[1])) + end + + local answer = answers[i] and answers[i][1] or 'No answer' + local answer_lines = vim.split(answer, '\n', { plain = true }) + output:add_line(string.format('**A%d:** %s', i, answer_lines[1])) + for line_idx = 2, #answer_lines do + output:add_line(answer_lines[line_idx]) + end + + if i < #questions then + output:add_line('') + end + end +end + +return M diff --git a/lua/opencode/ui/formatter/tools/task.lua b/lua/opencode/ui/formatter/tools/task.lua new file mode 100644 index 00000000..808f74a0 --- /dev/null +++ b/lua/opencode/ui/formatter/tools/task.lua @@ -0,0 +1,94 @@ +local M = {} +local icons = require('opencode.ui.icons') + +---@param part OpencodeMessagePart +---@param status string +---@param utils table +---@return string +function M.tool_action_line(part, status, utils) + local tool_formatters = require('opencode.ui.formatter.tools') + local tool = part.tool + local input = part.state and part.state.input or {} + local metadata = part.state and part.state.metadata or {} + local formatter = tool_formatters[tool] or tool_formatters.tool + local summary = formatter.summary or tool_formatters.tool.summary + local icon, tool_label, tool_value = summary(part, input, metadata) + + if status ~= 'completed' then + icon = icons.get(status) + end + + return utils.build_action_line(icon, tool_label or tool or 'tool', tool_value) +end + +---@param output Output +---@param part OpencodeMessagePart +---@param get_child_parts? fun(session_id: string): OpencodeMessagePart[]? +function M.format(output, part, get_child_parts) + if part.tool ~= 'task' then + return + end + + local input = part.state and part.state.input or {} + local metadata = part.state and part.state.metadata or {} + local tool_output = part.state and part.state.output or '' + + local start_line = output:get_line_count() + 1 + + local description = input.description or '' + local agent_type = input.subagent_type + if agent_type then + description = string.format('%s (@%s)', description, agent_type) + end + + local utils = require('opencode.ui.formatter.utils') + local config = require('opencode.config') + + utils.format_action(output, icons.get('task'), 'task', description, utils.get_duration_text(part)) + + if config.ui.output.tools.show_output then + local child_session_id = metadata.sessionId + local child_parts = child_session_id and get_child_parts and get_child_parts(child_session_id) + + if child_parts and #child_parts > 0 then + output:add_empty_line() + + for _, item in ipairs(child_parts) do + if item.tool then + local status = item.state and item.state.status or 'pending' + output:add_line(' ' .. M.tool_action_line(item, status, utils)) + end + end + + output:add_empty_line() + end + + if tool_output ~= '' then + local clean_output = tool_output:gsub('', ''):gsub('', '') + if clean_output ~= '' then + output:add_empty_line() + output:add_lines(vim.split(clean_output, '\n')) + output:add_empty_line() + end + end + end + + local end_line = output:get_line_count() + output:add_action({ + text = '[S]elect Child Session', + type = 'select_child_session', + args = {}, + key = 'S', + display_line = start_line - 1, + range = { from = start_line, to = end_line }, + }) +end + +---@param _ OpencodeMessagePart +---@param input TaskToolInput +---@return string, string, string +function M.summary(_, input) + return icons.get('task'), 'task', input.description or '' +end + +return M diff --git a/lua/opencode/ui/formatter/tools/todowrite.lua b/lua/opencode/ui/formatter/tools/todowrite.lua new file mode 100644 index 00000000..a7de05ae --- /dev/null +++ b/lua/opencode/ui/formatter/tools/todowrite.lua @@ -0,0 +1,38 @@ +local icons = require('opencode.ui.icons') +local M = {} + +---@param output Output +---@param part OpencodeMessagePart +function M.format(output, part) + if part.tool ~= 'todowrite' then + return + end + local utils = require('opencode.ui.formatter.utils') + local config = require('opencode.config') + + local icons = require('opencode.ui.icons') + utils.format_action( + output, + icons.get('plan'), + 'plan', + (part.state and part.state.title or ''), + utils.get_duration_text(part) + ) + if not config.ui.output.tools.show_output then + return + end + + local statuses = { in_progress = '-', completed = 'x', pending = ' ' } + local todos = part.state and part.state.input and part.state.input.todos or {} + for _, item in ipairs(todos) do + output:add_line(string.format('- [%s] %s ', statuses[item.status], item.content)) + end +end + +---@param part OpencodeMessagePart +---@return string, string, string +function M.summary(part) + return icons.get('plan'), 'plan', part.state and part.state.title or '' +end + +return M diff --git a/lua/opencode/ui/formatter/tools/tool.lua b/lua/opencode/ui/formatter/tools/tool.lua new file mode 100644 index 00000000..42fd230d --- /dev/null +++ b/lua/opencode/ui/formatter/tools/tool.lua @@ -0,0 +1,19 @@ +local utils = require('opencode.ui.formatter.utils') +local icons = require('opencode.ui.icons') +local M = {} + +---@param output Output +---@param part OpencodeMessagePart +function M.format(output, part) + local icons = require('opencode.ui.icons') + utils.format_action(output, icons.get('tool'), 'tool', part.tool, utils.get_duration_text(part)) +end + +---@param _ OpencodeMessagePart +---@param input table +---@return string, string, string +function M.summary(_, input) + return icons.get('tool'), 'tool', input.description or '' +end + +return M diff --git a/lua/opencode/ui/formatter/tools/webfetch.lua b/lua/opencode/ui/formatter/tools/webfetch.lua new file mode 100644 index 00000000..b42cecce --- /dev/null +++ b/lua/opencode/ui/formatter/tools/webfetch.lua @@ -0,0 +1,28 @@ +local M = {} +local utils = require('opencode.ui.formatter.utils') + +---@param output Output +---@param part OpencodeMessagePart +function M.format(output, part) + if part.tool ~= 'webfetch' then + return + end + + local icons = require('opencode.ui.icons') + utils.format_action( + output, + icons.get('web'), + 'fetch', + part.state and part.state.input and part.state.input.url, + utils.get_duration_text(part) + ) +end + +---@param _ OpencodeMessagePart +---@param input WebFetchToolInput +---@return string, string, string +function M.summary(_, input) + return icons.get('web'), 'fetch', input.url or '' +end + +return M diff --git a/lua/opencode/ui/formatter/utils.lua b/lua/opencode/ui/formatter/utils.lua new file mode 100644 index 00000000..740c9602 --- /dev/null +++ b/lua/opencode/ui/formatter/utils.lua @@ -0,0 +1,208 @@ +local util = require('opencode.util') + +local M = {} + +---Compute duration text for a tool part, returning nil when not applicable. +---@param part OpencodeMessagePart +---@return string|nil +function M.get_duration_text(part) + local status = part.state and part.state.status + if status == 'pending' then + return nil + end + local time = part.state and part.state.time or {} + return util.format_duration_seconds(time.start, time['end']) +end + +---@param icon string Icon text (result of `icons.get(key)`) or empty string +---@param tool_type string Tool type (e.g., 'run', 'read', 'edit', etc.) +---@param value string Value associated with the action (e.g., filename, command) +---@param duration_text? string +---@return string +function M.build_action_line(icon, tool_type, value, duration_text) + local detail = value and #value > 0 and ('`' .. value .. '`') or '' + local duration_suffix = duration_text and (' ' .. duration_text) or '' + return string.format('**%s %s** %s%s', icon, tool_type, detail, duration_suffix) +end + +---@param output Output Output object to write to +---@param icon string Icon text (result of `icons.get(key)`) or empty string +---@param tool_type string Tool type (e.g., 'run', 'read', 'edit', etc.) +---@param value string Value associated with the action (e.g., filename, command) +---@param duration_text? string +function M.format_action(output, icon, tool_type, value, duration_text) + if not icon or not tool_type then + return + end + output:add_line(M.build_action_line(icon, tool_type, value, duration_text)) +end + +---@param output Output Output object to write to +---@param lines string[] +---@param language string +function M.format_code(output, lines, language) + output:add_empty_line() + --- NOTE: use longer code fence because lines could contain ``` + output:add_line('`````' .. (language or '')) + output:add_lines(util.sanitize_lines(lines)) + output:add_line('`````') +end + +---@param lines string[] +local function parse_diff_line_numbers(lines) + local numbered_lines = {} + local old_line + local new_line + local max_line_number = 0 + + for idx, line in ipairs(lines) do + local old_start, new_start = line:match('^@@ %-(%d+),?%d* %+(%d+),?%d* @@') + + if old_start and new_start then + old_line = tonumber(old_start) + new_line = tonumber(new_start) + elseif old_line and new_line then + local first_char = line:sub(1, 1) + + if first_char == ' ' then + numbered_lines[idx] = { old = old_line, new = new_line } + max_line_number = math.max(max_line_number, old_line, new_line) + old_line = old_line + 1 + new_line = new_line + 1 + elseif first_char == '+' and not line:match('^%+%+%+%s') then + numbered_lines[idx] = { old = nil, new = new_line } + max_line_number = math.max(max_line_number, new_line) + new_line = new_line + 1 + elseif first_char == '-' and not line:match('^%-%-%-%s') then + numbered_lines[idx] = { old = old_line, new = nil } + max_line_number = math.max(max_line_number, old_line) + old_line = old_line + 1 + end + end + end + + return numbered_lines, #tostring(max_line_number) +end + +local function build_diff_gutter(line_numbers, width) + local line_number = line_numbers.new or line_numbers.old + return string.format('%-' .. width .. 's', line_number and tostring(line_number) or '') +end + +local function add_diff_line(output, line, line_numbers, width) + local first_char = line:sub(1, 1) + local line_hl = first_char == '+' and 'OpencodeDiffAdd' or first_char == '-' and 'OpencodeDiffDelete' or nil + local gutter_hl = first_char == '+' and 'OpencodeDiffAddGutter' + or first_char == '-' and 'OpencodeDiffDeleteGutter' + or 'OpencodeDiffGutter' + local sign_hl = gutter_hl + local gutter = build_diff_gutter(line_numbers, width) + local gutter_width = #gutter + 2 + + output:add_line(string.rep(' ', gutter_width) .. line:sub(2)) + + local line_idx = output:get_line_count() + local extmark = { + end_col = 0, + end_row = line_idx, + virt_text = { + { gutter, gutter_hl }, + { first_char, sign_hl }, + { ' ', gutter_hl }, + }, + priority = 5000, + right_gravity = true, + end_right_gravity = false, + virt_text_hide = false, + virt_text_pos = 'overlay', + virt_text_repeat_linebreak = false, + } + + if line_hl then + extmark.hl_group = line_hl + extmark.hl_eol = true + end + + output:add_extmark(line_idx - 1, extmark --[[@as OutputExtmark]]) +end + +---@param output Output +---@param code string +---@param file_type string +function M.format_diff(output, code, file_type) + output:add_empty_line() + + --- NOTE: use longer code fence because code could contain ``` + output:add_line('`````' .. file_type) + local full_lines = vim.split(code, '\n') + local numbered_lines, line_number_width = parse_diff_line_numbers(full_lines) + local first_visible_line = #full_lines > 5 and 6 or 1 + local lines = first_visible_line > 1 and vim.list_slice(full_lines, first_visible_line) or full_lines + + for idx, line in ipairs(lines) do + local source_idx = first_visible_line + idx - 1 + if numbered_lines[source_idx] then + add_diff_line(output, line, numbered_lines[source_idx], line_number_width) + else + output:add_line(line) + end + end + output:add_line('`````') +end +---Calculate statistics for reverted messages and tool calls +---@param messages {info: MessageInfo, parts: OpencodeMessagePart[]}[] All messages in the session +---@param revert_index number Index of the message where revert occurred +---@param revert_info SessionRevertInfo|nil Revert information +---@return {messages: number, tool_calls: number, files: table} +function M.calculate_revert_stats(messages, revert_index, revert_info) + local stats = { + messages = 0, + tool_calls = 0, + files = {}, -- { [filename] = { additions = n, deletions = m } } + } + + for i = revert_index, #messages do + local msg = messages[i] + if msg and msg.info and msg.info.role == 'user' then + stats.messages = stats.messages + 1 + end + if msg and msg.parts then + for _, part in ipairs(msg.parts) do + if part.type == 'tool' then + stats.tool_calls = stats.tool_calls + 1 + end + end + end + end + + if revert_info and revert_info.diff then + local current_file = nil + for line in revert_info.diff:gmatch('[^\r\n]+') do + local file_a = line:match('^%-%-%- ([ab]/.+)') + local file_b = line:match('^%+%+%+ ([ab]/.+)') + if file_b then + current_file = file_b:gsub('^[ab]/', '') + if not stats.files[current_file] then + stats.files[current_file] = { additions = 0, deletions = 0 } + end + elseif file_a then + current_file = file_a:gsub('^[ab]/', '') + if not stats.files[current_file] then + stats.files[current_file] = { additions = 0, deletions = 0 } + end + elseif line:sub(1, 1) == '+' and not line:match('^%+%+%+') then + if current_file then + stats.files[current_file].additions = stats.files[current_file].additions + 1 + end + elseif line:sub(1, 1) == '-' and not line:match('^%-%-%-') then + if current_file then + stats.files[current_file].deletions = stats.files[current_file].deletions + 1 + end + end + end + end + + return stats +end + +return M diff --git a/lua/opencode/ui/permission_window.lua b/lua/opencode/ui/permission_window.lua index df1412b2..ff421139 100644 --- a/lua/opencode/ui/permission_window.lua +++ b/lua/opencode/ui/permission_window.lua @@ -114,7 +114,7 @@ function M.format_display(output) end local icons = require('opencode.ui.icons') - local formatter = require('opencode.ui.formatter') + local formatter_utils = require('opencode.ui.formatter.utils') local progress = '' if #M._permission_queue > 1 then @@ -166,7 +166,7 @@ function M.format_display(output) out:add_line('') local file_type = permission.metadata.filepath and vim.fn.fnamemodify(permission.metadata.filepath, ':e') or '' - formatter.format_diff(out, permission.metadata.diff, file_type) + formatter_utils.format_diff(out, permission.metadata.diff, file_type) end end diff --git a/tests/data/apply-patch.expected.json b/tests/data/apply-patch.expected.json index fa398e96..341b5283 100644 --- a/tests/data/apply-patch.expected.json +++ b/tests/data/apply-patch.expected.json @@ -1,216 +1,297 @@ { - "actions": [], - "extmarks": [ - [ - 1, - 1, - 0, - { - "ns_id": 3, - "virt_text_hide": false, - "priority": 10, - "right_gravity": true, - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "virt_text_repeat_linebreak": false, - "virt_text": [ - ["▌󰭻 ", "OpencodeMessageRoleUser"], - [" "], - ["USER", "OpencodeMessageRoleUser"], - ["", "OpencodeHint"], - [" [msg_user001]", "OpencodeHint"] - ] - } - ], - [ - 2, - 4, - 0, - { - "ns_id": 3, - "virt_text_hide": false, - "priority": 10, - "right_gravity": true, - "virt_text_pos": "win_col", - "virt_text_win_col": -3, - "virt_text_repeat_linebreak": false, - "virt_text": [ - [" ", "OpencodeMessageRoleAssistant"], - [" "], - ["BUILD", "OpencodeMessageRoleAssistant"], - ["", "OpencodeHint"], - [" [msg_asst001]", "OpencodeHint"] - ] - } - ], - [ - 3, - 6, - 0, - { - "ns_id": 3, - "virt_text_hide": false, - "priority": 4096, - "right_gravity": true, - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]] - } - ], - [ - 4, - 7, - 0, - { - "ns_id": 3, - "virt_text_hide": false, - "priority": 4096, - "right_gravity": true, - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]] - } - ], - [ - 5, - 8, - 0, - { - "ns_id": 3, - "virt_text_hide": false, - "priority": 4096, - "right_gravity": true, - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]] - } - ], - [ - 6, - 9, - 0, - { - "end_col": 0, - "hl_group": "OpencodeDiffAdd", - "right_gravity": true, - "virt_text_pos": "overlay", - "priority": 5000, - "ns_id": 3, - "end_row": 10, - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text": [ - ["1", "OpencodeDiffAddGutter"], - ["+", "OpencodeDiffAddGutter"], - [" ", "OpencodeDiffAddGutter"] + "actions": [], + "extmarks": [ + [ + 1, + 1, + 0, + { + "ns_id": 3, + "virt_text_hide": false, + "priority": 10, + "right_gravity": true, + "virt_text_pos": "win_col", + "virt_text_win_col": -3, + "virt_text_repeat_linebreak": false, + "virt_text": [ + [ + "▌󰭻 ", + "OpencodeMessageRoleUser" + ], + [ + " " + ], + [ + "USER", + "OpencodeMessageRoleUser" + ], + [ + "", + "OpencodeHint" + ], + [ + " [msg_user001]", + "OpencodeHint" + ] + ] + } + ], + [ + 2, + 4, + 0, + { + "ns_id": 3, + "virt_text_hide": false, + "priority": 10, + "right_gravity": true, + "virt_text_pos": "win_col", + "virt_text_win_col": -3, + "virt_text_repeat_linebreak": false, + "virt_text": [ + [ + " ", + "OpencodeMessageRoleAssistant" + ], + [ + " " + ], + [ + "BUILD", + "OpencodeMessageRoleAssistant" + ], + [ + "", + "OpencodeHint" + ], + [ + " [msg_asst001]", + "OpencodeHint" + ] + ] + } + ], + [ + 3, + 6, + 0, + { + "ns_id": 3, + "virt_text_hide": false, + "priority": 4096, + "right_gravity": true, + "virt_text_pos": "win_col", + "virt_text_win_col": -1, + "virt_text_repeat_linebreak": true, + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ] + } + ], + [ + 4, + 7, + 0, + { + "ns_id": 3, + "virt_text_hide": false, + "priority": 4096, + "right_gravity": true, + "virt_text_pos": "win_col", + "virt_text_win_col": -1, + "virt_text_repeat_linebreak": true, + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ] + } + ], + [ + 5, + 8, + 0, + { + "ns_id": 3, + "virt_text_hide": false, + "priority": 4096, + "right_gravity": true, + "virt_text_pos": "win_col", + "virt_text_win_col": -1, + "virt_text_repeat_linebreak": true, + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ] + } + ], + [ + 6, + 9, + 0, + { + "end_col": 0, + "hl_group": "OpencodeDiffAdd", + "right_gravity": true, + "virt_text_pos": "overlay", + "priority": 5000, + "ns_id": 3, + "end_row": 10, + "end_right_gravity": false, + "virt_text_hide": false, + "virt_text": [ + [ + "1", + "OpencodeDiffAddGutter" + ], + [ + "+", + "OpencodeDiffAddGutter" + ], + [ + " ", + "OpencodeDiffAddGutter" + ] + ], + "virt_text_repeat_linebreak": false, + "hl_eol": true + } + ], + [ + 7, + 9, + 0, + { + "ns_id": 3, + "virt_text_hide": false, + "priority": 4096, + "right_gravity": true, + "virt_text_pos": "win_col", + "virt_text_win_col": -1, + "virt_text_repeat_linebreak": true, + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ] + } + ], + [ + 8, + 10, + 0, + { + "end_col": 0, + "hl_group": "OpencodeDiffAdd", + "right_gravity": true, + "virt_text_pos": "overlay", + "priority": 5000, + "ns_id": 3, + "end_row": 11, + "end_right_gravity": false, + "virt_text_hide": false, + "virt_text": [ + [ + "2", + "OpencodeDiffAddGutter" + ], + [ + "+", + "OpencodeDiffAddGutter" + ], + [ + " ", + "OpencodeDiffAddGutter" + ] + ], + "virt_text_repeat_linebreak": false, + "hl_eol": true + } + ], + [ + 9, + 10, + 0, + { + "ns_id": 3, + "virt_text_hide": false, + "priority": 4096, + "right_gravity": true, + "virt_text_pos": "win_col", + "virt_text_win_col": -1, + "virt_text_repeat_linebreak": true, + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ] + } + ], + [ + 10, + 11, + 0, + { + "ns_id": 3, + "virt_text_hide": false, + "priority": 4096, + "right_gravity": true, + "virt_text_pos": "win_col", + "virt_text_win_col": -1, + "virt_text_repeat_linebreak": true, + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ] + } + ], + [ + 11, + 12, + 0, + { + "ns_id": 3, + "virt_text_hide": false, + "priority": 4096, + "right_gravity": true, + "virt_text_pos": "win_col", + "virt_text_win_col": -1, + "virt_text_repeat_linebreak": true, + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ] + } + ] ], - "virt_text_repeat_linebreak": false, - "hl_eol": true - } - ], - [ - 7, - 9, - 0, - { - "ns_id": 3, - "virt_text_hide": false, - "priority": 4096, - "right_gravity": true, - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]] - } - ], - [ - 8, - 10, - 0, - { - "end_col": 0, - "hl_group": "OpencodeDiffAdd", - "right_gravity": true, - "virt_text_pos": "overlay", - "priority": 5000, - "ns_id": 3, - "end_row": 11, - "end_right_gravity": false, - "virt_text_hide": false, - "virt_text": [ - ["2", "OpencodeDiffAddGutter"], - ["+", "OpencodeDiffAddGutter"], - [" ", "OpencodeDiffAddGutter"] + "lines": [ + "----", + "", + "", + "----", + "", + "", + "** apply patch** `src/app/features/auth/__tests__/LoginForm.test.tsx` 4s", + "", + "`````tsx", + " import React from 'react'", + " // minimal diff for testing", + "", + "`````", + "", + "" ], - "virt_text_repeat_linebreak": false, - "hl_eol": true - } - ], - [ - 9, - 10, - 0, - { - "ns_id": 3, - "virt_text_hide": false, - "priority": 4096, - "right_gravity": true, - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]] - } - ], - [ - 10, - 11, - 0, - { - "ns_id": 3, - "virt_text_hide": false, - "priority": 4096, - "right_gravity": true, - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]] - } - ], - [ - 11, - 12, - 0, - { - "ns_id": 3, - "virt_text_hide": false, - "priority": 4096, - "right_gravity": true, - "virt_text_pos": "win_col", - "virt_text_win_col": -1, - "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]] - } - ] - ], - "lines": [ - "----", - "", - "", - "----", - "", - "", - "** apply patch** `src/app/features/auth/__tests__/LoginForm.test.tsx` 4s", - "", - "`````tsx", - " import React from 'react'", - " // minimal diff for testing", - "", - "`````", - "", - "" - ], - "timestamp": 1772803135 + "timestamp": 1772803135 } diff --git a/tests/data/diagnostics.expected.json b/tests/data/diagnostics.expected.json index d7061c3a..a4abc10a 100644 --- a/tests/data/diagnostics.expected.json +++ b/tests/data/diagnostics.expected.json @@ -598,11 +598,25 @@ "virt_text_win_col": -3, "virt_text_repeat_linebreak": false, "virt_text": [ - ["▌󰭻 ", "OpencodeMessageRoleUser"], - [" "], - ["USER", "OpencodeMessageRoleUser"], - ["", "OpencodeHint"], - [" [msg_a49ed91d6001coTsjFq9x6FF5W]", "OpencodeHint"] + [ + "▌󰭻 ", + "OpencodeMessageRoleUser" + ], + [ + " " + ], + [ + "USER", + "OpencodeMessageRoleUser" + ], + [ + "", + "OpencodeHint" + ], + [ + " [msg_a49ed91d6001coTsjFq9x6FF5W]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col", "right_gravity": true, @@ -617,7 +631,12 @@ 0, { "right_gravity": true, - "virt_text": [[" 2025-11-03 13:34:57", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-11-03 13:34:57", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align", "virt_text_repeat_linebreak": false, "priority": 9, @@ -632,7 +651,12 @@ { "virt_text_win_col": -3, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -647,7 +671,12 @@ { "virt_text_win_col": -3, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -662,7 +691,12 @@ { "virt_text_win_col": -3, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -677,7 +711,12 @@ { "virt_text_win_col": -3, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -692,7 +731,12 @@ { "virt_text_win_col": -3, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -707,7 +751,12 @@ { "virt_text_win_col": -3, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -722,7 +771,12 @@ { "virt_text_win_col": -3, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -738,11 +792,25 @@ "virt_text_win_col": -3, "virt_text_repeat_linebreak": false, "virt_text": [ - [" ", "OpencodeMessageRoleAssistant"], - [" "], - ["BUILD", "OpencodeMessageRoleAssistant"], - [" gpt-4.1", "OpencodeHint"], - [" [msg_a49ed9828001mN6CDcWPnGnpHS]", "OpencodeHint"] + [ + " ", + "OpencodeMessageRoleAssistant" + ], + [ + " " + ], + [ + "BUILD", + "OpencodeMessageRoleAssistant" + ], + [ + " gpt-4.1", + "OpencodeHint" + ], + [ + " [msg_a49ed9828001mN6CDcWPnGnpHS]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col", "right_gravity": true, @@ -757,7 +825,12 @@ 0, { "right_gravity": true, - "virt_text": [[" 2025-11-03 13:34:59", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-11-03 13:34:59", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align", "virt_text_repeat_linebreak": false, "priority": 9, @@ -772,7 +845,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -787,7 +865,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -802,7 +885,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -818,9 +906,18 @@ "end_row": 43, "end_right_gravity": false, "virt_text": [ - ["126", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "126", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -838,7 +935,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -854,9 +956,18 @@ "end_row": 44, "end_right_gravity": false, "virt_text": [ - ["127", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "127", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -874,7 +985,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -890,9 +1006,18 @@ "end_row": 45, "end_right_gravity": false, "virt_text": [ - ["128", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "128", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -910,7 +1035,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -926,9 +1056,18 @@ "end_row": 46, "end_right_gravity": false, "virt_text": [ - ["129", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "129", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -946,7 +1085,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -962,9 +1106,18 @@ "end_row": 47, "end_right_gravity": false, "virt_text": [ - ["130", "OpencodeDiffAddGutter"], - ["+", "OpencodeDiffAddGutter"], - [" ", "OpencodeDiffAddGutter"] + [ + "130", + "OpencodeDiffAddGutter" + ], + [ + "+", + "OpencodeDiffAddGutter" + ], + [ + " ", + "OpencodeDiffAddGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -984,7 +1137,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1000,9 +1158,18 @@ "end_row": 48, "end_right_gravity": false, "virt_text": [ - ["131", "OpencodeDiffAddGutter"], - ["+", "OpencodeDiffAddGutter"], - [" ", "OpencodeDiffAddGutter"] + [ + "131", + "OpencodeDiffAddGutter" + ], + [ + "+", + "OpencodeDiffAddGutter" + ], + [ + " ", + "OpencodeDiffAddGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -1022,7 +1189,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1038,9 +1210,18 @@ "end_row": 49, "end_right_gravity": false, "virt_text": [ - ["132", "OpencodeDiffAddGutter"], - ["+", "OpencodeDiffAddGutter"], - [" ", "OpencodeDiffAddGutter"] + [ + "132", + "OpencodeDiffAddGutter" + ], + [ + "+", + "OpencodeDiffAddGutter" + ], + [ + " ", + "OpencodeDiffAddGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -1060,7 +1241,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1076,9 +1262,18 @@ "end_row": 50, "end_right_gravity": false, "virt_text": [ - ["133", "OpencodeDiffAddGutter"], - ["+", "OpencodeDiffAddGutter"], - [" ", "OpencodeDiffAddGutter"] + [ + "133", + "OpencodeDiffAddGutter" + ], + [ + "+", + "OpencodeDiffAddGutter" + ], + [ + " ", + "OpencodeDiffAddGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -1098,7 +1293,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1114,9 +1314,18 @@ "end_row": 51, "end_right_gravity": false, "virt_text": [ - ["134", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "134", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -1134,7 +1343,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1150,9 +1364,18 @@ "end_row": 52, "end_right_gravity": false, "virt_text": [ - ["135", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "135", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -1170,7 +1393,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1186,9 +1414,18 @@ "end_row": 53, "end_right_gravity": false, "virt_text": [ - ["136", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "136", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -1206,7 +1443,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1222,9 +1464,18 @@ "end_row": 54, "end_right_gravity": false, "virt_text": [ - ["137", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "137", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -1242,7 +1493,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1257,7 +1513,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1272,7 +1533,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1288,11 +1554,25 @@ "virt_text_win_col": -3, "virt_text_repeat_linebreak": false, "virt_text": [ - [" ", "OpencodeMessageRoleAssistant"], - [" "], - ["BUILD", "OpencodeMessageRoleAssistant"], - [" gpt-4.1", "OpencodeHint"], - [" [msg_a49edb694001syExFxMUW1ik3n]", "OpencodeHint"] + [ + " ", + "OpencodeMessageRoleAssistant" + ], + [ + " " + ], + [ + "BUILD", + "OpencodeMessageRoleAssistant" + ], + [ + " gpt-4.1", + "OpencodeHint" + ], + [ + " [msg_a49edb694001syExFxMUW1ik3n]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col", "right_gravity": true, @@ -1307,7 +1587,12 @@ 0, { "right_gravity": true, - "virt_text": [[" 2025-11-03 13:35:06", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-11-03 13:35:06", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align", "virt_text_repeat_linebreak": false, "priority": 9, @@ -1322,7 +1607,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1337,7 +1627,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1352,7 +1647,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1368,9 +1668,18 @@ "end_row": 82, "end_right_gravity": false, "virt_text": [ - ["114", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "114", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -1388,7 +1697,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1404,9 +1718,18 @@ "end_row": 83, "end_right_gravity": false, "virt_text": [ - ["115", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "115", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -1424,7 +1747,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1440,9 +1768,18 @@ "end_row": 84, "end_right_gravity": false, "virt_text": [ - ["116", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "116", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -1460,7 +1797,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1476,9 +1818,18 @@ "end_row": 85, "end_right_gravity": false, "virt_text": [ - ["117", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "117", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -1496,7 +1847,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1512,9 +1868,18 @@ "end_row": 86, "end_right_gravity": false, "virt_text": [ - ["118", "OpencodeDiffDeleteGutter"], - ["-", "OpencodeDiffDeleteGutter"], - [" ", "OpencodeDiffDeleteGutter"] + [ + "118", + "OpencodeDiffDeleteGutter" + ], + [ + "-", + "OpencodeDiffDeleteGutter" + ], + [ + " ", + "OpencodeDiffDeleteGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -1534,7 +1899,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1550,9 +1920,18 @@ "end_row": 87, "end_right_gravity": false, "virt_text": [ - ["118", "OpencodeDiffAddGutter"], - ["+", "OpencodeDiffAddGutter"], - [" ", "OpencodeDiffAddGutter"] + [ + "118", + "OpencodeDiffAddGutter" + ], + [ + "+", + "OpencodeDiffAddGutter" + ], + [ + " ", + "OpencodeDiffAddGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -1572,7 +1951,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1588,9 +1972,18 @@ "end_row": 88, "end_right_gravity": false, "virt_text": [ - ["119", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "119", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -1608,7 +2001,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1624,9 +2022,18 @@ "end_row": 89, "end_right_gravity": false, "virt_text": [ - ["120", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "120", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -1644,7 +2051,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1660,9 +2072,18 @@ "end_row": 90, "end_right_gravity": false, "virt_text": [ - ["121", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "121", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -1680,7 +2101,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1696,9 +2122,18 @@ "end_row": 91, "end_right_gravity": false, "virt_text": [ - ["122", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "122", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "virt_text_repeat_linebreak": false, @@ -1716,7 +2151,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1731,7 +2171,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1746,7 +2191,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1762,11 +2212,25 @@ "virt_text_win_col": -3, "virt_text_repeat_linebreak": false, "virt_text": [ - [" ", "OpencodeMessageRoleAssistant"], - [" "], - ["BUILD", "OpencodeMessageRoleAssistant"], - [" gpt-4.1", "OpencodeHint"], - [" [msg_a49edc4640017DZPFVUPHCm7Ji]", "OpencodeHint"] + [ + " ", + "OpencodeMessageRoleAssistant" + ], + [ + " " + ], + [ + "BUILD", + "OpencodeMessageRoleAssistant" + ], + [ + " gpt-4.1", + "OpencodeHint" + ], + [ + " [msg_a49edc4640017DZPFVUPHCm7Ji]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col", "right_gravity": true, @@ -1781,7 +2245,12 @@ 0, { "right_gravity": true, - "virt_text": [[" 2025-11-03 13:35:10", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-11-03 13:35:10", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align", "virt_text_repeat_linebreak": false, "priority": 9, @@ -1796,7 +2265,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1811,7 +2285,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1826,7 +2305,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1841,7 +2325,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1856,7 +2345,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1871,7 +2365,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1886,7 +2385,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1901,7 +2405,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1916,7 +2425,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1931,7 +2445,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1946,7 +2465,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1961,7 +2485,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1976,7 +2505,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -1991,7 +2525,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2006,7 +2545,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2021,7 +2565,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2036,7 +2585,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2051,7 +2605,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2066,7 +2625,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2081,7 +2645,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2096,7 +2665,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2111,7 +2685,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2126,7 +2705,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2141,7 +2725,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2156,7 +2745,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2171,7 +2765,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2186,7 +2785,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2201,7 +2805,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2216,7 +2825,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2231,7 +2845,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2246,7 +2865,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2261,7 +2885,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2276,7 +2905,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2291,7 +2925,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2306,7 +2945,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2321,7 +2965,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2336,7 +2985,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2351,7 +3005,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2366,7 +3025,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2381,7 +3045,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2396,7 +3065,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2411,7 +3085,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2426,7 +3105,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2441,7 +3125,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2456,7 +3145,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2471,7 +3165,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2486,7 +3185,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2501,7 +3205,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2516,7 +3225,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2531,7 +3245,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2546,7 +3265,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2561,7 +3285,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2576,7 +3305,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2591,7 +3325,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2606,7 +3345,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2621,7 +3365,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2636,7 +3385,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2651,7 +3405,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2666,7 +3425,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2681,7 +3445,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2696,7 +3465,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2711,7 +3485,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2726,7 +3505,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2741,7 +3525,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2756,7 +3545,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2771,7 +3565,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2786,7 +3585,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2801,7 +3605,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2816,7 +3625,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2831,7 +3645,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2846,7 +3665,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2861,7 +3685,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2876,7 +3705,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2891,7 +3725,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2906,7 +3745,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2921,7 +3765,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2936,7 +3785,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2951,7 +3805,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2966,7 +3825,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2981,7 +3845,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -2996,7 +3865,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3011,7 +3885,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3026,7 +3905,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3041,7 +3925,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3056,7 +3945,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3071,7 +3965,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3086,7 +3985,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3101,7 +4005,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3116,7 +4025,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3131,7 +4045,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3146,7 +4065,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3161,7 +4085,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3176,7 +4105,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3191,7 +4125,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3206,7 +4145,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3221,7 +4165,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3236,7 +4185,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3251,7 +4205,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3266,7 +4225,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3281,7 +4245,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3296,7 +4265,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3311,7 +4285,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3326,7 +4305,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3341,7 +4325,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3356,7 +4345,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3371,7 +4365,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3386,7 +4385,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3401,7 +4405,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3416,7 +4425,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3431,7 +4445,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3446,7 +4465,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3461,7 +4485,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3476,7 +4505,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3491,7 +4525,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3506,7 +4545,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3521,7 +4565,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3536,7 +4585,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3551,7 +4605,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3566,7 +4625,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3581,7 +4645,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3596,7 +4665,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3611,7 +4685,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3626,7 +4705,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3641,7 +4725,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3656,7 +4745,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3671,7 +4765,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3686,7 +4785,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3701,7 +4805,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3716,7 +4825,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3731,7 +4845,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3746,7 +4865,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3761,7 +4885,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3776,7 +4905,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3791,7 +4925,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3806,7 +4945,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3821,7 +4965,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3836,7 +4985,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3851,7 +5005,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3866,7 +5025,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3881,7 +5045,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3896,7 +5065,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3911,7 +5085,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3926,7 +5105,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3941,7 +5125,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3956,7 +5145,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3971,7 +5165,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -3986,7 +5185,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4001,7 +5205,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4016,7 +5225,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4031,7 +5245,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4046,7 +5265,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4061,7 +5285,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4076,7 +5305,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4091,7 +5325,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4106,7 +5345,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4121,7 +5365,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4136,7 +5385,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4151,7 +5405,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4166,7 +5425,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4181,7 +5445,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4196,7 +5465,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4211,7 +5485,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4226,7 +5505,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4241,7 +5525,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4256,7 +5545,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4271,7 +5565,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4286,7 +5585,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4301,7 +5605,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4316,7 +5625,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4331,7 +5645,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4346,7 +5665,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4361,7 +5685,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4376,7 +5705,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4391,7 +5725,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4406,7 +5745,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4421,7 +5765,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4436,7 +5785,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4451,7 +5805,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4466,7 +5825,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4481,7 +5845,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4496,7 +5865,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4511,7 +5885,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4526,7 +5905,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4541,7 +5925,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4556,7 +5945,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4571,7 +5965,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4586,7 +5985,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4601,7 +6005,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4616,7 +6025,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4631,7 +6045,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4646,7 +6065,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4661,7 +6085,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4676,7 +6105,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4691,7 +6125,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4706,7 +6145,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4721,7 +6165,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4736,7 +6185,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4751,7 +6205,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4766,7 +6225,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4781,7 +6245,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4796,7 +6265,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4811,7 +6285,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4826,7 +6305,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4841,7 +6325,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4856,7 +6345,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4871,7 +6365,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4886,7 +6385,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4901,7 +6405,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4916,7 +6425,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4931,7 +6445,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4946,7 +6465,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4961,7 +6485,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4976,7 +6505,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -4991,7 +6525,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5006,7 +6545,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5021,7 +6565,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5036,7 +6585,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5051,7 +6605,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5066,7 +6625,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5081,7 +6645,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5096,7 +6665,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5111,7 +6685,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5126,7 +6705,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5141,7 +6725,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5156,7 +6745,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5171,7 +6765,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5186,7 +6785,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5201,7 +6805,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5216,7 +6825,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5231,7 +6845,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5246,7 +6865,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5261,7 +6885,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5276,7 +6905,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5291,7 +6925,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5306,7 +6945,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5321,7 +6965,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5336,7 +6985,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5351,7 +7005,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5366,7 +7025,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5381,7 +7045,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5396,7 +7065,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5411,7 +7085,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5426,7 +7105,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5441,7 +7125,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5456,7 +7145,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5471,7 +7165,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5486,7 +7185,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5501,7 +7205,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5516,7 +7225,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5531,7 +7245,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5546,7 +7265,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5561,7 +7285,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5576,7 +7305,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5591,7 +7325,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5606,7 +7345,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5621,7 +7365,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5636,7 +7385,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5651,7 +7405,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5666,7 +7425,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5681,7 +7445,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5696,7 +7465,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5711,7 +7485,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5726,7 +7505,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5741,7 +7525,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5756,7 +7545,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5771,7 +7565,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5786,7 +7585,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5801,7 +7605,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5816,7 +7625,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5831,7 +7645,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5846,7 +7665,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5861,7 +7685,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5876,7 +7705,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5891,7 +7725,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5906,7 +7745,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5921,7 +7765,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5936,7 +7785,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5951,7 +7805,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5966,7 +7825,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5981,7 +7845,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -5996,7 +7865,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6011,7 +7885,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6026,7 +7905,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6041,7 +7925,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6056,7 +7945,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6071,7 +7965,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6086,7 +7985,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6101,7 +8005,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6116,7 +8025,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6131,7 +8045,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6146,7 +8065,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6161,7 +8085,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6176,7 +8105,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6191,7 +8125,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6206,7 +8145,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6221,7 +8165,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6236,7 +8185,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6251,7 +8205,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6266,7 +8225,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6281,7 +8245,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6296,7 +8265,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6311,7 +8285,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6326,7 +8305,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6341,7 +8325,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6356,7 +8345,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6371,7 +8365,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6386,7 +8385,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6401,7 +8405,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6416,7 +8425,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6431,7 +8445,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6446,7 +8465,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6461,7 +8485,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6476,7 +8505,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6491,7 +8525,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6506,7 +8545,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6521,7 +8565,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6536,7 +8585,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6551,7 +8605,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6566,7 +8625,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6581,7 +8645,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6596,7 +8665,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6611,7 +8685,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6626,7 +8705,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6641,7 +8725,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6656,7 +8745,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6671,7 +8765,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6686,7 +8785,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6701,7 +8805,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6716,7 +8825,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6731,7 +8845,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6746,7 +8865,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6761,7 +8885,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6776,7 +8905,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6791,7 +8925,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6806,7 +8945,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6821,7 +8965,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6836,7 +8985,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6851,7 +9005,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6866,7 +9025,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6881,7 +9045,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6896,7 +9065,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6911,7 +9085,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6926,7 +9105,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6941,7 +9125,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6956,7 +9145,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6971,7 +9165,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -6986,7 +9185,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7001,7 +9205,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7016,7 +9225,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7031,7 +9245,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7046,7 +9265,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7061,7 +9285,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7076,7 +9305,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7091,7 +9325,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7106,7 +9345,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7121,7 +9365,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7136,7 +9385,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7151,7 +9405,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7166,7 +9425,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7181,7 +9445,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7196,7 +9465,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7211,7 +9485,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7226,7 +9505,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7241,7 +9525,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7256,7 +9545,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7271,7 +9565,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7286,7 +9585,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7301,7 +9605,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7316,7 +9625,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7331,7 +9645,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7346,7 +9665,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7361,7 +9685,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7376,7 +9705,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7391,7 +9725,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7406,7 +9745,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7421,7 +9765,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7436,7 +9785,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7451,7 +9805,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7466,7 +9825,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7481,7 +9845,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7496,7 +9865,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7511,7 +9885,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7526,7 +9905,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7541,7 +9925,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7556,7 +9945,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7571,7 +9965,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7586,7 +9985,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7601,7 +10005,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7616,7 +10025,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7631,7 +10045,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7646,7 +10065,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7661,7 +10085,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7676,7 +10105,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7691,7 +10125,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7706,7 +10145,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7721,7 +10165,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7736,7 +10185,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7751,7 +10205,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7766,7 +10225,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7781,7 +10245,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7796,7 +10265,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7811,7 +10285,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7826,7 +10305,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7841,7 +10325,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7856,7 +10345,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7871,7 +10365,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7886,7 +10385,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7901,7 +10405,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7916,7 +10425,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7931,7 +10445,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7946,7 +10465,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7961,7 +10485,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7976,7 +10505,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -7991,7 +10525,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8006,7 +10545,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8021,7 +10565,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8036,7 +10585,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8051,7 +10605,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8066,7 +10625,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8081,7 +10645,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8096,7 +10665,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8111,7 +10685,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8126,7 +10705,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8141,7 +10725,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8156,7 +10745,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8171,7 +10765,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8186,7 +10785,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8201,7 +10805,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8216,7 +10825,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8231,7 +10845,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8246,7 +10865,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8261,7 +10885,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8276,7 +10905,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8291,7 +10925,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8306,7 +10945,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8321,7 +10965,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8336,7 +10985,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8351,7 +11005,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8366,7 +11025,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8381,7 +11045,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8396,7 +11065,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8411,7 +11085,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8426,7 +11105,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8441,7 +11125,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8456,7 +11145,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8471,7 +11165,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8486,7 +11185,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8501,7 +11205,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8516,7 +11225,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8531,7 +11245,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8546,7 +11265,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8561,7 +11285,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8576,7 +11305,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8591,7 +11325,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8606,7 +11345,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8621,7 +11365,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8636,7 +11385,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8651,7 +11405,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8666,7 +11425,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8681,7 +11445,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8696,7 +11465,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8711,7 +11485,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8726,7 +11505,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8741,7 +11525,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8756,7 +11545,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8771,7 +11565,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8786,7 +11585,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8801,7 +11605,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8816,7 +11625,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8831,7 +11645,12 @@ { "virt_text_win_col": -1, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true, "priority": 4096, @@ -8847,11 +11666,25 @@ "virt_text_win_col": -3, "virt_text_repeat_linebreak": false, "virt_text": [ - [" ", "OpencodeMessageRoleAssistant"], - [" "], - ["BUILD", "OpencodeMessageRoleAssistant"], - [" gpt-4.1", "OpencodeHint"], - [" [msg_a49edd87f001eOJDDoq5Vb5hra]", "OpencodeHint"] + [ + " ", + "OpencodeMessageRoleAssistant" + ], + [ + " " + ], + [ + "BUILD", + "OpencodeMessageRoleAssistant" + ], + [ + " gpt-4.1", + "OpencodeHint" + ], + [ + " [msg_a49edd87f001eOJDDoq5Vb5hra]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col", "right_gravity": true, @@ -8866,7 +11699,12 @@ 0, { "right_gravity": true, - "virt_text": [[" 2025-11-03 13:35:15", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-11-03 13:35:15", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align", "virt_text_repeat_linebreak": false, "priority": 9, @@ -8878,51 +11716,81 @@ "actions": [ { "type": "diff_revert_selected_file", - "range": { "from": 57, "to": 57 }, + "range": { + "from": 57, + "to": 57 + }, "display_line": 57, "text": "[R]evert file", "key": "R", - "args": ["8e7903714919009004aad8754db0035fb47ecb24"] + "args": [ + "8e7903714919009004aad8754db0035fb47ecb24" + ] }, { "type": "diff_revert_all", - "range": { "from": 57, "to": 57 }, + "range": { + "from": 57, + "to": 57 + }, "display_line": 57, "text": "Revert [A]ll", "key": "A", - "args": ["8e7903714919009004aad8754db0035fb47ecb24"] + "args": [ + "8e7903714919009004aad8754db0035fb47ecb24" + ] }, { "type": "diff_open", - "range": { "from": 57, "to": 57 }, + "range": { + "from": 57, + "to": 57 + }, "display_line": 57, "text": "[D]iff", "key": "D", - "args": ["8e7903714919009004aad8754db0035fb47ecb24"] + "args": [ + "8e7903714919009004aad8754db0035fb47ecb24" + ] }, { "type": "diff_revert_selected_file", - "range": { "from": 94, "to": 94 }, + "range": { + "from": 94, + "to": 94 + }, "display_line": 94, "text": "[R]evert file", "key": "R", - "args": ["f33f38a70b284207e092c2c578a24e96fdd1bd4d"] + "args": [ + "f33f38a70b284207e092c2c578a24e96fdd1bd4d" + ] }, { "type": "diff_revert_all", - "range": { "from": 94, "to": 94 }, + "range": { + "from": 94, + "to": 94 + }, "display_line": 94, "text": "Revert [A]ll", "key": "A", - "args": ["f33f38a70b284207e092c2c578a24e96fdd1bd4d"] + "args": [ + "f33f38a70b284207e092c2c578a24e96fdd1bd4d" + ] }, { "type": "diff_open", - "range": { "from": 94, "to": 94 }, + "range": { + "from": 94, + "to": 94 + }, "display_line": 94, "text": "[D]iff", "key": "D", - "args": ["f33f38a70b284207e092c2c578a24e96fdd1bd4d"] + "args": [ + "f33f38a70b284207e092c2c578a24e96fdd1bd4d" + ] } ], "timestamp": 1772803136 diff --git a/tests/data/diff.expected.json b/tests/data/diff.expected.json index 9e521220..e226e300 100644 --- a/tests/data/diff.expected.json +++ b/tests/data/diff.expected.json @@ -11,11 +11,25 @@ "virt_text_hide": false, "virt_text_repeat_linebreak": false, "virt_text": [ - ["▌󰭻 ", "OpencodeMessageRoleUser"], - [" "], - ["USER", "OpencodeMessageRoleUser"], - ["", "OpencodeHint"], - [" [msg_9d7287269001C5gRusYfX7A1w1]", "OpencodeHint"] + [ + "▌󰭻 ", + "OpencodeMessageRoleUser" + ], + [ + " " + ], + [ + "USER", + "OpencodeMessageRoleUser" + ], + [ + "", + "OpencodeHint" + ], + [ + " [msg_9d7287269001C5gRusYfX7A1w1]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col", "right_gravity": true @@ -30,7 +44,12 @@ "ns_id": 3, "virt_text_hide": false, "virt_text_repeat_linebreak": false, - "virt_text": [[" 2025-10-12 06:42:56", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-10-12 06:42:56", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align", "right_gravity": true } @@ -45,7 +64,12 @@ "virt_text_win_col": -3, "virt_text_hide": false, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col", "right_gravity": true } @@ -60,7 +84,12 @@ "virt_text_win_col": -3, "virt_text_hide": false, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col", "right_gravity": true } @@ -90,7 +119,12 @@ "virt_text_win_col": -3, "virt_text_hide": false, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col", "right_gravity": true } @@ -105,7 +139,12 @@ "virt_text_win_col": -3, "virt_text_hide": false, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col", "right_gravity": true } @@ -121,11 +160,25 @@ "virt_text_hide": false, "virt_text_repeat_linebreak": false, "virt_text": [ - [" ", "OpencodeMessageRoleAssistant"], - [" "], - ["BUILD", "OpencodeMessageRoleAssistant"], - [" claude-sonnet-4.5", "OpencodeHint"], - [" [msg_9d7287287001HVwpPaH7WkRVdN]", "OpencodeHint"] + [ + " ", + "OpencodeMessageRoleAssistant" + ], + [ + " " + ], + [ + "BUILD", + "OpencodeMessageRoleAssistant" + ], + [ + " claude-sonnet-4.5", + "OpencodeHint" + ], + [ + " [msg_9d7287287001HVwpPaH7WkRVdN]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col", "right_gravity": true @@ -140,7 +193,12 @@ "ns_id": 3, "virt_text_hide": false, "virt_text_repeat_linebreak": false, - "virt_text": [[" 2025-10-12 06:42:56", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-10-12 06:42:56", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align", "right_gravity": true } @@ -155,7 +213,12 @@ "virt_text_win_col": -1, "virt_text_hide": false, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true } @@ -170,7 +233,12 @@ "virt_text_win_col": -1, "virt_text_hide": false, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true } @@ -185,7 +253,12 @@ "virt_text_win_col": -1, "virt_text_hide": false, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true } @@ -200,9 +273,18 @@ "virt_text_hide": false, "hl_group": "OpencodeDiffDelete", "virt_text": [ - ["1", "OpencodeDiffDeleteGutter"], - ["-", "OpencodeDiffDeleteGutter"], - [" ", "OpencodeDiffDeleteGutter"] + [ + "1", + "OpencodeDiffDeleteGutter" + ], + [ + "-", + "OpencodeDiffDeleteGutter" + ], + [ + " ", + "OpencodeDiffDeleteGutter" + ] ], "hl_eol": true, "priority": 5000, @@ -223,7 +305,12 @@ "virt_text_win_col": -1, "virt_text_hide": false, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true } @@ -238,9 +325,18 @@ "virt_text_hide": false, "hl_group": "OpencodeDiffAdd", "virt_text": [ - ["1", "OpencodeDiffAddGutter"], - ["+", "OpencodeDiffAddGutter"], - [" ", "OpencodeDiffAddGutter"] + [ + "1", + "OpencodeDiffAddGutter" + ], + [ + "+", + "OpencodeDiffAddGutter" + ], + [ + " ", + "OpencodeDiffAddGutter" + ] ], "hl_eol": true, "priority": 5000, @@ -261,7 +357,12 @@ "virt_text_win_col": -1, "virt_text_hide": false, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true } @@ -276,7 +377,12 @@ "virt_text_win_col": -1, "virt_text_hide": false, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true } @@ -291,7 +397,12 @@ "virt_text_win_col": -1, "virt_text_hide": false, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "right_gravity": true } @@ -307,11 +418,25 @@ "virt_text_hide": false, "virt_text_repeat_linebreak": false, "virt_text": [ - [" ", "OpencodeMessageRoleAssistant"], - [" "], - ["BUILD", "OpencodeMessageRoleAssistant"], - [" claude-sonnet-4.5", "OpencodeHint"], - [" [msg_9d7288f2f001hW6NqqhtBc72UU]", "OpencodeHint"] + [ + " ", + "OpencodeMessageRoleAssistant" + ], + [ + " " + ], + [ + "BUILD", + "OpencodeMessageRoleAssistant" + ], + [ + " claude-sonnet-4.5", + "OpencodeHint" + ], + [ + " [msg_9d7288f2f001hW6NqqhtBc72UU]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col", "right_gravity": true @@ -326,7 +451,12 @@ "ns_id": 3, "virt_text_hide": false, "virt_text_repeat_linebreak": false, - "virt_text": [[" 2025-10-12 06:43:03", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-10-12 06:43:03", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align", "right_gravity": true } @@ -335,25 +465,40 @@ "actions": [ { "key": "R", - "args": ["1f593f7ed419c95d3995f8ef4b98d4e571c3a492"], + "args": [ + "1f593f7ed419c95d3995f8ef4b98d4e571c3a492" + ], "type": "diff_revert_selected_file", - "range": { "from": 18, "to": 18 }, + "range": { + "from": 18, + "to": 18 + }, "display_line": 18, "text": "[R]evert file" }, { "key": "A", - "args": ["1f593f7ed419c95d3995f8ef4b98d4e571c3a492"], + "args": [ + "1f593f7ed419c95d3995f8ef4b98d4e571c3a492" + ], "type": "diff_revert_all", - "range": { "from": 18, "to": 18 }, + "range": { + "from": 18, + "to": 18 + }, "display_line": 18, "text": "Revert [A]ll" }, { "key": "D", - "args": ["1f593f7ed419c95d3995f8ef4b98d4e571c3a492"], + "args": [ + "1f593f7ed419c95d3995f8ef4b98d4e571c3a492" + ], "type": "diff_open", - "range": { "from": 18, "to": 18 }, + "range": { + "from": 18, + "to": 18 + }, "display_line": 18, "text": "[D]iff" } diff --git a/tests/data/markdown-codefence.expected.json b/tests/data/markdown-codefence.expected.json index 741a2ea5..ac1dd777 100644 --- a/tests/data/markdown-codefence.expected.json +++ b/tests/data/markdown-codefence.expected.json @@ -1,27 +1,42 @@ { "actions": [ { - "args": ["c64ddee834f1b802020a8f880eafa689f0b99406"], + "args": [ + "c64ddee834f1b802020a8f880eafa689f0b99406" + ], "type": "diff_revert_selected_file", "text": "[R]evert file", "key": "R", - "range": { "from": 23, "to": 23 }, + "range": { + "from": 23, + "to": 23 + }, "display_line": 23 }, { - "args": ["c64ddee834f1b802020a8f880eafa689f0b99406"], + "args": [ + "c64ddee834f1b802020a8f880eafa689f0b99406" + ], "type": "diff_revert_all", "text": "Revert [A]ll", "key": "A", - "range": { "from": 23, "to": 23 }, + "range": { + "from": 23, + "to": 23 + }, "display_line": 23 }, { - "args": ["c64ddee834f1b802020a8f880eafa689f0b99406"], + "args": [ + "c64ddee834f1b802020a8f880eafa689f0b99406" + ], "type": "diff_open", "text": "[D]iff", "key": "D", - "range": { "from": 23, "to": 23 }, + "range": { + "from": 23, + "to": 23 + }, "display_line": 23 } ], @@ -33,11 +48,25 @@ { "right_gravity": true, "virt_text": [ - [" ", "OpencodeMessageRoleAssistant"], - [" "], - ["BUILD", "OpencodeMessageRoleAssistant"], - [" claude-sonnet-4.5", "OpencodeHint"], - [" [msg_a2cd04588001P9plKmrFnsNH3M]", "OpencodeHint"] + [ + " ", + "OpencodeMessageRoleAssistant" + ], + [ + " " + ], + [ + "BUILD", + "OpencodeMessageRoleAssistant" + ], + [ + " claude-sonnet-4.5", + "OpencodeHint" + ], + [ + " [msg_a2cd04588001P9plKmrFnsNH3M]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col", "virt_text_win_col": -3, @@ -58,7 +87,12 @@ "priority": 9, "virt_text_hide": false, "virt_text_repeat_linebreak": false, - "virt_text": [[" 2025-10-28 21:53:58", "OpencodeHint"]] + "virt_text": [ + [ + " 2025-10-28 21:53:58", + "OpencodeHint" + ] + ] } ], [ @@ -67,7 +101,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -1, "priority": 4096, @@ -82,7 +121,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -1, "priority": 4096, @@ -97,7 +141,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -1, "priority": 4096, @@ -117,9 +166,18 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - ["382", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "382", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "end_col": 0, @@ -133,7 +191,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -1, "priority": 4096, @@ -153,9 +216,18 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - ["383", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "383", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "end_col": 0, @@ -169,7 +241,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -1, "priority": 4096, @@ -189,9 +266,18 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - ["384", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "384", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "end_col": 0, @@ -205,7 +291,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -1, "priority": 4096, @@ -225,9 +316,18 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - ["385", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "385", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "end_col": 0, @@ -241,7 +341,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -1, "priority": 4096, @@ -263,9 +368,18 @@ "hl_eol": true, "hl_group": "OpencodeDiffDelete", "virt_text": [ - ["386", "OpencodeDiffDeleteGutter"], - ["-", "OpencodeDiffDeleteGutter"], - [" ", "OpencodeDiffDeleteGutter"] + [ + "386", + "OpencodeDiffDeleteGutter" + ], + [ + "-", + "OpencodeDiffDeleteGutter" + ], + [ + " ", + "OpencodeDiffDeleteGutter" + ] ], "virt_text_pos": "overlay", "end_col": 0, @@ -279,7 +393,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -1, "priority": 4096, @@ -301,9 +420,18 @@ "hl_eol": true, "hl_group": "OpencodeDiffDelete", "virt_text": [ - ["387", "OpencodeDiffDeleteGutter"], - ["-", "OpencodeDiffDeleteGutter"], - [" ", "OpencodeDiffDeleteGutter"] + [ + "387", + "OpencodeDiffDeleteGutter" + ], + [ + "-", + "OpencodeDiffDeleteGutter" + ], + [ + " ", + "OpencodeDiffDeleteGutter" + ] ], "virt_text_pos": "overlay", "end_col": 0, @@ -317,7 +445,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -1, "priority": 4096, @@ -339,9 +472,18 @@ "hl_eol": true, "hl_group": "OpencodeDiffAdd", "virt_text": [ - ["386", "OpencodeDiffAddGutter"], - ["+", "OpencodeDiffAddGutter"], - [" ", "OpencodeDiffAddGutter"] + [ + "386", + "OpencodeDiffAddGutter" + ], + [ + "+", + "OpencodeDiffAddGutter" + ], + [ + " ", + "OpencodeDiffAddGutter" + ] ], "virt_text_pos": "overlay", "end_col": 0, @@ -355,7 +497,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -1, "priority": 4096, @@ -377,9 +524,18 @@ "hl_eol": true, "hl_group": "OpencodeDiffAdd", "virt_text": [ - ["387", "OpencodeDiffAddGutter"], - ["+", "OpencodeDiffAddGutter"], - [" ", "OpencodeDiffAddGutter"] + [ + "387", + "OpencodeDiffAddGutter" + ], + [ + "+", + "OpencodeDiffAddGutter" + ], + [ + " ", + "OpencodeDiffAddGutter" + ] ], "virt_text_pos": "overlay", "end_col": 0, @@ -393,7 +549,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -1, "priority": 4096, @@ -413,9 +574,18 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - ["388", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "388", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "end_col": 0, @@ -429,7 +599,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -1, "priority": 4096, @@ -449,9 +624,18 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - ["389", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "389", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "end_col": 0, @@ -465,7 +649,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -1, "priority": 4096, @@ -485,9 +674,18 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - ["390", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "390", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "end_col": 0, @@ -501,7 +699,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -1, "priority": 4096, @@ -521,9 +724,18 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - ["391", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "391", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "end_col": 0, @@ -537,7 +749,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -1, "priority": 4096, @@ -552,7 +769,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -1, "priority": 4096, @@ -567,7 +789,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -1, "priority": 4096, @@ -583,11 +810,25 @@ { "right_gravity": true, "virt_text": [ - [" ", "OpencodeMessageRoleAssistant"], - [" "], - ["BUILD", "OpencodeMessageRoleAssistant"], - [" claude-sonnet-4.5", "OpencodeHint"], - [" [msg_a2cd062fb001UA0ZzR6JxgLxDQ]", "OpencodeHint"] + [ + " ", + "OpencodeMessageRoleAssistant" + ], + [ + " " + ], + [ + "BUILD", + "OpencodeMessageRoleAssistant" + ], + [ + " claude-sonnet-4.5", + "OpencodeHint" + ], + [ + " [msg_a2cd062fb001UA0ZzR6JxgLxDQ]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col", "virt_text_win_col": -3, @@ -608,7 +849,12 @@ "priority": 9, "virt_text_hide": false, "virt_text_repeat_linebreak": false, - "virt_text": [[" 2025-10-28 21:54:05", "OpencodeHint"]] + "virt_text": [ + [ + " 2025-10-28 21:54:05", + "OpencodeHint" + ] + ] } ], [ @@ -618,11 +864,25 @@ { "right_gravity": true, "virt_text": [ - ["▌󰭻 ", "OpencodeMessageRoleUser"], - [" "], - ["USER", "OpencodeMessageRoleUser"], - ["", "OpencodeHint"], - [" [msg_a2cf5ce65001YLvVsYxIboFcP4]", "OpencodeHint"] + [ + "▌󰭻 ", + "OpencodeMessageRoleUser" + ], + [ + " " + ], + [ + "USER", + "OpencodeMessageRoleUser" + ], + [ + "", + "OpencodeHint" + ], + [ + " [msg_a2cf5ce65001YLvVsYxIboFcP4]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col", "virt_text_win_col": -3, @@ -643,7 +903,12 @@ "priority": 9, "virt_text_hide": false, "virt_text_repeat_linebreak": false, - "virt_text": [[" 2025-10-28 22:34:58", "OpencodeHint"]] + "virt_text": [ + [ + " 2025-10-28 22:34:58", + "OpencodeHint" + ] + ] } ], [ @@ -652,7 +917,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -3, "priority": 4096, @@ -667,7 +937,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -3, "priority": 4096, @@ -682,7 +957,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -3, "priority": 4096, @@ -697,7 +977,12 @@ 0, { "right_gravity": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col", "virt_text_win_col": -3, "priority": 4096, @@ -713,11 +998,25 @@ { "right_gravity": true, "virt_text": [ - [" ", "OpencodeMessageRoleAssistant"], - [" "], - ["PLAN", "OpencodeMessageRoleAssistant"], - [" gpt-4.1", "OpencodeHint"], - [" [msg_a2cf5cf0f002oBAjmnGIMGXjez]", "OpencodeHint"] + [ + " ", + "OpencodeMessageRoleAssistant" + ], + [ + " " + ], + [ + "PLAN", + "OpencodeMessageRoleAssistant" + ], + [ + " gpt-4.1", + "OpencodeHint" + ], + [ + " [msg_a2cf5cf0f002oBAjmnGIMGXjez]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col", "virt_text_win_col": -3, @@ -738,7 +1037,12 @@ "priority": 9, "virt_text_hide": false, "virt_text_repeat_linebreak": false, - "virt_text": [[" 2025-10-28 22:34:58", "OpencodeHint"]] + "virt_text": [ + [ + " 2025-10-28 22:34:58", + "OpencodeHint" + ] + ] } ] ], diff --git a/tests/data/redo-all.expected.json b/tests/data/redo-all.expected.json index 207020da..cf7c37b7 100644 --- a/tests/data/redo-all.expected.json +++ b/tests/data/redo-all.expected.json @@ -102,74 +102,119 @@ "actions": [ { "key": "R", - "args": ["d988cc85565b99017d40ad8baea20225165be9d5"], + "args": [ + "d988cc85565b99017d40ad8baea20225165be9d5" + ], "display_line": 90, "text": "[R]evert file", - "range": { "to": 90, "from": 90 }, + "range": { + "to": 90, + "from": 90 + }, "type": "diff_revert_selected_file" }, { "key": "A", - "args": ["d988cc85565b99017d40ad8baea20225165be9d5"], + "args": [ + "d988cc85565b99017d40ad8baea20225165be9d5" + ], "display_line": 90, "text": "Revert [A]ll", - "range": { "to": 90, "from": 90 }, + "range": { + "to": 90, + "from": 90 + }, "type": "diff_revert_all" }, { "key": "D", - "args": ["d988cc85565b99017d40ad8baea20225165be9d5"], + "args": [ + "d988cc85565b99017d40ad8baea20225165be9d5" + ], "display_line": 90, "text": "[D]iff", - "range": { "to": 90, "from": 90 }, + "range": { + "to": 90, + "from": 90 + }, "type": "diff_open" }, { "key": "R", - "args": ["1b6ba655c6c0d899965adff278ac6320d5fc3b12"], + "args": [ + "1b6ba655c6c0d899965adff278ac6320d5fc3b12" + ], "display_line": 22, "text": "[R]evert file", - "range": { "to": 22, "from": 22 }, + "range": { + "to": 22, + "from": 22 + }, "type": "diff_revert_selected_file" }, { "key": "A", - "args": ["1b6ba655c6c0d899965adff278ac6320d5fc3b12"], + "args": [ + "1b6ba655c6c0d899965adff278ac6320d5fc3b12" + ], "display_line": 22, "text": "Revert [A]ll", - "range": { "to": 22, "from": 22 }, + "range": { + "to": 22, + "from": 22 + }, "type": "diff_revert_all" }, { "key": "D", - "args": ["1b6ba655c6c0d899965adff278ac6320d5fc3b12"], + "args": [ + "1b6ba655c6c0d899965adff278ac6320d5fc3b12" + ], "display_line": 22, "text": "[D]iff", - "range": { "to": 22, "from": 22 }, + "range": { + "to": 22, + "from": 22 + }, "type": "diff_open" }, { "key": "R", - "args": ["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"], + "args": [ + "57d83f5596cb1f142fbc681d3d93b7184f7f73cd" + ], "display_line": 56, "text": "[R]evert file", - "range": { "to": 56, "from": 56 }, + "range": { + "to": 56, + "from": 56 + }, "type": "diff_revert_selected_file" }, { "key": "A", - "args": ["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"], + "args": [ + "57d83f5596cb1f142fbc681d3d93b7184f7f73cd" + ], "display_line": 56, "text": "Revert [A]ll", - "range": { "to": 56, "from": 56 }, + "range": { + "to": 56, + "from": 56 + }, "type": "diff_revert_all" }, { "key": "D", - "args": ["57d83f5596cb1f142fbc681d3d93b7184f7f73cd"], + "args": [ + "57d83f5596cb1f142fbc681d3d93b7184f7f73cd" + ], "display_line": 56, "text": "[D]iff", - "range": { "to": 56, "from": 56 }, + "range": { + "to": 56, + "from": 56 + }, "type": "diff_open" } ], @@ -186,11 +231,25 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - ["▌󰭻 ", "OpencodeMessageRoleUser"], - [" "], - ["USER", "OpencodeMessageRoleUser"], - ["", "OpencodeHint"], - [" [msg_a0234c0b7001y2o9S1jMaNVZar]", "OpencodeHint"] + [ + "▌󰭻 ", + "OpencodeMessageRoleUser" + ], + [ + " " + ], + [ + "USER", + "OpencodeMessageRoleUser" + ], + [ + "", + "OpencodeHint" + ], + [ + " [msg_a0234c0b7001y2o9S1jMaNVZar]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col" } @@ -205,7 +264,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": false, - "virt_text": [[" 2025-10-20 15:20:02", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-10-20 15:20:02", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align" } ], @@ -220,7 +284,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col" } ], @@ -235,7 +304,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col" } ], @@ -250,7 +324,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col" } ], @@ -265,7 +344,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col" } ], @@ -281,11 +365,25 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - [" ", "OpencodeMessageRoleAssistant"], - [" "], - ["BUILD", "OpencodeMessageRoleAssistant"], - [" gpt-5-mini", "OpencodeHint"], - [" [msg_a0234c7960011LTxTvD94hfWCi]", "OpencodeHint"] + [ + " ", + "OpencodeMessageRoleAssistant" + ], + [ + " " + ], + [ + "BUILD", + "OpencodeMessageRoleAssistant" + ], + [ + " gpt-5-mini", + "OpencodeHint" + ], + [ + " [msg_a0234c7960011LTxTvD94hfWCi]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col" } @@ -300,7 +398,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": false, - "virt_text": [[" 2025-10-20 15:20:04", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-10-20 15:20:04", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align" } ], @@ -315,7 +418,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -330,7 +438,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -345,7 +458,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -365,9 +483,18 @@ "end_col": 0, "virt_text_repeat_linebreak": false, "virt_text": [ - ["1", "OpencodeDiffDeleteGutter"], - ["-", "OpencodeDiffDeleteGutter"], - [" ", "OpencodeDiffDeleteGutter"] + [ + "1", + "OpencodeDiffDeleteGutter" + ], + [ + "-", + "OpencodeDiffDeleteGutter" + ], + [ + " ", + "OpencodeDiffDeleteGutter" + ] ], "end_right_gravity": false } @@ -383,7 +510,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -403,9 +535,18 @@ "end_col": 0, "virt_text_repeat_linebreak": false, "virt_text": [ - ["1", "OpencodeDiffAddGutter"], - ["+", "OpencodeDiffAddGutter"], - [" ", "OpencodeDiffAddGutter"] + [ + "1", + "OpencodeDiffAddGutter" + ], + [ + "+", + "OpencodeDiffAddGutter" + ], + [ + " ", + "OpencodeDiffAddGutter" + ] ], "end_right_gravity": false } @@ -421,7 +562,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -436,9 +582,18 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - ["2", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "2", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "priority": 5000, @@ -457,7 +612,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -472,9 +632,18 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - ["3", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "3", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "priority": 5000, @@ -493,7 +662,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -508,7 +682,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -523,7 +702,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -539,11 +723,25 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - [" ", "OpencodeMessageRoleAssistant"], - [" "], - ["BUILD", "OpencodeMessageRoleAssistant"], - [" gpt-5-mini", "OpencodeHint"], - [" [msg_a0234d8fb001SXyngLjuKSuxOY]", "OpencodeHint"] + [ + " ", + "OpencodeMessageRoleAssistant" + ], + [ + " " + ], + [ + "BUILD", + "OpencodeMessageRoleAssistant" + ], + [ + " gpt-5-mini", + "OpencodeHint" + ], + [ + " [msg_a0234d8fb001SXyngLjuKSuxOY]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col" } @@ -558,7 +756,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": false, - "virt_text": [[" 2025-10-20 15:20:09", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-10-20 15:20:09", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align" } ], @@ -574,11 +777,25 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - ["▌󰭻 ", "OpencodeMessageRoleUser"], - [" "], - ["USER", "OpencodeMessageRoleUser"], - ["", "OpencodeHint"], - [" [msg_a0234e308001SKl5bQUibp5gtI]", "OpencodeHint"] + [ + "▌󰭻 ", + "OpencodeMessageRoleUser" + ], + [ + " " + ], + [ + "USER", + "OpencodeMessageRoleUser" + ], + [ + "", + "OpencodeHint" + ], + [ + " [msg_a0234e308001SKl5bQUibp5gtI]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col" } @@ -593,7 +810,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": false, - "virt_text": [[" 2025-10-20 15:20:11", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-10-20 15:20:11", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align" } ], @@ -608,7 +830,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col" } ], @@ -623,7 +850,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col" } ], @@ -639,11 +871,25 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - [" ", "OpencodeMessageRoleAssistant"], - [" "], - ["BUILD", "OpencodeMessageRoleAssistant"], - [" gpt-5-mini", "OpencodeHint"], - [" [msg_a0234e31f001m4EsQdPmY3PTtS]", "OpencodeHint"] + [ + " ", + "OpencodeMessageRoleAssistant" + ], + [ + " " + ], + [ + "BUILD", + "OpencodeMessageRoleAssistant" + ], + [ + " gpt-5-mini", + "OpencodeHint" + ], + [ + " [msg_a0234e31f001m4EsQdPmY3PTtS]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col" } @@ -658,7 +904,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": false, - "virt_text": [[" 2025-10-20 15:20:11", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-10-20 15:20:11", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align" } ], @@ -674,11 +925,25 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - [" ", "OpencodeMessageRoleAssistant"], - [" "], - ["BUILD", "OpencodeMessageRoleAssistant"], - [" gpt-5-mini", "OpencodeHint"], - [" [msg_a0234f482001PQbMjWc6W8s0eF]", "OpencodeHint"] + [ + " ", + "OpencodeMessageRoleAssistant" + ], + [ + " " + ], + [ + "BUILD", + "OpencodeMessageRoleAssistant" + ], + [ + " gpt-5-mini", + "OpencodeHint" + ], + [ + " [msg_a0234f482001PQbMjWc6W8s0eF]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col" } @@ -693,7 +958,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": false, - "virt_text": [[" 2025-10-20 15:20:16", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-10-20 15:20:16", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align" } ], @@ -708,7 +978,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -723,7 +998,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -738,7 +1018,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -758,9 +1043,18 @@ "end_col": 0, "virt_text_repeat_linebreak": false, "virt_text": [ - ["1", "OpencodeDiffDeleteGutter"], - ["-", "OpencodeDiffDeleteGutter"], - [" ", "OpencodeDiffDeleteGutter"] + [ + "1", + "OpencodeDiffDeleteGutter" + ], + [ + "-", + "OpencodeDiffDeleteGutter" + ], + [ + " ", + "OpencodeDiffDeleteGutter" + ] ], "end_right_gravity": false } @@ -776,7 +1070,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -796,9 +1095,18 @@ "end_col": 0, "virt_text_repeat_linebreak": false, "virt_text": [ - ["1", "OpencodeDiffAddGutter"], - ["+", "OpencodeDiffAddGutter"], - [" ", "OpencodeDiffAddGutter"] + [ + "1", + "OpencodeDiffAddGutter" + ], + [ + "+", + "OpencodeDiffAddGutter" + ], + [ + " ", + "OpencodeDiffAddGutter" + ] ], "end_right_gravity": false } @@ -814,7 +1122,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -829,9 +1142,18 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - ["2", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "2", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "priority": 5000, @@ -850,7 +1172,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -865,9 +1192,18 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - ["3", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "3", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "priority": 5000, @@ -886,7 +1222,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -901,7 +1242,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -916,7 +1262,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -932,11 +1283,25 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - [" ", "OpencodeMessageRoleAssistant"], - [" "], - ["BUILD", "OpencodeMessageRoleAssistant"], - [" gpt-5-mini", "OpencodeHint"], - [" [msg_a0234f9c6001JCKYaca1HHwwx6]", "OpencodeHint"] + [ + " ", + "OpencodeMessageRoleAssistant" + ], + [ + " " + ], + [ + "BUILD", + "OpencodeMessageRoleAssistant" + ], + [ + " gpt-5-mini", + "OpencodeHint" + ], + [ + " [msg_a0234f9c6001JCKYaca1HHwwx6]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col" } @@ -951,7 +1316,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": false, - "virt_text": [[" 2025-10-20 15:20:17", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-10-20 15:20:17", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align" } ], @@ -967,11 +1337,25 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - ["▌󰭻 ", "OpencodeMessageRoleUser"], - [" "], - ["USER", "OpencodeMessageRoleUser"], - ["", "OpencodeHint"], - [" [msg_a0236fd1c001TlwqL8fwvq529i]", "OpencodeHint"] + [ + "▌󰭻 ", + "OpencodeMessageRoleUser" + ], + [ + " " + ], + [ + "USER", + "OpencodeMessageRoleUser" + ], + [ + "", + "OpencodeHint" + ], + [ + " [msg_a0236fd1c001TlwqL8fwvq529i]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col" } @@ -986,7 +1370,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": false, - "virt_text": [[" 2025-10-20 15:22:29", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-10-20 15:22:29", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align" } ], @@ -1001,7 +1390,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col" } ], @@ -1016,7 +1410,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeMessageRoleUser"]], + "virt_text": [ + [ + "▌", + "OpencodeMessageRoleUser" + ] + ], "virt_text_pos": "win_col" } ], @@ -1032,11 +1431,25 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - [" ", "OpencodeMessageRoleAssistant"], - [" "], - ["BUILD", "OpencodeMessageRoleAssistant"], - [" gpt-5-mini", "OpencodeHint"], - [" [msg_a0236fd57001pTnTjSBdFlleCb]", "OpencodeHint"] + [ + " ", + "OpencodeMessageRoleAssistant" + ], + [ + " " + ], + [ + "BUILD", + "OpencodeMessageRoleAssistant" + ], + [ + " gpt-5-mini", + "OpencodeHint" + ], + [ + " [msg_a0236fd57001pTnTjSBdFlleCb]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col" } @@ -1051,7 +1464,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": false, - "virt_text": [[" 2025-10-20 15:22:29", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-10-20 15:22:29", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align" } ], @@ -1067,11 +1485,25 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - [" ", "OpencodeMessageRoleAssistant"], - [" "], - ["BUILD", "OpencodeMessageRoleAssistant"], - [" gpt-5-mini", "OpencodeHint"], - [" [msg_a02371241001PBQAsr8Oc9hqNI]", "OpencodeHint"] + [ + " ", + "OpencodeMessageRoleAssistant" + ], + [ + " " + ], + [ + "BUILD", + "OpencodeMessageRoleAssistant" + ], + [ + " gpt-5-mini", + "OpencodeHint" + ], + [ + " [msg_a02371241001PBQAsr8Oc9hqNI]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col" } @@ -1086,7 +1518,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": false, - "virt_text": [[" 2025-10-20 15:22:34", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-10-20 15:22:34", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align" } ], @@ -1101,7 +1538,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -1116,7 +1558,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -1131,7 +1578,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -1151,9 +1603,18 @@ "end_col": 0, "virt_text_repeat_linebreak": false, "virt_text": [ - ["1", "OpencodeDiffDeleteGutter"], - ["-", "OpencodeDiffDeleteGutter"], - [" ", "OpencodeDiffDeleteGutter"] + [ + "1", + "OpencodeDiffDeleteGutter" + ], + [ + "-", + "OpencodeDiffDeleteGutter" + ], + [ + " ", + "OpencodeDiffDeleteGutter" + ] ], "end_right_gravity": false } @@ -1169,7 +1630,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -1189,9 +1655,18 @@ "end_col": 0, "virt_text_repeat_linebreak": false, "virt_text": [ - ["1", "OpencodeDiffAddGutter"], - ["+", "OpencodeDiffAddGutter"], - [" ", "OpencodeDiffAddGutter"] + [ + "1", + "OpencodeDiffAddGutter" + ], + [ + "+", + "OpencodeDiffAddGutter" + ], + [ + " ", + "OpencodeDiffAddGutter" + ] ], "end_right_gravity": false } @@ -1207,7 +1682,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -1222,9 +1702,18 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - ["2", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "2", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "priority": 5000, @@ -1243,7 +1732,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -1258,9 +1752,18 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - ["3", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"], - [" ", "OpencodeDiffGutter"] + [ + "3", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ], + [ + " ", + "OpencodeDiffGutter" + ] ], "virt_text_pos": "overlay", "priority": 5000, @@ -1279,7 +1782,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -1294,7 +1802,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -1309,7 +1822,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": true, - "virt_text": [["▌", "OpencodeToolBorder"]], + "virt_text": [ + [ + "▌", + "OpencodeToolBorder" + ] + ], "virt_text_pos": "win_col" } ], @@ -1325,11 +1843,25 @@ "right_gravity": true, "virt_text_repeat_linebreak": false, "virt_text": [ - [" ", "OpencodeMessageRoleAssistant"], - [" "], - ["BUILD", "OpencodeMessageRoleAssistant"], - [" gpt-5-mini", "OpencodeHint"], - [" [msg_a023723d0001r87MaJThFssUw1]", "OpencodeHint"] + [ + " ", + "OpencodeMessageRoleAssistant" + ], + [ + " " + ], + [ + "BUILD", + "OpencodeMessageRoleAssistant" + ], + [ + " gpt-5-mini", + "OpencodeHint" + ], + [ + " [msg_a023723d0001r87MaJThFssUw1]", + "OpencodeHint" + ] ], "virt_text_pos": "win_col" } @@ -1344,7 +1876,12 @@ "virt_text_hide": false, "right_gravity": true, "virt_text_repeat_linebreak": false, - "virt_text": [[" 2025-10-20 15:22:39", "OpencodeHint"]], + "virt_text": [ + [ + " 2025-10-20 15:22:39", + "OpencodeHint" + ] + ], "virt_text_pos": "right_align" } ] diff --git a/tests/data/redo-once.expected.json b/tests/data/redo-once.expected.json index de3a627c..484fcd98 100644 --- a/tests/data/redo-once.expected.json +++ b/tests/data/redo-once.expected.json @@ -1,939 +1,1304 @@ { - "extmarks": [ - [ - 1, - 1, - 0, - { - "priority": 10, - "virt_text": [ - ["▌󰭻 ", "OpencodeMessageRoleUser"], - [" "], - ["USER", "OpencodeMessageRoleUser"], - ["", "OpencodeHint"], - [" [msg_a0234c0b7001y2o9S1jMaNVZar]", "OpencodeHint"] + "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 + } + ] ], - "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"] + "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", + "" ], - "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"] + "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" + ] + } ], - "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 + "timestamp": 1772803148 } diff --git a/tests/data/shifting-and-multiple-perms.expected.json b/tests/data/shifting-and-multiple-perms.expected.json index df46362b..59fc1e59 100644 --- a/tests/data/shifting-and-multiple-perms.expected.json +++ b/tests/data/shifting-and-multiple-perms.expected.json @@ -1,1083 +1,1452 @@ { - "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"] + "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 + } + ] ], - "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"] + "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`", + "", + "" ], - "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": [] + "actions": [] } diff --git a/tests/manual/QUICKSTART.md b/tests/manual/QUICKSTART.md index 4e2708ac..25be7361 100644 --- a/tests/manual/QUICKSTART.md +++ b/tests/manual/QUICKSTART.md @@ -3,7 +3,7 @@ ## Run the visual replay test ```bash -cd /Users/cam/Dev/neovim-dev/opencode.nvim +# from the repository root ./tests/manual/run_replay.sh ``` diff --git a/tests/minimal/plugin_spec.lua b/tests/minimal/plugin_spec.lua index 8ad5a70c..09e17bb0 100644 --- a/tests/minimal/plugin_spec.lua +++ b/tests/minimal/plugin_spec.lua @@ -82,10 +82,15 @@ describe('opencode.nvim plugin', function() local opencode = require('opencode') opencode.setup({ - keymap = { prompt = 'test' }, + default_global_keymaps = false, + keymap = { + editor = { + ['test'] = { 'toggle' }, + }, + }, }) local config = require('opencode.config') - assert.equal('test', config.keymap.prompt) + assert.same({ 'toggle' }, config.keymap.editor['test']) end) end) diff --git a/tests/unit/config_spec.lua b/tests/unit/config_spec.lua index cf3812be..387c8003 100644 --- a/tests/unit/config_spec.lua +++ b/tests/unit/config_spec.lua @@ -29,10 +29,12 @@ describe('opencode.config', function() return 'custom' end config.setup({ - command_callback = custom_callback, + hooks = { + on_done_thinking = custom_callback, + }, }) - assert.equal(custom_callback, config.values.command_callback) + assert.equal(custom_callback, config.values.hooks.on_done_thinking) assert.same(config.defaults.keymap, config.values.keymap) end) diff --git a/tests/unit/formatter_spec.lua b/tests/unit/formatter_spec.lua index 3944618b..fdebc62a 100644 --- a/tests/unit/formatter_spec.lua +++ b/tests/unit/formatter_spec.lua @@ -60,6 +60,75 @@ describe('formatter', function() assert.are.equal('Second line', output.lines[5]) end) + it('renders task child question tools with generic summary fallback', function() + local message = { + info = { + id = 'msg_1', + role = 'assistant', + sessionID = 'ses_1', + }, + parts = {}, + } + + local part = { + id = 'prt_1', + type = 'tool', + tool = 'task', + messageID = 'msg_1', + sessionID = 'ses_1', + state = { + status = 'completed', + input = { + description = 'review changes', + subagent_type = 'explore', + }, + metadata = { + sessionId = 'ses_child', + }, + time = { + start = 1, + ['end'] = 2, + }, + }, + } + + local child_parts = { + { + id = 'prt_child_1', + type = 'tool', + tool = 'question', + messageID = 'msg_child_1', + sessionID = 'ses_child', + state = { + status = 'completed', + input = { + questions = { + { + question = 'What should we do?', + header = 'Question', + options = {}, + }, + }, + }, + metadata = { + answers = { + { 'Ship it' }, + }, + }, + }, + }, + } + + local output = formatter.format_part(part, message, true, function(session_id) + if session_id == 'ses_child' then + return child_parts + end + return nil + end) + + assert.are.equal(' ** tool** ', output.lines[3]) + end) + it('renders directory reads with trailing slash', function() local message = { info = { @@ -96,7 +165,8 @@ describe('formatter', function() it('renders diff line numbers as extmarks', function() local output = Output.new() - formatter.format_diff( + local formatter_utils = require('opencode.ui.formatter.utils') + formatter_utils.format_diff( output, table.concat({ 'diff --git a/lua/foo.lua b/lua/foo.lua',