From 3450f2f8e28c8fa03686e4eed5ec3081a4888e88 Mon Sep 17 00:00:00 2001 From: disrupted Date: Fri, 6 Feb 2026 00:55:30 +0100 Subject: [PATCH 1/2] fix(permission_window): escape linebreak escape sequence in patterns --- lua/opencode/ui/permission_window.lua | 4 ++- tests/unit/permission_window_spec.lua | 40 +++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 tests/unit/permission_window_spec.lua diff --git a/lua/opencode/ui/permission_window.lua b/lua/opencode/ui/permission_window.lua index 5677a677..f69c9d46 100644 --- a/lua/opencode/ui/permission_window.lua +++ b/lua/opencode/ui/permission_window.lua @@ -71,7 +71,9 @@ function M.format_display(output) progress = string.format(' (%d/%d)', 1, #M._permission_queue) end - local title = permission.title or table.concat(permission.patterns or {}, ', ') or 'Unknown Permission' + local title = permission.title + or table.concat(permission.patterns or {}, ', '):gsub('\r', '\\r'):gsub('\n', '\\n') + or 'Unknown Permission' local perm_type = permission.permission or permission.type or 'unknown' local content = { (icons.get(perm_type) or '') .. ' *' .. (perm_type or '') .. '*' .. ' `' .. title .. '`' } diff --git a/tests/unit/permission_window_spec.lua b/tests/unit/permission_window_spec.lua new file mode 100644 index 00000000..e597ef56 --- /dev/null +++ b/tests/unit/permission_window_spec.lua @@ -0,0 +1,40 @@ +local permission_window = require('opencode.ui.permission_window') +local Output = require('opencode.ui.output') + +describe('permission_window', function() + after_each(function() + permission_window._permission_queue = {} + permission_window._dialog = nil + permission_window._processing = false + end) + + it('escapes line breaks in permission titles for display', function() + local captured_opts = nil + permission_window._dialog = { + format_dialog = function(_, _, opts) + captured_opts = opts + end, + } + + permission_window._permission_queue = { + { + id = 'per_test', + permission = 'bash', + patterns = { + "python3 - <<'PY'\nprint('hello')\nPY", + }, + }, + } + + local output = Output.new() + permission_window.format_display(output) + + assert.is_not_nil(captured_opts) + assert.is_not_nil(captured_opts.content) + assert.are.equal(1, #captured_opts.content) + + local rendered_title = captured_opts.content[1] + assert.is_true(rendered_title:find('\\n', 1, true) ~= nil) + assert.is_nil(rendered_title:find('\n', 1, true)) + end) +end) From 58f666d5c7f370be93ed026d9562e08d6669abd9 Mon Sep 17 00:00:00 2001 From: disrupted Date: Fri, 6 Feb 2026 00:58:45 +0100 Subject: [PATCH 2/2] test: improve assertion to compare complete escaped pattern --- tests/unit/permission_window_spec.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit/permission_window_spec.lua b/tests/unit/permission_window_spec.lua index e597ef56..6a14c9d9 100644 --- a/tests/unit/permission_window_spec.lua +++ b/tests/unit/permission_window_spec.lua @@ -34,7 +34,8 @@ describe('permission_window', function() assert.are.equal(1, #captured_opts.content) local rendered_title = captured_opts.content[1] - assert.is_true(rendered_title:find('\\n', 1, true) ~= nil) + local expected_pattern = "python3 - <<'PY'\\nprint('hello')\\nPY" + assert.is_true(rendered_title:find('`' .. expected_pattern .. '`', 1, true) ~= nil) assert.is_nil(rendered_title:find('\n', 1, true)) end) end)