1+ --- Waits for user to be idle (no keypresses) for `timeout` milliseconds, then calls `callback`.
2+ --- @param callback function Function to call when user is idle.
3+ --- @param timeout number Time in milliseconds to wait for idle.
4+ local function wait_for_user_idle (callback , timeout )
5+ local idle_timer = vim .uv .new_timer ()
6+ local key_listener_id = nil
7+
8+ local function on_idle ()
9+ idle_timer :stop ()
10+ idle_timer :close ()
11+ vim .on_key (nil , key_listener_id )
12+
13+ callback ()
14+ end
15+
16+ local function reset_idle_timer ()
17+ idle_timer :stop ()
18+ idle_timer :start (timeout , 0 , vim .schedule_wrap (on_idle ))
19+ end
20+
21+ key_listener_id = vim .on_key (function ()
22+ reset_idle_timer ()
23+ end )
24+
25+ -- Start the initial timer
26+ reset_idle_timer ()
27+ end
28+
129local is_permission_request_open = false
230vim .api .nvim_create_autocmd (" User" , {
331 group = vim .api .nvim_create_augroup (" OpencodePermissions" , { clear = true }),
432 pattern = " OpencodeEvent" ,
533 callback = function (args )
34+ if not require (" opencode.config" ).opts .permissions .enabled then
35+ return
36+ end
37+
638 local event = args .data .event
739 --- @type number
840 local port = args .data .port
941
1042 if event .type == " permission.updated" then
1143 --[[
12- -- {
44+ `event.properties` example: {
1345 callID = "call_UgJGOepAJ5vQ7rkfGI5LNTaQ",
1446 id = "per_9fe806323001XBhIAz9OrYTrgl",
1547 messageID = "msg_9fe805f7700166572ZsmpxllBH",
@@ -26,20 +58,29 @@ vim.api.nvim_create_autocmd("User", {
2658 type = "bash"
2759 }
2860 --]]
29- is_permission_request_open = true
30- vim .ui .select ({ " Once" , " Always" , " Reject" }, {
31- prompt = ' opencode requesting permission: "' .. event .properties .title .. ' ": ' ,
32- format_item = function (item )
33- return item
34- end ,
35- }, function (choice )
36- is_permission_request_open = false
37- if choice then
38- local session_id = event .properties .sessionID
39- local permission_id = event .properties .id
40- require (" opencode.cli.client" ).permit (port , session_id , permission_id , choice :lower ())
41- end
42- end )
61+
62+ local idle_delay_ms = require (" opencode.config" ).opts .permissions .idle_delay_ms
63+ vim .notify (
64+ " `opencode` requested permission — awaiting idle…" ,
65+ vim .log .levels .INFO ,
66+ { title = " opencode" , timeout = idle_delay_ms }
67+ )
68+ wait_for_user_idle (function ()
69+ is_permission_request_open = true
70+ vim .ui .select ({ " Once" , " Always" , " Reject" }, {
71+ prompt = ' opencode requesting permission: "' .. event .properties .title .. ' ": ' ,
72+ format_item = function (item )
73+ return item
74+ end ,
75+ }, function (choice )
76+ is_permission_request_open = false
77+ if choice then
78+ local session_id = event .properties .sessionID
79+ local permission_id = event .properties .id
80+ require (" opencode.cli.client" ).permit (port , session_id , permission_id , choice :lower ())
81+ end
82+ end )
83+ end , idle_delay_ms )
4384 elseif event .type == " permission.replied" and is_permission_request_open then
4485 -- Close our permission dialog, in case user responded in the TUI
4586 -- TODO: Hmm, we don't seem to process the event while built-in select is open...
0 commit comments