@@ -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