Skip to content

Commit de5d6b7

Browse files
committed
refactor(question-window): replace question picker
- Replace question picker with a custom dialog in the chat window
1 parent 6940ea6 commit de5d6b7

18 files changed

Lines changed: 1355 additions & 190 deletions

lua/opencode/api.lua

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -935,6 +935,21 @@ function M.permission_deny(permission)
935935
M.respond_to_permission('reject', permission)
936936
end
937937

938+
function M.question_answer()
939+
local question_window = require('opencode.ui.question_window')
940+
local question_info = question_window.get_current_question_info()
941+
if question_info and question_info.options and question_info.options[1] then
942+
question_window._answer_with_option(1)
943+
end
944+
end
945+
946+
function M.question_other()
947+
local question_window = require('opencode.ui.question_window')
948+
if question_window.has_question() then
949+
question_window._answer_with_custom()
950+
end
951+
end
952+
938953
function M.toggle_tool_output()
939954
local action_text = config.ui.output.tools.show_output and 'Hiding' or 'Showing'
940955
vim.notify(action_text .. ' tool output display', vim.log.levels.INFO)

lua/opencode/types.lua

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,8 @@
208208
---@field quick_chat OpencodeQuickChatConfig
209209

210210
---@class MessagePartState
211-
---@field input TaskToolInput|BashToolInput|FileToolInput|TodoToolInput|GlobToolInput|GrepToolInput|WebFetchToolInput|ListToolInput Input data for the tool
212-
---@field metadata TaskToolMetadata|ToolMetadataBase|WebFetchToolMetadata|BashToolMetadata|FileToolMetadata|GlobToolMetadata|GrepToolMetadata|ListToolMetadata Metadata about the tool execution
211+
---@field input TaskToolInput|BashToolInput|FileToolInput|TodoToolInput|GlobToolInput|GrepToolInput|WebFetchToolInput|ListToolInput|QuestionToolInput Input data for the tool
212+
---@field metadata TaskToolMetadata|ToolMetadataBase|WebFetchToolMetadata|BashToolMetadata|FileToolMetadata|GlobToolMetadata|GrepToolMetadata|ListToolMetadata|QuestionToolMetadata Metadata about the tool execution
213213
---@field time { start: number, end: number } Timestamps for tool use
214214
---@field status string Status of the tool use (e.g., 'running', 'completed', 'failed')
215215
---@field title string Title of the tool use
@@ -307,6 +307,13 @@
307307
---@field questions OpencodeQuestionInfo[] Questions to ask
308308
---@field tool? { messageID: string, callID: string }
309309

310+
---@class QuestionToolInput
311+
---@field questions OpencodeQuestionInfo[] Questions that were asked
312+
313+
---@class QuestionToolMetadata: ToolMetadataBase
314+
---@field answers string[][] Array of answer arrays (one per question)
315+
---@field truncated boolean Whether the results were truncated
316+
310317
---@class MessageTokenCount
311318
---@field reasoning number
312319
---@field input number

lua/opencode/ui/formatter.lua

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,6 +608,30 @@ function M._format_list_tool(output, input, metadata, tool_output)
608608
end
609609
end
610610

611+
---@param output Output Output object to write to
612+
---@param input QuestionToolInput Question tool input data
613+
---@param metadata QuestionToolMetadata Question tool metadata
614+
---@param status string Status of the tool execution
615+
function M._format_question_tool(output, input, metadata, status)
616+
M.format_action(output, icons.get('question') .. ' question', '')
617+
output:add_empty_line()
618+
if not config.ui.output.tools.show_output or status ~= 'completed' then
619+
return
620+
end
621+
622+
local questions = input and input.questions or {}
623+
local answers = metadata and metadata.answers or {}
624+
625+
for i, question in ipairs(questions) do
626+
output:add_line(string.format('**Q%d:** %s', i, question.question or question.header or ''))
627+
local answer = answers[i] and answers[i][1] or 'No answer'
628+
output:add_line(string.format('**A%d:** %s', i, answer))
629+
if i < #questions then
630+
output:add_line('')
631+
end
632+
end
633+
end
634+
611635
---@param output Output Output object to write to
612636
---@param part OpencodeMessagePart
613637
function M._format_tool(output, part)
@@ -637,6 +661,13 @@ function M._format_tool(output, part)
637661
M._format_webfetch_tool(output, input --[[@as WebFetchToolInput]])
638662
elseif tool == 'task' then
639663
M._format_task_tool(output, input --[[@as TaskToolInput]], metadata --[[@as TaskToolMetadata]], tool_output)
664+
elseif tool == 'question' then
665+
M._format_question_tool(
666+
output,
667+
input --[[@as QuestionToolInput]],
668+
metadata --[[@as QuestionToolMetadata]],
669+
part.state.status
670+
)
640671
else
641672
M.format_action(output, icons.get('tool') .. ' tool', tool)
642673
end
@@ -849,6 +880,10 @@ function M.format_part(part, message, is_last_part)
849880
if part.type == 'permissions-display' then
850881
permission_window.format_display(output)
851882
content_added = true
883+
elseif part.type == 'questions-display' then
884+
local question_window = require('opencode.ui.question_window')
885+
question_window.format_display(output)
886+
content_added = true
852887
end
853888
end
854889

lua/opencode/ui/highlight.lua

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ function M.setup()
4040
vim.api.nvim_set_hl(0, 'OpencodeReference', { fg = '#1976D2', default = true })
4141
vim.api.nvim_set_hl(0, 'OpencodeReasoningText', { link = 'Comment', default = true })
4242
vim.api.nvim_set_hl(0, 'OpencodePermissionTitle', { fg = '#FF9E3B', default = true })
43+
vim.api.nvim_set_hl(0, 'OpencodeQuestionOption', { link = 'Normal', default = true })
44+
vim.api.nvim_set_hl(0, 'OpencodeQuestionOptionHover', { bg = '#E3F2FD', fg = '#1976D2', default = true })
45+
vim.api.nvim_set_hl(0, 'OpencodeQuestionBorder', { fg = '#E3F2FD', default = true })
46+
vim.api.nvim_set_hl(0, 'OpencodeQuestionTitle', { link = '@label', bold = true, default = true })
4347
else
4448
vim.api.nvim_set_hl(0, 'OpencodeBorder', { fg = '#616161', default = true })
4549
vim.api.nvim_set_hl(0, 'OpencodeBackground', { link = 'Normal', default = true })
@@ -76,6 +80,10 @@ function M.setup()
7680
vim.api.nvim_set_hl(0, 'OpencodeReference', { fg = '#7AA2F7', default = true })
7781
vim.api.nvim_set_hl(0, 'OpencodeReasoningText', { link = 'Comment', default = true })
7882
vim.api.nvim_set_hl(0, 'OpencodePermissionTitle', { fg = '#FF9E3B', default = true })
83+
vim.api.nvim_set_hl(0, 'OpencodeQuestionOption', { link = 'Normal', default = true })
84+
vim.api.nvim_set_hl(0, 'OpencodeQuestionOptionHover', { bg = '#2B3A5A', fg = '#61AFEF', default = true })
85+
vim.api.nvim_set_hl(0, 'OpencodeQuestionBorder', { fg = '#2B3A5A', default = true })
86+
vim.api.nvim_set_hl(0, 'OpencodeQuestionTitle', { link = '@label', bold = true, default = true })
7987
end
8088
end
8189

lua/opencode/ui/question_picker.lua

Lines changed: 0 additions & 181 deletions
This file was deleted.

0 commit comments

Comments
 (0)