Skip to content

Commit 67078fa

Browse files
authored
fix(formatter): format multi-line question answer (#292)
1 parent 793dfa2 commit 67078fa

2 files changed

Lines changed: 68 additions & 1 deletion

File tree

lua/opencode/ui/formatter.lua

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,13 @@ function M._format_question_tool(output, input, metadata, status, duration_text)
647647
output:add_line(string.format('**Q%d:** %s', i, question_lines[1]))
648648
end
649649
local answer = answers[i] and answers[i][1] or 'No answer'
650-
output:add_line(string.format('**A%d:** %s', i, answer))
650+
local answer_lines = vim.split(answer, '\n', { plain = true })
651+
652+
output:add_line(string.format('**A%d:** %s', i, answer_lines[1]))
653+
for line_idx = 2, #answer_lines do
654+
output:add_line(answer_lines[line_idx])
655+
end
656+
651657
if i < #questions then
652658
output:add_line('')
653659
end

tests/unit/formatter_spec.lua

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
local assert = require('luassert')
2+
local config = require('opencode.config')
3+
local formatter = require('opencode.ui.formatter')
4+
5+
describe('formatter', function()
6+
before_each(function()
7+
config.setup({
8+
ui = {
9+
output = {
10+
tools = {
11+
show_output = true,
12+
},
13+
},
14+
},
15+
})
16+
end)
17+
18+
it('formats multiline question answers', function()
19+
local message = {
20+
info = {
21+
id = 'msg_1',
22+
role = 'assistant',
23+
sessionID = 'ses_1',
24+
},
25+
parts = {},
26+
}
27+
28+
local part = {
29+
id = 'prt_1',
30+
type = 'tool',
31+
tool = 'question',
32+
messageID = 'msg_1',
33+
sessionID = 'ses_1',
34+
state = {
35+
status = 'completed',
36+
input = {
37+
questions = {
38+
{
39+
question = 'What should we do?',
40+
header = 'Question',
41+
options = {},
42+
},
43+
},
44+
},
45+
metadata = {
46+
answers = {
47+
{ 'First line\nSecond line' },
48+
},
49+
},
50+
time = {
51+
start = 1,
52+
['end'] = 2,
53+
},
54+
},
55+
}
56+
57+
local output = formatter.format_part(part, message, true)
58+
assert.are.equal('**A1:** First line', output.lines[4])
59+
assert.are.equal('Second line', output.lines[5])
60+
end)
61+
end)

0 commit comments

Comments
 (0)