Skip to content

Commit 9fd9094

Browse files
authored
fix(renderer): keep interactive prompts visible with max_messages (#482) (#486)
1 parent 71b3397 commit 9fd9094

2 files changed

Lines changed: 97 additions & 1 deletion

File tree

‎lua/opencode/ui/renderer.lua‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ local scroll = require('opencode.ui.renderer.scroll')
1313
local M = {}
1414
local HIDDEN_MESSAGES_NOTICE_MESSAGE_ID = '__opencode_hidden_messages_notice__'
1515
local HIDDEN_MESSAGES_NOTICE_PART_ID = '__opencode_hidden_messages_notice_part__'
16+
local PERMISSION_DISPLAY_MESSAGE_ID = 'permission-display-message'
17+
local QUESTION_DISPLAY_MESSAGE_ID = 'question-display-message'
1618

1719
local LAZYRENDER_EST_LINES_PER_MSG = 5
1820
local LAZYRENDER_VIEWPORT_BUFFER = 1.5
@@ -44,7 +46,10 @@ end
4446
---@return boolean
4547
local function is_renderer_synthetic_message(message)
4648
local message_id = message and message.info and message.info.id
47-
return message_id == '__opencode_revert_message__' or message_id == HIDDEN_MESSAGES_NOTICE_MESSAGE_ID
49+
return message_id == '__opencode_revert_message__'
50+
or message_id == HIDDEN_MESSAGES_NOTICE_MESSAGE_ID
51+
or message_id == PERMISSION_DISPLAY_MESSAGE_ID
52+
or message_id == QUESTION_DISPLAY_MESSAGE_ID
4853
end
4954

5055
---@param message OpencodeMessage|nil

‎tests/replay/renderer_spec.lua‎

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,97 @@ describe('renderer unit tests', function()
715715
config.ui.output.max_messages = nil
716716
end)
717717

718+
describe('interactive displays with max_messages', function()
719+
local function make_message(id, text, timestamp)
720+
return {
721+
info = {
722+
id = id,
723+
role = 'assistant',
724+
sessionID = 'ses_123',
725+
time = { created = timestamp },
726+
},
727+
parts = {
728+
{
729+
id = id .. '_part',
730+
messageID = id,
731+
sessionID = 'ses_123',
732+
type = 'text',
733+
text = text,
734+
},
735+
},
736+
}
737+
end
738+
739+
local function add_message(events, id, text, timestamp)
740+
local message = make_message(id, text, timestamp)
741+
events.on_message_updated({ info = message.info })
742+
events.on_part_updated({ part = message.parts[1] })
743+
end
744+
745+
before_each(function()
746+
helpers.replay_setup()
747+
config.ui.output.max_messages = 2
748+
state.session.set_active({ id = 'ses_123', title = 'Session' })
749+
end)
750+
751+
after_each(function()
752+
config.ui.output.max_messages = nil
753+
if state.windows then
754+
ui.close_windows(state.windows)
755+
end
756+
end)
757+
758+
it('keeps permission displays visible after later messages', function()
759+
local renderer = require('opencode.ui.renderer')
760+
local events = require('opencode.ui.renderer.events')
761+
local flush = require('opencode.ui.renderer.flush')
762+
763+
renderer._render_full_session_data({ make_message('msg_1', 'first', 1), make_message('msg_2', 'second', 2) })
764+
events.on_permission_updated({
765+
id = 'perm_1',
766+
sessionID = 'ses_123',
767+
permission = 'bash',
768+
title = 'Run command',
769+
})
770+
add_message(events, 'msg_3', 'third', 3)
771+
add_message(events, 'msg_4', 'fourth', 4)
772+
flush.flush()
773+
774+
assert.is_not_nil(renderer.get_rendered_message('permission-display-message'))
775+
assert.is_truthy(
776+
table.concat(vim.api.nvim_buf_get_lines(state.windows.output_buf, 0, -1, false), '\n')
777+
:find('Permission Required', 1, true)
778+
)
779+
end)
780+
781+
it('keeps question displays visible after later messages', function()
782+
local renderer = require('opencode.ui.renderer')
783+
local events = require('opencode.ui.renderer.events')
784+
local flush = require('opencode.ui.renderer.flush')
785+
786+
renderer._render_full_session_data({ make_message('msg_1', 'first', 1), make_message('msg_2', 'second', 2) })
787+
events.on_question_asked({
788+
id = 'question_1',
789+
sessionID = 'ses_123',
790+
questions = {
791+
{
792+
question = 'Pick one',
793+
options = { { label = 'One' } },
794+
},
795+
},
796+
})
797+
add_message(events, 'msg_3', 'third', 3)
798+
add_message(events, 'msg_4', 'fourth', 4)
799+
flush.flush()
800+
801+
assert.is_not_nil(renderer.get_rendered_message('question-display-message'))
802+
assert.is_truthy(
803+
table.concat(vim.api.nvim_buf_get_lines(state.windows.output_buf, 0, -1, false), '\n')
804+
:find('Question', 1, true)
805+
)
806+
end)
807+
end)
808+
718809
it('ignores session.updated for non-active session IDs', function()
719810
local renderer = require('opencode.ui.renderer')
720811

0 commit comments

Comments
 (0)