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
11 changes: 10 additions & 1 deletion lua/opencode/api_client.lua
Original file line number Diff line number Diff line change
Expand Up @@ -385,7 +385,7 @@ end
--- Respond to a permission request
--- @param id string Session ID (required)
--- @param permissionID string Permission ID (required)
--- @param response_data {response: "once"|"always"|"reject"} Response data
--- @param response_data {response: "once"|"always"|"reject", message?: string} Response data
--- @param directory string|nil Directory path
--- @return Promise<boolean>
function OpencodeApiClient:respond_to_permission(id, permissionID, response_data, directory)
Expand All @@ -397,6 +397,15 @@ function OpencodeApiClient:respond_to_permission(id, permissionID, response_data
)
end

--- Reply to a permission (accept/reject)
--- @param requestID string Permission request ID (prefixed with "per")
--- @param response_data {reply: "once"|"always"|"reject", message?: string} Response data
--- @param directory string|nil Directory path
--- @return Promise<boolean>
function OpencodeApiClient:reply_to_permission(requestID, response_data, directory)
return self:_call('/permission/' .. requestID .. '/reply', 'POST', response_data, { directory = directory })
end

--- List all commands
--- @param directory string|nil Directory path
--- @return Promise<OpencodeCommand[]>
Expand Down
14 changes: 10 additions & 4 deletions lua/opencode/commands/handlers/permission.lua
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ end

---@param answer? 'once'|'always'|'reject'
---@param permission? OpencodePermission
function M.actions.respond_to_permission(answer, permission)
function M.actions.respond_to_permission(answer, permission, message)
answer = answer or 'once'

local permission_window = require('opencode.ui.permission_window')
Expand All @@ -27,8 +27,13 @@ function M.actions.respond_to_permission(answer, permission)
return
end

local data = { reply = answer }
if message and message ~= '' then
data.message = message
end

state.api_client
:respond_to_permission(current_permission.sessionID, current_permission.id, { response = answer })
:reply_to_permission(current_permission.id, data)
:catch(function(err)
vim.schedule(function()
vim.notify('Failed to reply to permission: ' .. vim.inspect(err), vim.log.levels.ERROR)
Expand All @@ -47,8 +52,9 @@ function M.actions.permission_accept_all(permission)
end

---@param permission? OpencodePermission
function M.actions.permission_deny(permission)
M.actions.respond_to_permission('reject', permission)
---@param message? string
function M.actions.permission_deny(permission, message)
M.actions.respond_to_permission('reject', permission, message)
end

function M.actions.question_answer()
Expand Down
2 changes: 1 addition & 1 deletion lua/opencode/services/session_runtime.lua
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ M.cancel = Promise.async(function()
local permissions = state.pending_permissions or {}
if #permissions > 0 and state.api_client then
for _, permission in ipairs(permissions) do
state.api_client:respond_to_permission(permission.sessionID, permission.id, { response = 'reject' })
state.api_client:reply_to_permission(permission.id, { reply = 'reject' })
end
end

Expand Down
20 changes: 14 additions & 6 deletions lua/opencode/ui/dialog.lua
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
---@field keymaps? DialogKeymaps Custom keymap configuration
---@field namespace_prefix? string Prefix for vim.on_key namespace (default: 'opencode_dialog')
---@field hide_input? boolean Whether to hide the input window when dialog is active (default: true)
---@field show_dismiss_legend? boolean Whether to render the generic dismiss hint (default: true)

---@class DialogKeymaps
---@field up? string[] Keys for navigating up (default: {'k', '<Up>'})
Expand Down Expand Up @@ -58,10 +59,11 @@ function Dialog.new(config)
self._config = vim.tbl_deep_extend('force', {
keymaps = default_keymaps,
namespace_prefix = 'opencode_dialog',
check_focused = function()
return true
end,
hide_input = true,
check_focused = function()
return true
end,
hide_input = true,
show_dismiss_legend = true,
} --[[@as DialogConfig]], config)

self._keymaps = {}
Expand Down Expand Up @@ -292,9 +294,15 @@ function Dialog:format_legend(output, options)
output:add_line(select_text)
end

if keymaps.dismiss and keymaps.dismiss ~= '' then
if self._config.show_dismiss_legend and keymaps.dismiss and keymaps.dismiss ~= '' then
output:add_line('Close: `<Esc>`')
end

if options.legend_lines then
for _, line in ipairs(options.legend_lines) do
output:add_line(line)
end
end
else
local message = options.unfocused_message or 'Focus Opencode window to interact'
output:add_line(message)
Expand Down Expand Up @@ -346,7 +354,7 @@ function Dialog:format_dialog(output, config)

output:add_line('')

self:format_legend(output, { unfocused_message = config.unfocused_message })
self:format_legend(output, { unfocused_message = config.unfocused_message, legend_lines = config.legend_lines })

local end_line = output:get_line_count()

Expand Down
Loading
Loading