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
10 changes: 9 additions & 1 deletion lua/opencode/ui/formatter.lua
Original file line number Diff line number Diff line change
Expand Up @@ -626,7 +626,15 @@ function M._format_question_tool(output, input, metadata, status)
local answers = metadata and metadata.answers or {}

for i, question in ipairs(questions) do
output:add_line(string.format('**Q%d:** %s', i, question.question or question.header or ''))
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'
output:add_line(string.format('**A%d:** %s', i, answer))
if i < #questions then
Expand Down
4 changes: 2 additions & 2 deletions lua/opencode/ui/question_window.lua
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ local function answer_current_question(answer_value)
M._setup_dialog()
end
render_question()

-- Use schedule to ensure UI updates happen after all state changes
vim.schedule(function()
require('opencode.ui.renderer').scroll_to_bottom(true)
Expand Down Expand Up @@ -174,7 +174,7 @@ function M.format_display(output)
title = icons.get('question') .. ' Question' .. progress,
title_hl = 'OpencodeQuestionTitle',
border_hl = 'OpencodeQuestionBorder',
content = { question_info.question },
content = vim.split(question_info.question, '\n'),
options = options,
unfocused_message = 'Focus Opencode window to answer question',
})
Expand Down
2 changes: 1 addition & 1 deletion tests/data/multiple-question-ask-reply-all.expected.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"lines":["----","","","[`tests/replay/renderer_spec.lua`](tests/replay/renderer_spec.lua)","","can you use the question tool and ask me a couple of questions","","----","","","** question** ","","**Q1:** Which Lua testing framework do you use or prefer for your Neovim Lua plugins?","**A1:** busted","","**Q2:** How do you usually run your tests in this codebase?","**A2:** run_tests.sh (Recommended)","","**󰻛 Created Snapshot** `be64b620`","","----","","","Thanks for your answers! You've indicated:","","- Preferred testing framework: **busted**","- Typical test running method: ** run_tests.sh (Recommended)**","","I have this in mind for any future testing, troubleshooting, or automation tasks you request for this Neovim Lua codebase. If you have any follow-up questions or tasks (such as test writing, modification, running, debugging, or reporting), let me know—I'll tailor my workflow to these preferences for maximal compatibility and consistency!","",""],"timestamp":1769438913,"actions":[{"type":"diff_revert_selected_file","key":"R","range":{"from":18,"to":18},"display_line":18,"args":["be64b6205f0da4c9240df2476dc35495429161b5"],"text":"[R]evert file"},{"type":"diff_revert_all","key":"A","range":{"from":18,"to":18},"display_line":18,"args":["be64b6205f0da4c9240df2476dc35495429161b5"],"text":"Revert [A]ll"},{"type":"diff_open","key":"D","range":{"from":18,"to":18},"display_line":18,"args":["be64b6205f0da4c9240df2476dc35495429161b5"],"text":"[D]iff"}],"extmarks":[[1,1,0,{"right_gravity":true,"priority":10,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2026-01-26 14:30:46)","OpencodeHint"],[" [msg_bfab6dbf3001ZOVHTFKR1CMUE5]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"ns_id":3}],[2,2,0,{"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"ns_id":3}],[3,3,0,{"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"ns_id":3}],[4,4,0,{"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"ns_id":3}],[5,5,0,{"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"ns_id":3}],[6,6,0,{"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text_win_col":-3,"ns_id":3}],[7,8,0,{"right_gravity":true,"priority":10,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" (2026-01-26 14:30:46)","OpencodeHint"],[" [msg_bfab6dc80001FueCN7E2691J2R]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"ns_id":3}],[8,10,0,{"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"ns_id":3}],[9,11,0,{"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"ns_id":3}],[10,12,0,{"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"ns_id":3}],[11,13,0,{"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"ns_id":3}],[12,14,0,{"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"ns_id":3}],[13,15,0,{"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"ns_id":3}],[14,16,0,{"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_repeat_linebreak":true,"virt_text_win_col":-1,"ns_id":3}],[15,21,0,{"right_gravity":true,"priority":10,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" (2026-01-26 14:31:55)","OpencodeHint"],[" [msg_bfab7e7fd0018kA9yLHMkJM3fA]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_hide":false,"virt_text_repeat_linebreak":false,"virt_text_win_col":-3,"ns_id":3}]]}
{"lines":["----","","","[`tests/replay/renderer_spec.lua`](tests/replay/renderer_spec.lua)","","can you use the question tool and ask me a couple of questions","","----","","","** question** ","","**Q1:** Which Lua testing framework do you use or prefer for your Neovim Lua plugins?","**A1:** busted","","**Q2:** How do you usually run your tests in this codebase?","**A2:** run_tests.sh (Recommended)","","**Q3:** multi-line question","The most important question of all:","Which team are you on?","**A3:** Coffee","","**󰻛 Created Snapshot** `be64b620`","","----","","","Thanks for your answers! You've indicated:","","- Preferred testing framework: **busted**","- Typical test running method: ** run_tests.sh (Recommended)**","","I have this in mind for any future testing, troubleshooting, or automation tasks you request for this Neovim Lua codebase. If you have any follow-up questions or tasks (such as test writing, modification, running, debugging, or reporting), let me know—I'll tailor my workflow to these preferences for maximal compatibility and consistency!","",""],"actions":[{"display_line":23,"range":{"from":23,"to":23},"type":"diff_revert_selected_file","args":["be64b6205f0da4c9240df2476dc35495429161b5"],"text":"[R]evert file","key":"R"},{"display_line":23,"range":{"from":23,"to":23},"type":"diff_revert_all","args":["be64b6205f0da4c9240df2476dc35495429161b5"],"text":"Revert [A]ll","key":"A"},{"display_line":23,"range":{"from":23,"to":23},"type":"diff_open","args":["be64b6205f0da4c9240df2476dc35495429161b5"],"text":"[D]iff","key":"D"}],"extmarks":[[1,1,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2026-01-26 14:30:46)","OpencodeHint"],[" [msg_bfab6dbf3001ZOVHTFKR1CMUE5]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10,"virt_text_repeat_linebreak":false}],[2,2,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"virt_text_repeat_linebreak":true}],[3,3,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"virt_text_repeat_linebreak":true}],[4,4,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"virt_text_repeat_linebreak":true}],[5,5,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"virt_text_repeat_linebreak":true}],[6,6,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":4096,"virt_text_repeat_linebreak":true}],[7,8,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" (2026-01-26 14:30:46)","OpencodeHint"],[" [msg_bfab6dc80001FueCN7E2691J2R]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10,"virt_text_repeat_linebreak":false}],[8,10,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[9,11,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[10,12,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[11,13,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[12,14,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[13,15,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[14,16,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[15,17,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[16,18,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[17,19,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[18,20,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[19,21,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[["▌","OpencodeToolBorder"]],"virt_text_pos":"win_col","virt_text_win_col":-1,"priority":4096,"virt_text_repeat_linebreak":true}],[20,26,0,{"ns_id":3,"virt_text_hide":false,"right_gravity":true,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-4.1","OpencodeHint"],[" (2026-01-26 14:31:55)","OpencodeHint"],[" [msg_bfab7e7fd0018kA9yLHMkJM3fA]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_win_col":-3,"priority":10,"virt_text_repeat_linebreak":false}]],"timestamp":1770681185}
2 changes: 1 addition & 1 deletion tests/data/multiple-question-ask-reply-all.json
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what do you think about formatting these input files? would make it easier to read them and compare the diff

Copy link
Owner

@sudo-tee sudo-tee Feb 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes this would be useful indeed

Large diffs are not rendered by default.