@@ -24,10 +24,14 @@ pub async fn inject_moim(
2424 . await
2525 {
2626 let mut messages = conversation. messages ( ) . clone ( ) ;
27- let idx = messages
28- . iter ( )
29- . rposition ( |m| m. role == Role :: Assistant )
30- . unwrap_or ( 0 ) ;
27+ let idx = if messages. last ( ) . is_some_and ( |m| m. role == Role :: Assistant ) {
28+ messages. len ( )
29+ } else {
30+ messages
31+ . iter ( )
32+ . rposition ( |m| m. role == Role :: Assistant )
33+ . unwrap_or ( 0 )
34+ } ;
3135 messages. insert ( idx, Message :: user ( ) . with_text ( moim) ) ;
3236
3337 let ( fixed, issues) = fix_conversation ( Conversation :: new_unvalidated ( messages) ) ;
@@ -104,6 +108,35 @@ mod tests {
104108 assert ! ( merged_content. contains( "Working directory: /test/dir" ) ) ;
105109 }
106110
111+ #[ tokio:: test]
112+ async fn test_moim_injection_trailing_assistant ( ) {
113+ let temp_dir = tempfile:: tempdir ( ) . unwrap ( ) ;
114+ let em = ExtensionManager :: new_without_provider ( temp_dir. path ( ) . to_path_buf ( ) ) ;
115+ let working_dir = PathBuf :: from ( "/test/dir" ) ;
116+
117+ let conv = Conversation :: new_unvalidated ( vec ! [
118+ Message :: user( ) . with_text( "Hello" ) ,
119+ Message :: assistant( ) . with_text( "Hi there" ) ,
120+ Message :: user( ) . with_text( "Do something" ) ,
121+ Message :: assistant( ) . with_text( "I'll do that now." ) ,
122+ ] ) ;
123+ let result = inject_moim ( "test-session-id" , conv, & em, & working_dir) . await ;
124+ let msgs = result. messages ( ) ;
125+
126+ assert_eq ! (
127+ msgs. last( ) . unwrap( ) . role,
128+ Role :: User ,
129+ "Conversation must end with a user message"
130+ ) ;
131+
132+ let has_moim = msgs. iter ( ) . any ( |m| {
133+ m. content
134+ . iter ( )
135+ . any ( |c| c. as_text ( ) . is_some_and ( |t| t. contains ( "<info-msg>" ) ) )
136+ } ) ;
137+ assert ! ( has_moim, "MOIM should be injected" ) ;
138+ }
139+
107140 #[ tokio:: test]
108141 async fn test_moim_with_tool_calls ( ) {
109142 let temp_dir = tempfile:: tempdir ( ) . unwrap ( ) ;
0 commit comments