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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion lua/opencode/ui/permission_window.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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 .. '`' }
Expand Down
41 changes: 41 additions & 0 deletions tests/unit/permission_window_spec.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
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]
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)