diff --git a/lua/opencode/ui/formatter.lua b/lua/opencode/ui/formatter.lua index 9dc6c159..73eced75 100644 --- a/lua/opencode/ui/formatter.lua +++ b/lua/opencode/ui/formatter.lua @@ -647,7 +647,13 @@ function M._format_question_tool(output, input, metadata, status, duration_text) output:add_line(string.format('**Q%d:** %s', i, question_lines[1])) end local answer = answers[i] and answers[i][1] or 'No answer' - output:add_line(string.format('**A%d:** %s', i, 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 diff --git a/tests/unit/formatter_spec.lua b/tests/unit/formatter_spec.lua new file mode 100644 index 00000000..306555a2 --- /dev/null +++ b/tests/unit/formatter_spec.lua @@ -0,0 +1,61 @@ +local assert = require('luassert') +local config = require('opencode.config') +local formatter = require('opencode.ui.formatter') + +describe('formatter', function() + before_each(function() + config.setup({ + ui = { + output = { + tools = { + show_output = true, + }, + }, + }, + }) + end) + + it('formats multiline question answers', function() + local message = { + info = { + id = 'msg_1', + role = 'assistant', + sessionID = 'ses_1', + }, + parts = {}, + } + + local part = { + id = 'prt_1', + type = 'tool', + tool = 'question', + messageID = 'msg_1', + sessionID = 'ses_1', + state = { + status = 'completed', + input = { + questions = { + { + question = 'What should we do?', + header = 'Question', + options = {}, + }, + }, + }, + metadata = { + answers = { + { 'First line\nSecond line' }, + }, + }, + time = { + start = 1, + ['end'] = 2, + }, + }, + } + + local output = formatter.format_part(part, message, true) + assert.are.equal('**A1:** First line', output.lines[4]) + assert.are.equal('Second line', output.lines[5]) + end) +end)